Flink Native Kubernetes 的部署
(还在不断学习~欢迎指正)
部署前的准备
1、需要确认k8s namespace及相关权限,这里采用单独的 flink 服务账户和namespace用来部署flink job
# 设置专属的namespace--flinkjob
kubectl create namespace flinkjob
# 创建一个新的 flink服务账户(flink)
kubectl create serviceaccount flink -n flinkjob
# 设置角色绑定
kubectl create clusterrolebinding flink-role-binding-flink --clusterrole=edit --serviceaccount=flinkjob:flink
2、下载对应版本的Flink压缩包并解压,下列操作都是在对应目标下指定的(也可以配置成环境变量)
Session 模式
Session mode是先创建一个集群,然后后续的提交都在这个集群中运行,会存在资源竞争的情况,并且不好单独管理各个任务资源的分配。
1、启动指令:
需要主要的是需要指定namespace 和 service-account 为之前设置的特定环境下,cluster-id用来标示集群名。其他参数可以选择在config.flink-conf.yaml文件中设定,也可以像下面进行特殊指定。相关参数参考
因为我这边采用的任务提交是在页面上进行提交,所有kubernetes.rest-service.exposed.type 设定的NodePort,可以通过访问创建好的指定端口进行访问、或者手动更改为特定端口(ps:我还不知道如何在启动前指定端口,所有就每次启动后再去改的端口号)
./bin/kubernetes-session.sh \
-Dkubernetes.namespace=flinkjob \
-Dkubernetes.jobmanager.service-account=flink \
-Dkubernetes.cluster-id=session-track \
-Dtaskmanager.memory.process.size=1024m \
-Dkubernetes.jobmanager.cpu=0.2 \
-Dkubernetes.taskmanager.cpu=0.2 \
-Dtaskmanager.numberOfTaskSlots=1 \
-Dkubernetes.rest-service.exposed.type=NodePort \
-Dresourcemanager.taskmanager-timeout=3600000
2、集群启动后
# 查看启动的pod
kubectl get pod -n flinkjob
# 查看启动的svc
kubectl get svc -n flinkjob
# 更改rest 端口号,更换里面NodePort参数
kubectl edit svc session-track-rest -n flinkjob
然后就可以在对应端口页面上进行任务提交和相关查看了
3、任务cance / savepoint/ 集群stop
# 任务cancel 并保存savepoint;127.0.0.1:30016 为集群对应地址(我这里在flink-config.yml中指定了savepoint的默认地址,所用就用-s 可以了)
./bin/flink cancel -m 127.0.0.1:30016 -s <job-id>
./bin/flink cancel -m 127.0.0.1:30016 -s /tmp/savepoint <job-id>
# 不保存savepoint
./bin/flink cancel -m 127.0.0.1:30016 <job-id>
# 停止整个集群
echo 'stop' | ./bin/kubernetes-session.sh -Dkubernetes.cluster-id=session-track -Dkubernetes.namespace=flinkjob -Dexecution.attached=true
Application Mode部署模式
Application mode 是为每个应用程序创建一个集群,并在应用程序完成时销毁。
1、构造flink-job 镜像
Dockerfile
FROM flink:1.11.1-scala_2.12
RUN mkdir -p /flink/flink-jobs
COPY ./flink-jobs/target/*.jar /flink/flink-jobs/flink-jobs.jar
构建镜像,push
docker build -t ***/flink-jobs:git.$1 -f Dockerfile .
docker push ***/flink-jobs:git.$1
2、启动
./bin/flink run-application -p 1 -t kubernetes-application \
--detached \
--allowNonRestoredState \ # 从指定savepoint启动,不需要时可省略掉
--fromSavepoint oss://flinkjob-state-prod/savepoint-f1e2d7-3108369d7445 \ # 从指定savepoint启动不需要时可省略掉
-Dkubernetes.namespace=flinkjob \
-Dkubernetes.jobmanager.service-account=flink \
-Dkubernetes.cluster-id=flink-jobs \
-Dkubernetes.container.image.pull-policy=Always \
-Dkubernetes.container.image=*****/flink-jobs:git.c2f4bba9ffbc26a077ae73d8508fcce0e05752ed \ # 对应镜像地址
-Djobmanager.memory.process.size=1024m \
-Dtaskmanager.memory.process.size=1024m \
-Dkubernetes.jobmanager.cpu=0.2 \
-Dkubernetes.taskmanager.cpu=0.1 \
-Dtaskmanager.numberOfTaskSlots=1 \
-Dkubernetes.rest-service.exposed.type=NodePort \
local:///flink/flink-jobs/flink-jobs.jar # 镜像需要执行的jar地址
3、job savepoint / stop
# 查看当前集群任务id
./bin/flink list --target kubernetes-application -Dkubernetes.cluster-id=flink-jobs -Dkubernetes.namespace=flinkjob
# stop 任务并进行状态savepoint
./bin/flink stop --savepointPath --target kubernetes-application -Dkubernetes.cluster-id=flink-production -Dkubernetes.namespace=flinkjob <job-id>
# stop集
echo 'stop' | ./bin/kubernetes-session.sh -Dkubernetes.cluster-id=flink-production -Dkubernetes.namespace=flinkjob -Dexecution.attached=true