k8s部署spark集群

1、构建打包镜像
k8s部署spark集群_第1张图片
打包镜像相关文件地址:链接:https://pan.baidu.com/s/1OoBuEVcCNjsYZKqBTCMWaw
提取码:ct16
进入目录,执行
docker build . -t wyx/spark:2.4.4
2、推送镜像到镜像仓库
进入harbor界面,项目-新建项目-新建wyxx项目
docker tag dc45b9403697 10.0.3.47:5000/wyx/spark:2.4.4
docker push 10.0.3.47:5000/wyx/spark:2.4.4
输出以下代表成功命令

在这里插入图片描述

k8s部署spark集群_第2张图片

基于kubernetes部署的两种方式
直接使用kubernetes作为集群管理器(Cluster Manager),类似与mesos和yarn,使用方式可以看running-on-kubernetes。但是这个部署方式,一是还不成熟,不推荐在生产环境使用。第二是要求k8s版本大于1.6,但我这边版本1.5.1,线上在用,不太想升级,而spark只是想搭起来玩玩…
第二种方式是standalone的方式,即便是不用集群也能很方便的用sbin下的脚本来部署,不过使用k8s有几个好处,一个是提高机器使用率。这边的k8s集群大部分是在白天使用,晚上空闲,刚好能拿来跑数据。二是方便一键扩容,一键升级,能复用本身在k8s集群上做好的监控以及日志收集

以下内容主要依据github 上k8s example中spark的例子
https://github.com/kubernetes/examples/blob/master/staging/spark/README.md
1、namespace
为了方便管理,还是新建一个namespace,将所有的相关的都放在这个namespace下,方便资源管理。
apiVersion: v1
kind: Namespace
metadata:
name: “spark-cluster”
labels:
name: “spark-cluster”
kubectl create -f namespace-spark-cluster.yaml 新建一个名为spark-cluster的namespace。
2、构建spark-master-controller.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: spark-master-controller
spec:
replicas: 1
selector:
component: spark-master
template:
metadata:
labels:
component: spark-master
spec:
hostname: spark-master-hostname
subdomain: spark-master-headless
containers:

  • name: spark-master
    image: registry.cn-hangzhou.aliyuncs.com/xujunkai/spark:2.4.4
    imagePullPolicy: Always
    command: [“/start-master”]
    ports:
  • containerPort: 7077
  • containerPort: 8080
    resources:
    requests:
    cpu: 100m

执行命令kubectl apply -f spark-master-controller.yaml --namespace=spark-cluster
3、构建spark-master-service.yaml
kind: Service
apiVersion: v1
metadata:
name: spark-master
spec:
ports:

  • port: 7077
    targetPort: 7077
    name: spark
  • port: 8080
    targetPort: 8080
    name: http
    selector:
    component: spark-master
    执行命令:kubectl apply -f spark-master-service.yaml --namespace=spark-cluster
    一个service,把7077端口和8080端口暴露出来给集群,方便slaver直接用spk-master:8080这样的方式进行访问。注意,只是暴露给集群,外部访问的方式最后会说。
    4、构建spark-worker-controller.yaml
    kind: ReplicationController
    apiVersion: v1
    metadata:
    name: spark-worker-controller
    spec:
    replicas: 2
    selector:
    component: spark-worker
    template:
    metadata:
    labels:
    component: spark-worker
    spec:
    containers:
  • name: spark-worker
    image: registry.cn-hangzhou.aliyuncs.com/xujunkai/spark:2.4.4
    imagePullPolicy: Always
    command: [“/start-worker”]
    ports:
  • containerPort: 8081
    resources:
    requests:
    cpu: 100m
    执行命令:kubectl create -f spark-worker-controller.yaml —namespace=spark-cluster
    启动worker脚本中需要传入master的地址,因为有dns且设置了service的缘故,可以通过spk-master.spark-cluster访问。把replicas设置为N即可启动N个worker。另外,我还在worker上加了资源的限制,限制最多使用2个cpu以及12g内存。

proxy
image为elsonrodriguez/spark-ui-proxy:1.0 这玩意在一般启动standalone集群的时候是没有的,但是在k8s集群里边,则必不可缺。
设想一下,如果只是简单的暴露master的8080端口出来,我们只能看到master的管理页面,但是进一步从master访问worker的ui则变得不太现实(每个worker都有自己的ui地址,且ip分配很随机,这些ip只能在集群内部访问)。所以我们需要一个代理服务,从内部访问完我们需要的页面后,返回给我们,这样我们只需要暴露一个代理的地址即可。
5、构建spark-ui-proxy-controller.yaml
kind: ReplicationController
apiVersion: v1
metadata:
name: spark-ui-proxy-controller
spec:
replicas: 1
selector:
component: spark-ui-proxy
template:
metadata:
labels:
component: spark-ui-proxy
spec:
containers:

  • name: spark-ui-proxy
    image: elsonrodriguez/spark-ui-proxy:1.0
    ports:
  • containerPort: 80
    resources:
    requests:
    cpu: 100m
    args:
  • spk-master:8080
    livenessProbe:
    httpGet:
    path: /
    port: 80
    initialDelaySeconds: 120
    timeoutSeconds: 5
    执行命令:kubectl create -f spark-ui-proxy-controller.yaml —namespace=spark-cluster
    6、构建spark-ui-proxy-service.yaml,暴露proxy的80端口
    kind: Service
    apiVersion: v1
    metadata:
    name: spark-ui-proxy
    spec:
    type: NodePort
    ports:
  • port: 80
    targetPort: 80
    nodePort: 32180
    selector:
    component: spark-ui-proxy
    执行命令:kubectl create -f spark-ui-proxy-service.yaml —namespace=spark-cluster
    查看pod命令:kubectl get pods --all-namespaces 显示如下
    在这里插入图片描述

查看svc命令:kubectl get svc --all-namespaces 显示如下
在这里插入图片描述

外部机器浏览器输入 http://ip:32180 显示如下
http://ip:32180/proxy:spark-master:8080
k8s部署spark集群_第3张图片

参考文档:
https://www.cnblogs.com/xujunkai/p/14900417.html

https://blog.csdn.net/lixinkuan328/article/details/104528182/

https://github.com/kubernetes/examples/blob/master/staging/spark/README.md

你可能感兴趣的:(spark,kubernetes,docker)