注意
:flink-1.10 版本的 native-k8s 还是实验版本,相关配置或客户端可能在未来变更。并且当前版本仅支持 session 模式
kubernetes.config.file
指定). 可以运行 kubectl auth can-i pods
来测试当前用户是否有相关权限。对 k8s 部署模式来说,官方目前只提供了 session 运行模式。 Job Cluster 模式正在开发中。
注意
:要确保 flink-conf.yaml
中的 env.java.home
配置被注释,否则无法启动成功!
# env.java.home: /usr/local/java
先在 k8s 上启动 Flink Session
# -Dkubernetes.container.image=localhost:5000/flink-1.10.0.1 指定镜像,如果不指定该配置,会使用默认配置的官方镜像(flink:latest)
# -Dkubernetes.jobmanager.service-account=flink 指定有 k8s 权限的账号,jobmanager 用该账号为 taskmanager 申请 k8s 的 pod
./bin/kubernetes-session.sh -Dkubernetes.container.image=localhost:5000/flink:1.10.0.1 -Dkubernetes.jobmanager.service-account=flink
可以根据需要添加配置,k8s session 的所有相关配置在这里.
例如:启动一个有 2 个 cpu 核心,4GB 内存的 TaskManager
./bin/kubernetes-session.sh \
-Dkubernetes.cluster-id= \
-Dtaskmanager.memory.process.size=4096m \
-Dkubernetes.taskmanager.cpu=2 \
-Dtaskmanager.numberOfTaskSlots=4 \
-Dkubernetes.container.image=flink:1.10.0.1 \
-Dkubernetes.service.exposed.type=ClusterIP
其余配置则使用 conf/flink-conf.yaml 中的配置,所有配置在这里
如果没有指定 kubernetes.cluster-id
, flink 客户端会随机生成一个 UUID。
通过 -e kubernetes-session
指定部署到之前启动的 k8s 集群,并且可以通过 -D 指定参数
./bin/flink run -d -e kubernetes-session -Dkubernetes.jobmanager.service-account=flink -Dkubernetes.cluster-id= examples/streaming/WindowJoin.jar
这里涉及 k8s 相关概念,由于 k8s 有自己的 ‘防火墙’,用户需要定义组件的端口暴露规则,将端口映射到宿主机,k8s 目前提供了 4 种端口映射方式:
kubectl port-forward service/ 8081
可以使用以下命令连接启动的 k8s session
./bin/kubernetes-session.sh -Dkubernetes.cluster-id= -Dexecution.attached=true
echo 'stop' | ./bin/kubernetes-session.sh -Dkubernetes.cluster-id= -Dexecution.attached=true
依赖 k8s 机制进行清理,删除 k8s 服务即可回收所有占用的 k8s 资源(当然服务也停了)
kubectl delete service/
默认情况下 jobmanager 和 taskmanager 只将日志保存到 pod 的 /opt/flink/log 目录下。如果要使用 kubectl logs
查看日志,需要进行以下配置:
# Log all infos to the console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p %-60c %x - %m%n
kubectl logs
命令查看日志kubectl exec -it bash
进入 pod 查看日志或者进行 debug。k8s 的命令空间,类似于 yarn 中 queue 的概念,可以定义集群资源,给不同用户使用。详情可以查看k8s官网。
可以通过 -Dkubernetes.namespace=default
指定 namespace
kubectl create clusterrolebinding flink-role-binding-default --clusterrole=edit --serviceaccount=default:default
kubectl create serviceaccount flink
kubectl create clusterrolebinding flink-role-binding-flink --clusterrole=edit --serviceaccount=default:flink
然后可以使用 -Dkubernetes.jobmanager.service-account=flink
指定 jobmanager 使用 flink 账号来创建或删除 Taskmanager pods
可以查看官方 RBAC 文档了解详情。
简单介绍一下 Flink 和 k8s 的交互原理。
当创建 Flink k8s session 集群时,flink 客户端首先连接 Kubernetes ApiServer
,提交要启动的集群描述(cluster description),包括 ConfigMap 、Job Manager Service、Job Manager Deployment 和 Owner(1). Kubernetes 将创建 Flink master deployment,Kubelet 拉取 flink image,准备并挂载卷(mount the volume),然后执行 start 命令。master pod 启动后,Dispatcher 和KubernetesResourceManager 就可用了,这时就可以向该集群提交作业了(2).
当用户使用 Flink 客户端提交作业,客户端会生成 job graph,然后将 job graph 连同用户 jar 包上传到 Dispatcher(3)。Dispatcher 会生成和该作业对应的 JobMaster(4).
JobMaster 向 KubernetesResourceManager(K8sRM)申请运行资源(slots)(5)。如果当前没有空闲 slots,K8sRM 会向 k8s Master 申请并注册 TaskManager pods(6 7 8 9 10).