1. 程式人生 > 其它 >kafka叢集 kubernetes_使用helm在Kubernetes上部署kafka

kafka叢集 kubernetes_使用helm在Kubernetes上部署kafka

技術標籤:kafka叢集 kubernetes

作者:青蛙小白,原文:

https://blog.frognew.com/2019/07/use-helm-install-kafka-on-k8s.html

1.配置helm chart repo

kafka的helm chart還在孵化當中,使用前需要新增incubator的repo:helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator。

3a8738b0f6ef99b4ac06ecef4d735bbe.gif

肉身在國內需要設定azure提供的映象庫地址:

helm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubatorhelm repo listNAME URL stable http://mirror.azure.cn/kubernetes/charts local http://127.0.0.1:8879/charts incubator http://mirror.azure.cn/kubernetes/charts-incubator

2.建立Kafka和Zookeeper的Local PV

2.1 建立Kafka的Local PV

這裡的部署環境是本地的測試環境,儲存選擇Local Persistence Volumes。首先,在k8s叢集上建立本地儲存的StorageClass local-storage.yaml:

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: local-storageprovisioner: kubernetes.io/no-provisionervolumeBindingMode: WaitForFirstConsumerreclaimPolicy: Retain
kubectl apply -f local-storage.yaml storageclass.storage.k8s.io/local-storage created

這裡要在node1、node2這兩個k8s節點上部署3個kafka的broker節點,因此先在node1、node2上建立這3個kafka broker節點的Local PV kafka-local-pv.yaml:

apiVersion: v1kind: PersistentVolumemetadata: name: datadir-kafka-0spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/data-0 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1---apiVersion: v1kind: PersistentVolumemetadata: name: datadir-kafka-1spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/data-1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2---apiVersion: v1kind: PersistentVolumemetadata: name: datadir-kafka-2spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/data-2 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2
kubectl apply -f kafka-local-pv.yaml

根據上面建立的local pv,在node1上建立目錄/home/kafka/data-0,在node2上建立目錄/home/kafka/data-1和/home/kafka/data-2。

# node1mkdir -p /home/kafka/data-0# node2mkdir -p /home/kafka/data-1mkdir -p /home/kafka/data-2

2.2 建立Zookeeper的Local PV

這裡要在node1、node2這兩個k8s節點上部署3個zookeeper節點,因此先在node1、node2上建立這3個zookeeper節點的Local PV zookeeper-local-pv.yaml:

apiVersion: v1kind: PersistentVolumemetadata: name: data-kafka-zookeeper-0spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/zkdata-0 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node1---apiVersion: v1kind: PersistentVolumemetadata: name: data-kafka-zookeeper-1spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/zkdata-1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2---apiVersion: v1kind: PersistentVolumemetadata: name: data-kafka-zookeeper-2spec: capacity: storage: 5Gi  accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: local-storage local: path: /home/kafka/zkdata-2 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - node2
kubectl apply -f zookeeper-local-pv.yaml

根據上面建立的local pv,在node1上建立目錄/home/kafka/zkdata-0,在node2上建立目錄/home/kafka/zkdata-1和/home/kafka/zkdata-2。

# node1mkdir -p /home/kafka/zkdata-0# node2mkdir -p /home/kafka/zkdata-1mkdir -p /home/kafka/zkdata-2

3.部署Kafka

編寫kafka chart的vaule檔案kafka-values.yaml:

replicas: 3tolerations:- key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule- key: node-role.kubernetes.io/master operator: Exists effect: PreferNoSchedulepersistence: storageClass: local-storage size: 5Gizookeeper: persistence: enabled: true storageClass: local-storage size: 5Gi replicaCount: 3 image: repository: gcr.azk8s.cn/google_samples/k8szk tolerations: - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule - key: node-role.kubernetes.io/master operator: Exists effect: PreferNoSchedule
  • 安裝過程需要使用到gcr.io/google_samples/k8szk:v3等docker映象,切換成使用azure的GCR Proxy Cache:gcr.azk8s.cn。
helm install --name kafka --namespace kafka -f kafka-values.yaml incubator/kafka 

最後需要確認所有的pod都處於running狀態:

