如何於Kubernetes上佈建Apache Kafka Cluster運行環境
再說明如何於Kubernetes上簡單建立Apache Kafka Cluster前,稍微前情提要本篇文章會使用到的幾個關鍵技術:
什麼是Kafka?
Apache Kafka 是一個目前蔚為主流的分散式訊息佇列框架(亦有人稱為串流資料平台),被廣泛用來處理高吞吐量以及易於水平擴展,Apache Kafka 是基於Message Queue的Message System,設計之初五大目標為:
1.在 TB 級以上資料也能確保常數時間複雜度的存取效能,且時間複雜度為O(1)的訊息持久化。
2.支援服務水平擴展
3.同時能支援離線數據的處理與即時數據處理
4.支援Kafka間的訊息分區機制以及分散式消費,同時亦保證每個分區內的訊息按順序傳輸
5.高吞吐量 (High Throughput) ,即便在單台低規格的普通商用PC也能每秒消化掉100K以上的訊息傳輸
有關Apache Kafka的設計架構詳情,可參考官方網站 https://kafka.apache.org/。
什麼是Kubernetes?
Kubernetes (K8S)是一個由Google主導發展的容器應用管理平台,協助使用者自動化部屬(automating deployment)、自動擴展(Auto Scaling)以及管理容器應用程式的指揮調度(Orchestration) 。
相較於傳統上使用者手動部署容器應用程式(主流為Docker Container)的手法,Kubernetes的誕生主要帶來了四大好處:
1.Kubernetes可易於更新容器版本並且於必要時rollback到先前一的版本 (Rollouts & Rollbacks)
2.具備Auto Scaling服務的能力
3.自動分配容器相對應的IP Address,透過運行Kubernetes的Service Cluster來達到Load Balancing效果
4.當運行於容器上的Application發生Crash時,可根據部署定義的需求,Kubernetes即可自動偵測重啟服務
有關Kubernetes的設計架構詳情,可參考官方網站 https://kubernetes.io/,網路上亦有相當多教學資源。
如何將Apache Kafka Cluster運行於Kubernetes?
說明完背景知識後,來到本篇的重點內文,如何將Apache Kafka Cluster運行於Kubernetes。為何需要將Kafka Cluster運行於Kubernetes?在眾多的理由中,最直接的理由就是組織中已經將服務容器化後透過Kubernetes部署,將Kafka也運行於Kubernetes可使組織更易於升級,水平擴展, 重啟服務以及監控整個服務平台。
實作Demo環境 (Demo環境已經預設您已完成了Kubernetes的環境架設):
1.Ubuntu 16.04
2.Kubernetes (Minikube)
Step 1.部署Apache Zookeeper於Kubernetes
Apache Zookeeper為專職於協調與同步分散式系統各個服務狀態的開源專案,提供給Cluster給使用之服務,Zookeeper透過協調機制以及同步技術維護Cluster間之共享數據。
常見的幾種手法:
1.共享Metadata
2.Cluster中各節點的Status並且維護Cluster中的成員名單
3.協助選出Cluster中的Master
以下編寫一個zookeeper.yml範例檔作為於Kubernetes上佈建的參照:
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: zookeeper-deployment-1
spec:
template:
metadata:
labels:
app: zookeeper-1
spec:
containers:
- name: zoo1
image: digitalwonderland/zookeeper
ports:
- containerPort: 2181
env:
- name: ZOOKEEPER_ID
value: "1"
- name: ZOOKEEPER_SERVER_1
value: zoo1
---
apiVersion: v1
kind: Service
metadata:
name: zoo1
labels:
app: zookeeper-1
spec:
ports:
- name: client
port: 2181
protocol: TCP
- name: follower
port: 2888
protocol: TCP
- name: leader
port: 3888
protocol: TCP
selector:
app: zookeeper-1
接著開啟CLI輸入指令佈建zookeeper.yml檔:
$ kubectl create -f zookeeper.yml |
完成此步驟後接著我們來佈建Apache Kafka。
Step 2.部署Apache Kafka's Docker Service 於 Kubernetes
首先我們要先佈建一個在Kubernetes上面運行的Kafka Manager來管理我們的Kafka Broker。
以下編寫一個kafka-service.yml檔作為於Kubernetes上佈建服務的參照:
---
apiVersion: v1
kind: Service
metadata:
name: kafka-service
labels:
name: kafka
spec:
ports:
- port: 9092
name: kafka-port
protocol: TCP
selector:
app: kafka
id: "0"
type: LoadBalancer
接著我們開啟CLI輸入指令佈建kafka-service.yml:
$ kubectl create -f kafka-service.yml |
為了在下一個佈建階段可以讓Kafka Broker可與Kafka Service進行結合,我們需要取得Kafka Service的外部IP。
$ kubectl describe svc kafka-service |
此時根據回傳的資訊我們知道了LoadBalancer進入點的IP配置為198.51.100.0,現在我們開始佈建Kafka Broker!
Step 3. 部署Apache Kafka Broker 於 Kubernetes
雖然我們前一個步驟已經佈建了Kubernetes服務,但所做的僅僅只是完成負載平衡我們的Kafka's Pod的準備工作,Pod本身尚未佈建。
以下編寫一個kafka-broker.yml範例檔作為於Kubernetes上佈建Kafka Broker的參照:
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
name: kafka-broker0
spec:
template:
metadata:
labels:
app: kafka
id: "0"
spec:
containers:
- name: kafka
image: wurstmeister/kafka
ports:
- containerPort: 9092
env:
- name: KAFKA_ADVERTISED_PORT
value: "30718"
- name: KAFKA_ADVERTISED_HOST_NAME
value: 198.51.100.0
- name: KAFKA_ZOOKEEPER_CONNECT
value: zoo1:2181
- name: KAFKA_BROKER_ID
value: "0"
- name: KAFKA_CREATE_TOPICS
value: steven-test:1:1
注意kafka-broker.yml中的KAFKA_ADVERTISED_HOST_NAME,此處value部分即為剛剛於上一個階段所得到LoadBalancer的外部IP。同時我們也在kafka-broker.yml檔中指定Kafka Broker去創建一個名為steven-test且擁有1個partition與1個replica的topic。
接著我們開啟CLI輸入指令佈建kafka-broker.yml:
$ kubectl create -f kafka-broker.yml |
此時可以透過kubectl get pods/services 查看我們剛剛佈建的Services與Pods是否已順利執行中。
$ kubectl get services |
$ kubectl get pods |
使用KafkaCat測試工具
現在我們來驗證一下佈建的整個Kafka Cluster環境是否可運行,這邊採用KafkaCat來進行驗證。KafkaCat是一套用於測試Apache Kafka的工
具,可選澤Producer或者Consumer模式來傳輸Message至Kafka Broker亦或是接收來自Broker的Message。
Step 1.安裝KafkaCat:
$ sudo apt-get install kafkacat |
Step 2.接著開啟CLI 將Consumer Mode 指向剛剛所建立名為steven-test的topic
$ kafkacat -b 192.168.99.1:9092 -t steven-test |
Step 3.接著可開啟另一個CLI來設置Producer Mode發送Message
$ cat testfile.txt | kafkacat -b 192.168.99.1 -t steven-test |
參考資料:
2. Ultimate Guide to Installing Kafka Docker on Kubernetes
3. Getting Started with Apache Kafka and Kubernetes