Kubernetes(k8s)由Google建立,現已成爲最受歡迎的開源編排系統,用於管理多個主機容器化應用,提供了爲分佈式系統構建和部署可伸縮且可靠的應用程序所需的機制。咱們正處在一個時代,服務的正常運行時間必須接近99.9%,要實現這一點,就必須擁有一種機制,即便存在系統崩潰,它們也不能失敗。這些類型的系統必須具備某些特性,必須在某些意外發生的時候,工做負載能夠在簡單維護或部署的狀況下進行擴展,停機時間必須爲零。服務器
可使用會話集羣或做業集羣兩種模式將Apache Flink部署在Kubernetes上。會話集羣是一個運行中的獨立集羣,能夠運行多個做業,Kubernetes的視角來看,會話集羣由三個組件組成:網絡
做業集羣爲每一個做業部署專用集羣。
在下一節中,咱們將討論有關Kubernetes的一些基本概念。maven
Pod是能夠在Kubernetes中建立和管理的最小的可部署計算單元。
Pod是容器的集合,可能包含一個或多個共享名稱空間,卷和網絡堆棧的應用程序。容器之間是緊密耦合的,由於它們共享網絡堆棧,所以可使用本地主機相互通訊。 分佈式
部署在其餘Pod中的容器沒法使用本地主機進行通訊,由於它們具備不一樣的IP地址,而且應該使用Pod IP地址進行交互。 工具
您能夠在Kubernetes網站上找到有關Pod的更多詳細信息。網站
ReplicaSet的目的是維持在任何給定時間運行的穩定的副本Pod集。所以,它一般用於保證指定數量的相同Pod的可用性。
ReplicaSet使管理和確保運行預約數量的複製Pod的工做更加輕鬆,而無需建立Pod的手動副本,從而避免了時間和錯誤。由ReplicaSets管理的Pod可能會失敗,而且新實例將自動從新安排。url
您能夠在Kubernetes網站上找到有關副本集的更多詳細信息。spa
將運行在一組Pod上的應用程序公開爲網絡服務的抽象方法。
因爲Kubernetes是一個動態系統,能夠調度新Pod或縮小Pod的規模,甚至禁用它們,所以Pod被認爲是短暫的。每一個Pod都有一個IP地址,該地址在Pod死亡的整個時間(若是由控制器進行管理)都會更改,這意味着與該Pod交互的全部服務都必須更新IP,不然對該服務的請求將失敗。命令行
解決此類問題的必要措施是進行服務發現,以解決查找在服務正常工做的給定地址處偵聽的進程的問題。scala
Kubernetes使用Service對象解決了這個問題,該對象定義了一個標籤選擇器,而且屬於該服務的Pod具備該標籤。這意味着分配給服務的IP地址不會隨時間變化。
您能夠在Kubernetes網站上找到有關該服務的更多詳細信息。
部署爲Pod和ReplicaSet提供聲明性更新。
使用Deployment對象,您能夠有效地管理髮布過程,而不會形成停機或錯誤。部署由在Kubernetes集羣上運行的名爲部署控制器的服務控制。
您能夠在Kubernetes網站上找到有關部署的更多詳細信息。
如今該安裝Kubernetes集羣了。首先須要安裝Minikube,它將在虛擬機內部運行單節點Kubernetes集羣。
除了Minikube以外,您還須要命令行工具Kubectl,它容許您對Kubernetes集羣運行命令。可是,若是您在Minikube中遇到問題,則可能有必要在Minikube中使用HTTP/HTTPS代理。
如示例1中所示啓動集羣。
minikube start命令是從下載啓動鏡像並啓動Virtualbox VM開始的。注意:在咱們的示例VirtualBox中,必須指定Minikube將使用哪一個VM驅動程序,若是要使用其餘驅動程序,能夠執行如下命令:
minikube start — vm-driver=<driver_name>
Minikube是使用Kubernetes版本v1.17.3啓動的,但您能夠自由配置該版本之外的版本:
minikube start — kubernetes-version <kubernetes_version>.
使用會話集羣對於使用不一樣的Kubernetes資源是必要的,如上所述,這是必需的:
讓咱們從1)開始,並建立一個部署對象以實例化JobManager。
此部署對象使用容器鏡像Flink-1.10.0 建立單個JobManager,並公開用於RPC通訊的容器端口,blob服務器,用於可查詢狀態服務器和Web UI。
移至2)將建立部署對象以實例化TaskManager。
TaskManager部署指定兩個實例,這些實例可用於運行JobManager計劃的做業。 Docker容器鏡像與JobManager相同,而且啓動工做程序的命令與JobManager的啓動不一樣。
最後,3)建立了服務對象,該對象在咱們的集羣中很是重要,由於它將JobManager暴露給TaskManager,不然,工做Pod將沒法鏈接到主控制Pod。
您可能已經注意到,服務類型定義爲NodePort,這是因爲咱們想在Kubernetes集羣外部與JobManager進行交互而添加的。
是時候啓動咱們的Flink集羣了,爲此,咱們將上面構建的定義添加到Kubernetes,執行如下命令:
kubectl create -f jobmanager.yaml kubectl create -f jobmanager-service.yaml kubectl create -f taskmanger.yaml
要查看部署狀態:
kubectl get deployments
檢查Pod的啓動狀態:
kubectl get pods
如今咱們的Kubernetes集羣運行Flink集羣,其中兩個插槽中有一個JobManager和兩個TaskManager以運行做業。
重要的是要記住,TaskManager能夠配置有必定數量的處理插槽,這些插槽能夠同時執行多個任務。這些任務能夠是同一應用程序的子任務,也能夠是不一樣應用程序的子任務。看起來更好,咱們能夠區分三種並行性:
數據並行性是一種對數據進行分區的功能,若是您已經使用Apache Kafka,則可讓多個運算符執行這些數據子集,該概念相似於主題的每一個分區。任務並行性變得更容易,來自不一樣操做員的任務屬於同一應用程序。
咱們的應用程序將是基於Apache Flink文檔構建的相似示例,該示例將對Web套接字中使用5秒鐘的批處理實現計數單詞Ola出現次數(該單詞是葡萄牙語的一個單詞,與hello的含義相同)。該示例是使用scala 2.12和maven進行依賴關係管理和項目管理的。
要運行該應用程序,您須要運行命令行netcat打開一個TCP鏈接,該鏈接將用於偵聽和發送數據:
nc -lk 9999
在該項目的根目錄下運行命令以後,轉到Github上的項目並克隆該項目:
mvn clean package
並將在目標/streaming-job-ola-word-1.0-SNAPSHOT.jar中的應用程序代碼中生成一個jar。
運行咱們的應用程序意味着能夠訪問Flink的Web UI,這不是強制性的,例如,您能夠經過Flink的Rest API或Flink實用程序來進行部署和啓動做業應用程序。
要知道Flink的Web UI的端點,Minikube提供了一個檢索服務URL的命令:
minikube service jobmanager --url
Flink的儀表板暴露在端口32076上,以下所示:
Flink羣集具備兩個TaskManager實例,這些實例先前是在非Flink做業運行時建立的。要運行一個做業,您能夠提交先前建立的做業,您能夠單擊「提交新做業」選項,而後使用「新增」按鈕將該做業上傳到Flink,而後單擊上載的做業,而後單擊「提交」按鈕。
提交後,做業將自動啓動,由於存在運行做業的可用任務。
要與做業進行交互,若是您還記得,可使用命令工具netcat:
nc -lk 9999
而後您就能夠開始向咱們的Job發送信息了。
您能夠查看此交互的響應,並查看Taskmanager的日誌。
不要忘記閱讀Flink文檔和Kubernetes文檔,由於社區是很是活躍的參考,他們正在不斷改進項目。
下一個故事是關於如何在Flink羣集上得到高可用性的。流應用程序的大多數用例都要求長期運行,並知足將集羣準備爲此要求所必需的。