系統環境:
- Kubernetes 版本:1.14.0
- kafka 版本:2.3.0
- zookeeper 版本:3.4.14
- kafka manager 版本:1.3.3
- 示例部署文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/kubernetes/kafka-zookeeper-deploy
一、簡介
Kafka 簡介
Kafka 是由 Apache 軟件基金會開發的一個開源流處理平台,由 Scala 和 Java 編寫。它是一個分布式、支持分區的的、多副本,基於 zookeeper 協調的分布式消息系統。它最大特性是可以實時的處理大量數據以滿足各種需求場景,比如基於 Hadoop 的批處理系統、低延時的實時系統、storm/Spark 流式處理引擎,web/nginx 日志,訪問日志,消息服務等等。
Zookeeper 簡介
ZooKeeper 是一種分布式協調服務,用於管理大型主機。在分布式環境中協調和管理服務是一個復雜的過程。ZooKeeper 通過其簡單的架構和 API 解決了這個問題。 ZooKeeper 允許開發人員專注於核心應用程序邏輯,而不必擔心應用程序的分布式特性。
Kafka 中主要利用 zookeeper 解決分布式一致性問題。Kafka 使用 Zookeeper 的分布式協調服務將生產者,消費者,消息儲存結合在一起。同時借助 Zookeeper,Kafka 能夠將生產者、消費者和 Broker 在內的所有組件在無狀態的條件下建立起生產者和消費者的訂閱關系,實現生產者的負載均衡。
Kafka Manager 簡介
Kafka Manager 是目前最受歡迎的 Kafka 集群管理工具,最早由雅虎開源,用戶可以在 Web 界面執行一些簡單的集群管理操作。
支持以下功能:
- 管理 Kafka 集群
- 方便集群狀態監控 (包括topics, consumers, offsets, brokers, replica distribution, partition distribution)
- 方便選擇分區副本
- 配置分區任務,包括選擇使用哪些 Brokers
- 可以對分區任務重分配
- 提供不同的選項來創建及刪除 Topic
- Topic List 會指明哪些topic被刪除
- 批量產生分區任務並且和多個topic和brokers關聯
- 批量運行多個主題對應的多個分區
- 向已經存在的主題中添加分區
- 對已經存在的 Topic 修改配置
- 可以在 Broker Level 和 Topic Level 的度量中啟用 JMX Polling 功能
- 可以過濾在 ZooKeeper 上沒有 ids/owners/offsets/directories 的 consumer
二、部署過程
這個流程需要部署三個組件,分別為 Zookeeper、Kafka、Kafka Manager:
- (1)、Zookeeper: 首先部署 Zookeeper,方便后續部署 Kafka 節點注冊到 Zookeeper,用 StatefulSet 方式部署三個節點。
- (2)、Kafka: 第二個部署的是 Kafka,設置環境變量來指定 Zookeeper 地址,用 StatefulSet 方式部署。
- (3)、Kafka Manager: 最后部署的是 Kafka Manager,用 Deployment 方式部署,然后打開 Web UI 界面來管理、監控 Kafka。
三、Kubernetes 部署 Zookeeper & Kafka & Kafka Manager
1、創建 StorageClass
由於都是使用 StatefulSet 方式部署的有狀態服務,所以 Kubernetes 集群需要提前設置一個 StorageClass 方便后續部署時指定存儲分配(如果想指定為已經存在的 StorageClass 創建 PV 則跳過此步驟)。
此處用的是 NFS 存儲驅動,如果是其它存儲需要提前設置好相關配置
創建 StorageClass 部署文件
nfs-storage.yaml
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage provisioner: nfs-client #動態卷分配服務指定的名稱 parameters: archiveOnDelete: "true" #設置為"false"時刪除PVC不會保留數據,"true"則保留數據 mountOptions: - hard #指定為硬掛載方式 - nfsvers=4 #指定NFS版本
部署 StorageClass
$ kubectl apply -f nfs-storage.yaml
2、Kubernetes 部署 Zookeeper
創建 Zookeeper 部署文件
zookeeper.yaml
#部署 Service Headless,用於Zookeeper間相互通信 apiVersion: v1 kind: Service metadata: name: zookeeper-headless labels: app: zookeeper spec: type: ClusterIP clusterIP: None publishNotReadyAddresses: true ports: - name: client port: 2181 targetPort: client - name: follower port: 2888 targetPort: follower - name: election port: 3888 targetPort: election selector: app: zookeeper --- #部署 Service,用於外部訪問 Zookeeper apiVersion: v1 kind: Service metadata: name: zookeeper labels: app: zookeeper spec: type: ClusterIP ports: - name: client port: 2181 targetPort: client - name: follower port: 2888 targetPort: follower - name: election port: 3888 targetPort: election selector: app: zookeeper --- apiVersion: apps/v1 kind: StatefulSet metadata: name: zookeeper labels: app: zookeeper spec: serviceName: zookeeper-headless replicas: 3 podManagementPolicy: Parallel updateStrategy: type: RollingUpdate selector: matchLabels: app: zookeeper template: metadata: name: zookeeper labels: app: zookeeper spec: securityContext: fsGroup: 1001 containers: - name: zookeeper image: docker.io/bitnami/zookeeper:3.4.14-debian-9-r25 imagePullPolicy: IfNotPresent securityContext: runAsUser: 1001 command: - bash - -ec - | # Execute entrypoint as usual after obtaining ZOO_SERVER_ID based on POD hostname HOSTNAME=`hostname -s` if [[ $HOSTNAME =~ (.*)-([0-9]+)$ ]]; then ORD=${BASH_REMATCH[2]} export ZOO_SERVER_ID=$((ORD+1)) else echo "Failed to get index from hostname $HOST" exit 1 fi . /opt/bitnami/base/functions . /opt/bitnami/base/helpers print_welcome_page . /init.sh nami_initialize zookeeper exec tini -- /run.sh resources: limits: cpu: 500m memory: 512Mi requests: cpu: 250m memory: 256Mi env: - name: ZOO_PORT_NUMBER value: "2181" - name: ZOO_TICK_TIME value: "2000" - name: ZOO_INIT_LIMIT value: "10" - name: ZOO_SYNC_LIMIT value: "5" - name: ZOO_MAX_CLIENT_CNXNS value: "60" - name: ZOO_SERVERS value: " zookeeper-0.zookeeper-headless:2888:3888, zookeeper-1.zookeeper-headless:2888:3888, zookeeper-2.zookeeper-headless:2888:3888 " - name: ZOO_ENABLE_AUTH value: "no" - name: ZOO_HEAP_SIZE value: "1024" - name: ZOO_LOG_LEVEL value: "ERROR" - name: ALLOW_ANONYMOUS_LOGIN value: "yes" ports: - name: client containerPort: 2181 - name: follower containerPort: 2888 - name: election containerPort: 3888 livenessProbe: tcpSocket: port: client initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 readinessProbe: tcpSocket: port: client initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 6 volumeMounts: - name: data mountPath: /bitnami/zookeeper volumeClaimTemplates: - metadata: name: data annotations: spec: storageClassName: nfs-storage #指定為上面創建的 storageclass accessModes: - ReadWriteOnce resources: requests: storage: