简介
本篇博客为大家讲解下如何在Kubernetes集群部署Flink standalone集群。
准备材料
Flink镜像
首先需要制作一个Flink镜像,具体方法请看Flink in docker 部署。
Flink conf文件
下载Flink的二进制软件包,解压其中的conf
目录到任意目录即可。
配置K8s资源对象
创建ConfigMap
首先修改conf/flink-conf.yaml
,修改jobmanager.rpc.address
,如下所示:
jobmanager.rpc.address: flink-jm-rpc-service
其中flink-jm-rpc-service
为后续需要创建的service名称。这个service创建之后,k8s会为我们创建一个同名的DNS条目。我们使用这条DNS可以访问到Flink的job manager。
接下来执行这条命令,将conf
目录下所有文件内容创建为一个config map,名字为flink-config
:
kubectl create configmap flink-config --from-file=./conf
创建Job manager和Task manager的deployment
Job manager的Deployment如下所示。需要注意的是这里replica设置为1,flink-conf
的内容作为数据卷,挂载到/flink-1.9.2/conf
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: flink-jobmanager
labels:
app: flink
spec:
replicas: 1
selector:
matchLabels:
app: flink
role: jobmanager
template:
metadata:
labels:
app: flink
role: jobmanager
spec:
containers:
- name: flink
image: paul8263/flink-1.9.2:1.9.2
args: ["jobmanager"]
ports:
- name: web-port
containerPort: 8081
volumeMounts:
- name: flink-config-volume
mountPath: /flink-1.9.2/conf
volumes:
- name: flink-config-volume
configMap:
name: flink-config
同理,下面是Task manager的Deployment。这里我们设定replica为3,即启动3个task manager。
apiVersion: apps/v1
kind: Deployment
metadata:
name: flink-taskmanager
labels:
app: flink
role: taskmanager
spec:
replicas: 3
selector:
matchLabels:
app: flink
template:
metadata:
labels:
app: flink
spec:
containers:
- name: flink
image: paul8263/flink-1.9.2:1.9.2
args: ["taskmanager"]
ports:
- name: web-port
containerPort: 8081
volumeMounts:
- name: flink-config-volume
mountPath: /flink-1.9.2/conf
volumes:
- name: flink-config-volume
configMap:
name: flink-config
完成yaml文件的编写之后使用如下命令:
kubectl apply -f 文件名.yaml
创建出这两个Deployment。
创建Job Manager RPC service
目前需要解决的是Task manager如何找到job manager。Job manager的pod会被k8s调度到任意的节点,这个结果是不可控的。因此,我们需要创建一个service,指向job manager这个pod。Kubenetes会自动创建一个DNS入口。这样一来,无论job manager调度到哪个节点上,它的IP如何变化,k8s自动帮我们更新,并通过DNS关联起来。我们的程序不用做任何修改。
下面编写这个service的描述文件,如下所示:
apiVersion: v1
kind: Service
metadata:
name: flink-jm-rpc-service
spec:
clusterIP: None
selector:
role: jobmanager
ports:
- protocol: TCP
port: 6123
targetPort: 6123
创建这个service之后,无论这个pod的IP怎么变化,我们可以通过flink-jm-rpc-service
这个DNS访问到job manager。
暴露Flink web端口到集群外
到目前为止,Flink集群实际上已经部署完毕,但是Flink的web界面只能在集群的容器内部访问,我们需要将这个端口暴露到集群外部。
该service的描述文件如下所示:
apiVersion: v1
kind: Service
metadata:
name: flink-web-service
spec:
selector:
app: flink
type: NodePort
ports:
- protocol: TCP
port: 8081
targetPort: 8081
nodePort: 30123
需要注意的是这个service使用了NodePort的方式,将service的8081端口暴露为节点的30123端口。
验证配置
执行kubectl get all
查看创建出的所有资源对象,可以看到类似如下的输出:
NAME READY STATUS RESTARTS AGE
pod/flink-jobmanager-6db8bb4999-hsblq 1/1 Running 0 155m
pod/flink-taskmanager-795bfc5fdc-bdlc4 1/1 Running 2 153m
pod/flink-taskmanager-795bfc5fdc-mkp7q 1/1 Running 2 153m
pod/flink-taskmanager-795bfc5fdc-z42pr 1/1 Running 2 153m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/flink-jm-rpc-service ClusterIP None <none> 6123/TCP 3h12m
service/flink-web-service NodePort 10.101.29.26 <none> 8081:30123/TCP 3h9m
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/flink-jobmanager 1/1 1 1 155m
deployment.apps/flink-taskmanager 3/3 3 3 153m
NAME DESIRED CURRENT READY AGE
replicaset.apps/flink-jobmanager-6db8bb4999 1 1 1 155m
replicaset.apps/flink-taskmanager-795bfc5fdc 3 3 3 153m
然后我们在浏览器访问k8s节点的30123端口,然后查看所有的Task manager。如下图所示:
Flink管理页面Task Managers列表Task manager的个数和状态均正常,Flink on Kubernetes部署完毕。
网友评论