該頁面介紹了如何在Kubernetes上本地部署Flink?。
入門
本入門部分將指導您在Kubernetes上設置功能齊全的Flink集群。
介紹
Kubernetes是一種流行的容器編排系統,用于自動執行計算機應用程序的部署,擴展和管理。Flink的本地Kubernetes集成使您可以在正在運行的Kubernetes集群上直接部署Flink。此外,Flink能夠根據所需資源動態分配和取消分配TaskManager,因為它可以直接與Kubernetes通信。
準備
在入門部分假定運行Kubernetes集群滿足以下要求:
Kubernetes> = 1.9。
KubeConfig,可以訪問列表,創建,刪除容器和服務,可以通過進行配置~/.kube/config。您可以通過運行來驗證權限kubectl auth can-i <list|create|edit|delete> pods。
啟用Kubernetes DNS。
default具有RBAC權限的服務帳戶可以創建,刪除Pod。
如果在設置Kubernetes集群時遇到問題,請看一下如何設置Kubernetes集群。
在Kubernetes上啟動Flink Session
在運行Kubernetes集群并kubectl配置為指向它之后,您可以通過以下方式在會話模式下啟動Flink集群:
# (1) Start Kubernetes session
$ ./bin/kubernetes-session.sh-Dkubernetes.cluster-id=my-first-flink-cluster
# (2) Submit example job
$ ./bin/flink run\--targetkubernetes-session\-Dkubernetes.cluster-id=my-first-flink-cluster\./examples/streaming/TopSpeedWindowing.jar
# (3) Stop Kubernetes session by deleting cluster deployment
$ kubectl delete deployment/my-first-flink-cluster
注意使用Minikube時,需要調用minikube tunnel以便在Minikube上公開Flink的LoadBalancer服務。
恭喜你!通過在Kubernetes上部署Flink,您已經成功運行了Flink應用程序。
部署方式
對于生產用途,我們建議在應用程序模式下部署Flink應用程序,因為這些模式為應用程序提供了更好的隔離。
應用模式
所述應用程序模式需要用戶代碼是捆綁在一起的?Flink鏡像一起,因為它在集群上運行用戶代碼的main()方法。應用程序模式可確保在終止應用程序后正確清理所有Flink組件。
Flink社區提供了一個基本的Docker映像,可用于捆綁用戶代碼:
FROM flink
RUN mkdir -p $FLINK_HOME/usrlib
COPY /path/of/my-flink-job.jar $FLINK_HOME/usrlib/my-flink-job.jar
在下創建并發布Docker映像后custom-image-name,您可以使用以下命令啟動應用程序集群:
$ ./bin/flink run-application \
--targetkubernetes-application \
-Dkubernetes.cluster-id=my-first-application-cluster \
-Dkubernetes.container.image=custom-image-name \
local:///opt/flink/usrlib/my-flink-job.jar
注意?local是“應用程序模式”中唯一受支持的方案。
該kubernetes.cluster-id選項指定集群名稱,并且必須是唯一的。如果您未指定此選項,則Flink將生成一個隨機名稱。
該kubernetes.container.image選項指定用于啟動Pod的image。
部署應用程序集群后,您可以與其進行交互:
# List running job on the cluster
$ ./bin/flink list --target kubernetes-application -Dkubernetes.cluster-id=my-first-application -cluster
# Cancel running job
$ ./bin/flink cancel --target kubernetes-application -Dkubernetes.cluster-id=my-first-application-cluster? <jobId>
您可以conf/flink-conf.yaml通過將鍵值對傳遞-Dkey=value給來覆蓋設置中的配置bin/flink。
Per-Job Cluster Mode
Kubernetes上的Flink不支持 Per-Job Cluster Mode。
會話模式
在此頁面頂部的《入門指南》中,您已經看到了會話集群的部署。
會話模式可以以兩種模式執行:
分離模式(默認):kubernetes-session.sh在Kubernetes上部署Flink集群,然后終止。
附加模式(-Dexecution.attached=true):kubernetes-session.sh保持活動狀態,并允許輸入命令來控制正在運行的Flink群集。例如,stop停止正在運行的會話群集。鍵入help以列出所有受支持的命令。
為了my-first-flink-cluster使用集群ID重新附加到正在運行的Session集群,請使用以下命令:
$ ./bin/kubernetes-session.sh\
-Dkubernetes.cluster-id=my-first-flink-cluster\
-Dexecution.attached=true
您可以conf/flink-conf.yaml通過將鍵值對傳遞-Dkey=value給來覆蓋設置中的配置bin/kubernetes-session.sh。
停止正在運行的會話群集
為了停止正在運行的具有群集ID的會話群集,my-first-flink-cluster您可以刪除Flink部署,也可以使用:
$ echo'stop' | ./bin/kubernetes-session.sh \
-Dkubernetes.cluster-id=my-first-flink-cluster \
-Dexecution.attached=true
在Kubernetes上的Flink參考
Configuring Flink on Kubernetes
配置頁面上列出了特定于Kubernetes的配置選項。
訪問Flink的Web UI
Flink的Web UI和REST端點可以通過kubernetes.rest-service.exposed.type配置選項以多種方式公開。
ClusterIP:在群集內部IP上公開服務。該服務僅在群集內可用。如果要訪問JobManager UI或將作業提交到現有會話,則需要啟動本地代理。然后,您可以localhost:8081用于將Flink作業提交到會話或查看儀表板。
$ kubectl port-forward service/ 8081
NodePort:在靜態端口(NodePort)上的每個節點的IP上公開服務。?<NodeIP>:<NodePort>可用于聯系JobManager服務。?NodeIP也可以用Kubernetes ApiServer地址代替。您可以在kube配置文件中找到其地址。
LoadBalancer:使用云提供商的負載平衡器在外部公開服務。由于云提供商和Kubernetes需要一些時間來準備負載均衡器,因此您可能會NodePort在客戶端日志中獲得JobManager Web界面。您可以kubectl get services/<cluster-id>-rest用來獲取EXTERNAL-IP并手動構建負載均衡器JobManager Web界面 http://<EXTERNAL-IP>:8081。
請參閱Kubernetes中有關發布服務的官方文檔以獲取更多信息。
Logging
Kubernetes集成向Pod公開conf/log4j-console.properties并conf/logback-console.xml作為ConfigMap。這些文件的更改將對新啟動的群集可見。
訪問日志
默認情況下,JobManager和TaskManager會將日志/opt/flink/log同時輸出到控制臺和每個窗格中。該STDOUT和STDERR輸出只會被重定向到控制臺。您可以通過訪問它們
$ kubectl logs
如果Pod正在運行,則還可以使用它kubectl exec -it <pod-name> bash來建立隧道并查看日志或調試過程。
訪問TaskManagers的日志
Flink將自動取消分配空閑的TaskManager,以免浪費資源。此行為可能使訪問相應pod的日志變得更加困難。您可以通過配置resourcemanager.taskmanager-timeout來增加釋放空閑的TaskManager之前的時間,以便您有更多的時間檢查日志文件。
動態更改日志級別
如果已將記錄器配置為自動檢測配置更改,則可以通過更改相應的ConfigMap(假設集群ID為my-first-flink-cluster)來動態調整日志級別:
$ kubectl edit cm flink-config-my-first-flink-cluster
使用插件
為了使用插件,您必須將它們復制到Flink JobManager / TaskManager pod的正確位置。您可以使用內置插件,而無需裝載卷或構建自定義Docker image。例如,使用以下命令為您的Flink會話群集啟用S3插件。
$ ./bin/kubernetes-session.sh
-Dcontainerized.master.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.12.0.jar \
-Dcontainerized.taskmanager.env.ENABLE_BUILT_IN_PLUGINS=flink-s3-fs-hadoop-1.12.0.jar
自定義Docker image
如果要使用自定義Docker映像,則可以通過configuration選項指定它kubernetes.container.image。Flink社區提供了豐富的Flink Docker?image,可以作為一個很好的起點。查看如何自定義Flink的Docker映像,以了解如何啟用插件,添加依賴項和其他選項。
使用秘密
Kubernetes Secrets是一個包含少量敏感數據(例如密碼,令牌或密鑰)的對象。否則,此類信息可能會放在pod specification或image中。Kubernetes上的Flink可以通過兩種方式使用Secrets:
將Secrets用作Pod中的文件;
使用Secrets作為環境變量;
將Secrets?用作Pod中的文件
以下命令會將密鑰安裝在啟動的容器中mysecret的路徑下/path/to/secret:
$ ./bin/kubernetes-session.sh -Dkubernetes.secrets=mysecret:/path/to/secret
mysecret然后可以找到秘密文件的用戶名和密碼,并將它們存儲在/path/to/secret/username和中/path/to/secret/password。有關更多詳細信息,請參見Kubernetes官方文檔。
使用Secrets?作為環境變量
以下命令將mysecret在啟動的pod中將密鑰作為環境變量公開:
$ ./bin/kubernetes-session.sh-Dkubernetes.env.secretKeyRef= \
env:SECRET_USERNAME,secret:mysecret,key:username; \
env:SECRET_PASSWORD,secret:mysecret,key:password
env變量SECRET_USERNAME包含用戶名,而env變量SECRET_PASSWORD包含secret的密碼mysecret。有關更多詳細信息,請參見Kubernetes官方文檔。
Kubernetes的高可用性
為了在Kubernetes上實現高可用性,您可以使用現有的高可用性服務。
手動資源清理
Flink使用Kubernetes OwnerReference來清理所有集群組件。所有flink創建的資源,其中包括ConfigMap,Service,和Pod,有OwnerReference設定為deployment/<cluster-id>。刪除部署后,所有相關資源將自動刪除。
$ kubectl delete deployment/<cluster-id>
支持的Kubernetes版本
當前,>= 1.9支持所有Kubernetes版本。
命名空間
Kubernetes中的命名空間通過資源配額在多個用戶之間劃分集群資源。Kubernetes上的Flink可以使用名稱空間來啟動Flink集群。可以通過kubernetes.namespace配置名稱空間。
RBAC
基于角色的訪問控制(RBAC)是一種基于企業內各個用戶的角色來調節對計算資源或網絡資源的訪問的方法。用戶可以配置JobManager用來訪問Kubernetes集群中的Kubernetes API服務器的RBAC角色和服務帳戶。
每個名稱空間都有一個默認服務帳戶。但是,default服務帳戶可能無權在Kubernetes集群中創建或刪除Pod。用戶可能需要更新default服務帳戶的權限或指定綁定了正確角色的另一個服務帳戶。
$ kubectl create clusterrolebinding flink-role-binding-default--clusterrole=edit--serviceaccount=default:default
如果您不想使用default服務帳戶,請使用以下命令創建新的flink-service-account服務帳戶并設置角色綁定。然后使用config選項-Dkubernetes.service-account=flink-service-account使JobManager窗格使用flink-service-account服務帳戶創建/刪除TaskManager窗格和領導者ConfigMap。同樣,這將允許TaskManager監視領導者ConfigMap,以檢索JobManager和ResourceManager的地址。
$ kubectl create serviceaccount flink-service-account
$ kubectl create clusterrolebinding flink-role-binding-flink--clusterrole=edit--serviceaccount=default:flink-service-account
請參閱有關RBAC授權的Kubernetes官方文檔以獲取更多信息。