kubectl get pod -n kafka -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESkafka-0 1/1 Running 0 12m 10.244.0.61 node1 kafka-1 1/1 Running 0 6m3s 10.244.1.12 node2 kafka-2 1/1 Running 0 2m26s 10.244.1.13 node2 kafka-zookeeper-0 1/1 Running 0 12m 10.244.1.9 node2 kafka-zookeeper-1 1/1 Running 0 11m 10.244.1.10 node2 kafka-zookeeper-2 1/1 Running 0 11m 10.244.1.11 node2 kubectl get statefulset -n kafkaNAME READY AGEkafka 3/3 22mkafka-zookeeper 3/3 22mkubectl get service -n kafkaNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkafka ClusterIP 10.102.8.192  9092/TCP 31mkafka-headless ClusterIP None  9092/TCP 31mkafka-zookeeper ClusterIP 10.110.43.203  2181/TCP 31mkafka-zookeeper-headless ClusterIP None  2181/TCP,3888/TCP,2888/TCP 31m

可以看到當前kafka的helm chart,採用StatefulSet的形式部署了kafka和zookeeper,而我們通過Local PV的形式,將kafka-0排程到node1上,將kafka-1和kafka-2排程到node2上。

4.安裝後的測試

在k8s叢集內執行下面的客戶端Pod,訪問kafka broker進行測試:

apiVersion: v1kind: Podmetadata: name: testclient namespace: kafkaspec: containers: - name: kafka image: confluentinc/cp-kafka:5.0.1 command: - sh - -c - "exec tail -f /dev/null"

建立並進入testclient容器內:

kubectl apply -f testclient.yamlkubectl -n kafka exec testclient -it sh

檢視kafka相關命令:

ls /usr/bin/ | grep kafkakafka-aclskafka-broker-api-versionskafka-configskafka-console-consumerkafka-console-producerkafka-consumer-groupskafka-consumer-perf-testkafka-delegation-tokenskafka-delete-recordskafka-dump-logkafka-log-dirskafka-mirror-makerkafka-preferred-replica-electionkafka-producer-perf-testkafka-reassign-partitionskafka-replica-verificationkafka-run-classkafka-server-startkafka-server-stopkafka-streams-application-resetkafka-topicskafka-verifiable-consumerkafka-verifiable-producer

建立一個Topic test1:

kafka-topics --zookeeper kafka-zookeeper:2181 --topic test1 --create --partitions 1 --replication-factor 1

檢視的Topic:

kafka-topics --zookeeper kafka-zookeeper:2181 --listtest1

5.總結

當前基於Helm官方倉庫的chartincubator/kafka在k8s上部署的kafka,使用的映象是confluentinc/cp-kafka:5.0.1。 即部署的是Confluent公司提供的kafka版本。Confluent Platform Kafka(簡稱CP Kafka)提供了一些Apache Kafka沒有的高階特性,例如跨資料中心備份、Schema註冊中心以及叢集監控工具等。CP Kafka目前分為免費版本和企業版兩種,免費版除了Apache Kafka的標準組件外還包含Schema註冊中心和Rest Proxy。

Confluent Platform and Apache Kafka Compatibility中給出了Confluent Kafka和Apache Kafka的版本對應關係,可以看出這裡安裝的cp 5.0.1對應Apache Kafka的2.0.x。

進入一個broker容器中,檢視:

ls /usr/share/java/kafka | grep kafkakafka-clients-2.0.1-cp1.jarkafka-log4j-appender-2.0.1-cp1.jarkafka-streams-2.0.1-cp1.jarkafka-streams-examples-2.0.1-cp1.jarkafka-streams-scala_2.11-2.0.1-cp1.jarkafka-streams-test-utils-2.0.1-cp1.jarkafka-tools-2.0.1-cp1.jarkafka.jarkafka_2.11-2.0.1-cp1-javadoc.jarkafka_2.11-2.0.1-cp1-scaladoc.jarkafka_2.11-2.0.1-cp1-sources.jarkafka_2.11-2.0.1-cp1-test-sources.jarkafka_2.11-2.0.1-cp1-test.jarkafka_2.11-2.0.1-cp1.jar

可以看到對應apache kafka的版本號是2.11-2.0.1,前面2.11是Scala編譯器的版本,Kafka的伺服器端程式碼是使用Scala語言開發的,後邊2.0.1是Kafka的版本。 即CP Kafka 5.0.1是基於Apache Kafka 2.0.1的。

參考

  • Zookeeper Helm Chart
  • Kafka Helm Chart
  • GCR Proxy Cache 幫助
  • Confluent Platform and Apache Kafka Compatibility