Spark on k8s Operator 部署安装

1. 背景

受限于公司内网环境,无法构建梯子及部分网络策略,不能使用网络资源直接部署,需要手动编译安装

2. 环境准备

centos 7

Kubernetes > 1.18

helm > 3

KubeSphere > 3.0

git

harbor

golang(第4步可选)

3. 镜像编译

受限于内网网络环境及大陆网络情况,采用阿里云容器镜像服务-------海外机器构建镜像并拉取到本地,上传harbor

1) 编写spark基础镜像工程

vim Dockerfile

FROM gcr.io/spark-operator/spark:v3.0.0

:wq

2) 编写spark-operator基础镜像工程

vim Dockerfile

FROM gcr.io/spark-operator/spark-operator:v1beta2-1.2.0-3.0.0

:wq

3) 将上述两个dockerfile分别上传至github不同项目工程, eg:

①https://github.com/leihongyang/gcr.io-spark-operator-spark-v3.0.0

②https://github.com/leihongyang/gcr.io-spark-operator-spark-operator-v1beta2-1.2.0-3.0.0

4) 采用阿里云容器镜像服务海外构建

https://cr.console.aliyun.com/cn-hangzhou/instance/repositories

第一步,创建镜像仓库(仓库名称和摘要任意填);

在这里插入图片描述

第二步,选择github并绑定自己账号,从git仓库中找到之前的项目工程,创建

在这里插入图片描述

第三步,在刚刚的镜像仓库中构建规则,并勾选海外构建,立即构建

在这里插入图片描述

另一个镜像同样如此操作

5) 拉取镜像至本地,并修改tag上传至内网harbor

拉取操作如图

在这里插入图片描述

## 拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0
## 镜像更名,修改仓库
docker tag registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0 xxxxx:8000/spark-operator/spark:v3.0.0
## 推送镜像
docker push xxxxx:8000/spark-operator/spark:v3.0.0
## 删除老镜像
docker image rm registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark:1.0

4. spark-operator安装

1) 下载源码
git clone http://10.10.12.117/bigdata/spark-on-k8s-operator.git
cd spark-on-k8s-operator
2) 安装,有两种方式
① yaml 手动模式

​ a. 修改manifest/spark-operator.yaml文件中的image值为之前创建的spark-operator镜像

## 安装crd
kubectl apply -f manifest/crds
## 安装operator的服务账号与授权策略
kubectl apply -f manifest/spark-operator-rbac.yaml 
## 安装spark任务的服务账号与授权策略
kubectl apply -f manifest/spark-rbac.yaml 
## 安装spark-on-k8s-operator 
kubectl apply -f manifest/spark-operator.yaml
② helm chart模式

修改charts/spark-operator-charts/values.yaml文件中的image.repository值为harbor中的spark-operator镜像目录

## 修改相关镜像参数后
helm install -n spark spark charts/spark-operator-chart
3) 安装完成

可以看到启动了一个sparkoperator的deployment,伴随着sparkoperator pod,负责监听spark请求

# kubectl get pods -n spark
NAME                             READY   STATUS      RESTARTS   AGE
sparkoperator-7c57499f7b-6rwcf   1/1     Running     0          23s
4) 运行示例

运行官方自带示例

## 修改examples/spark-pi.yaml中的容器镜像为我们之前创建的spark镜像
## 如下所示, 主要修改spec.image 和 imagePullPolicy
## 其中,需要注意namespace和serviceAccount的对应关系,如果运行不成功,大概率是这两个导致的权限问题

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: spark
spec:
  type: Scala
  mode: cluster
  image: "xxxxx:8000/spark-operator/spark:v3.0.0"
  imagePullPolicy: IfNotPresent
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.0.0.jar"
  sparkVersion: "3.0.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.0.0
    serviceAccount: sparkoperator
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 2
    memory: "512m"
    labels:
      version: 3.0.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

然后运行kubectl执行创建任务

kubectl apply -f examples/spark-pi.yaml

查看结果

# kubectl get pods -n spark-operator 
NAME                             READY   STATUS      RESTARTS   AGE
spark-pi-driver                  0/1     Completed   0          2m
sparkoperator-7c57499f7b-6rwcf   1/1     Running     0          23m

# kubectl get sparkapplications -n spark-operator
NAME       AGE
spark-pi   2m

容器运行完毕,可以查看容器日志,了解任务详细情况

# kubectl logs spark-pi-driver -n spark-operator
...
...
...
Pi is roughly 3.140515702578513
...

## 在许多info日志中看到我们的输出结果

5. sparkctl编译(可选)

# 启用 Go Modules 功能
export GO111MODULE=on
# 配置 GOPROXY 环境变量
export GOPROXY=https://goproxy.io
# 或者
export GOPROXY=https://mirrors.aliyun.com/goproxy/
# 编译sparkctl工具
cd sparkctl && go build -o sparkctl && cp sparkctl /usr/bin/

这个工具是spark-operator在kubectl上的二次封装

更加规范化,简洁的查看spark任务生命周期

6. FAQ

问题1:

User "system:serviceaccount:sparknamespace:spark" cannot list resource "sparkapplications" in API group "sparkoperator.k8s.io" at the cluster scope

原因: sparknamespace 命名空间中的spark对这个api没有访问权限

解决:查看用户是否存在于这个命名空间中,查看用户是否绑定了clusterrole权限(需要edit,或者完全使用manifest下的授权策略)

问题2:只有driver启动,没有excutor执行

原因:一个可能是k8s apiserver未正常运行,一个是镜像有问题。

解决:在apiserver运行正常的情况下,检查spark task driver的日志,若command是spark-operator则是镜像使用错误,换成spark镜像,正确的command是spark-submit

7. 监控

## 需要额外获取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark_monitor:1.0
docker tag registry.cn-hangzhou.aliyuncs.com/leihongyang/gcr_spark_monitor:1.0 xxxxx:8000/spark-operator/spark:v3.0.0-gcs-prometheus
## 然后将运行的spark job中yaml的image从
## 		xxxxx:8000/spark-operator/spark:v3.0.0
## 改为
##		xxxxx:8000/spark-operator/spark:v3.0.0-gcs-prometheus
## 在spec下添加以下内容
============================
monitoring:
    exposeDriverMetrics: true
    exposeExecutorMetrics: true
    prometheus:
      jmxExporterJar: "/prometheus/jmx_prometheus_javaagent-0.11.0.jar"
      port: 8090
============================
## 重新apply

[root@k8s-master-1 spark-on-k8s-operator]# kubectl get pods -n spark-operator -o wide
NAME                               READY   STATUS    RESTARTS   AGE   IP              NODE           NOMINATED NODE   READINESS GATES
spark-pi-d457cb78fd3a5777-exec-1   1/1     Running   0          52s   179.10.196.4    k8s-master-1   <none>           <none>
spark-pi-driver                    1/1     Running   0          66s   179.10.69.244   k8s-worker-3   <none>           <none>
sparkoperator-7c57499f7b-6rwcf     1/1     Running   3          13d   179.10.140.6    k8s-worker-2   <none>           <none>

# curl 179.10.69.244:8090
...
## 获得的就是本次spark任务的运行时资源使用明细
  1/1     Running   0          66s   179.10.69.244   k8s-worker-3   <none>           <none>

sparkoperator-7c57499f7b-6rwcf 1/1 Running 3 13d 179.10.140.6 k8s-worker-2

curl 179.10.69.244:8090

获得的就是本次spark任务的运行时资源使用明细




Logo

开源、云原生的融合云平台

更多推荐