ApacheKafka K8S Kubernetes Zookeeper distributed streaming

如何於Kubernetes上佈建Apache Kafka Cluster運行環境

邱乙城 Steven Chiu 2019/09/27 12:28:29
882

  再說明如何於Kubernetes上簡單建立Apache Kafka Cluster前,稍微前情提要本篇文章會使用到的幾個關鍵技術:

什麼是Kafka

   Apache Kafka 是一個目前蔚為主流的分散式訊息佇列框架(亦有人稱為串流資料平台),被廣泛用來處理高吞吐量以及水平擴展,Apache Kafka 是基於Message QueueMessage 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,透過運行KubernetesService 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 ZookeeperKubernetes  

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-testtopic

$ 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   

 

參考資料:

  1. Apache Kafka Documentation

  2. Ultimate Guide to Installing Kafka Docker on Kubernetes

  3. Getting Started with Apache Kafka and Kubernetes

     

 

 

 

 

 

 

 

邱乙城 Steven Chiu