隨着近年來大數據的快速發展和人工智能技術的不斷普及,消息隊列已經成為了大量企業和機構中不可或缺的關鍵組件。其中,Kafka 由於其高性能、高可用以及可擴展性等特點而備受青睞,成為了流行的分佈式消息系統之一。而在雲環境中部署 Kubernetes Kafka 集群,可以大幅度簡化 Kafka 部署和管理,從而提高生產力、便捷可靠地進行Kafka 開發。本篇文章將從多個方面講解如何打造高可用的Kubernetes Kafka 集群,包括集群架構、存儲、網絡等,以滿足實際業務需求。
一、集群架構
Kafka 可以在 Kubernetes 上部署成為一個分佈式的結構,這裡的部署方式有不同的選擇。下面,我們介紹一種主要的架構方式:
spec: replicas: 3 # 設置3個副本形成一個 Kafka 集群 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 maxSurge: 1 template: metadata: labels: app: kafka spec: containers: - name: kafka image: wurstmeister/kafka:2.13-2.8.1 ports: - containerPort: 9092 # 配置 Kafka 端口,服務監聽端口 env: - name: KAFKA_ADVERTISED_HOST_NAME # 配置 hostname value: kafka-lb.example.com - name: KAFKA_ADVERTISED_PORT value: "9092" - name: KAFKA_ZOOKEEPER_CONNECT # 配置 ZooKeeper value: "zookeeper-1:2181,zookeeper-2:2181,zookeeper-3:2181"
通過上述代碼部署了一個 Kubernetes Kafka 集群,其中 Kafka 節點數量為 3 台,支持節點的水平擴展。同時,使用 Rolling Update 策略能夠保證 Kafka 集群的正常運轉,並且在節點平滑升級時不會影響生產環境服務的持續提供。使用 KAFKA_ZOOKEEPER_CONNECT 指向 Zookeeper 節點,這裡採用 3 台機器作為 Zookeeper 集群,保證了數據的高可用。
二、存儲
Kafka 數據存儲使用本地磁盤進行存儲,這種方式會面臨磁盤容量不足,或者節點宕機的風險。為了解決這些問題,我們可以使用 Kubernetes 的 PV 和 PVC 技術,來對 Kafka 數據進行持久化存儲。
通過下方代碼示例創建 Kafka 集群所需的這個 PersistentVolumeClaim:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kafka-pvc spec: resources: requests: storage: 10Gi # 申請10GB的存儲容量 accessModes: - ReadWriteOnce storageClassName: standard
此代碼部分定義了一個名為 kafka-pvc 的 PersistenceVolumeClaim 對象,用於在系統中申請10 GB 的存儲空間。同時,定義 storageClassName 手動連接 Kubernetes 集群中的 StorageClass,從而完成集群存儲的自動化配置。
三、網絡
與大部分微服務中的網絡解決方案不同,Kafka 的協議是默認使用明文 socket 方式傳輸的,考慮到網絡傳輸中的數據安全問題,建議採用 HTTPS 進行數據保護。此時,需要使用 Kubernetes 的 ingress 和 HTTPS 協議。其配置方式如下:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: kafka-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt" spec: tls: - hosts: - kafka-lb.example.com secretName: kafka-tls-secret rules: - host: kafka-lb.example.com http: paths: - backend: serviceName: kafka-svc servicePort: 443
通過以上代碼部署,我們定義了一個基於 TLS 的安全數據傳輸方案,以解決網絡傳輸中的安全性問題。可以看到,這裡採用的是 Nginx Ingress Controller ,當環境中租戶對訪問服務的域名進行 HTTPS 請求時,用戶請求會首先被 Nginx 實例負載 IP 轉發至內部 Kafka 服務,並且將協議轉變為對應的 HTTP。
四、監控
Kafka 集群的監控是保障其高可用的前提。在 Kubernetes 環境中,我們通常使用 Prometheus 和 Grafana 來實現 Kafka 集群的監控
以下為採用標準的 Prometheus Operator 方式實現監控的代碼:
apiVersion: monitoring.coreos.com/v1 kind: Prometheus metadata: name: kafka-prometheus labels: app: prometheus spec: replicas: 1 storage: volumeClaimTemplate: metadata: name: prometheus-data spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi volumeMode: Filesystem serviceAccountName: prometheus serviceMonitorSelector: matchLabels: app: kafka namespaceSelector: matchNames: - kafka ruleSelector: matchLabels: app: kafka matchExpressions: - key: job operator: In values: - kafka-exporter alerting: alertmanagers: - namespace: monitoring name: alertmanager-main port: web
使用 Prometheus Operator 可以自動化進行 Kafka 集群的監控數據收集,而且在 Prometheus collect 的時候,還可以使用 Kafka Exporter 從 Kafka node 獲取應用指標數據。除此之外,我們可以通過 Grafana 顯示出收集到的 Kafka 相關數據,如下所示:
五、實現各節點的高可用
為了實現 Kafka 集群的高可用,我們需要在集群中設置 leader 和 follower 節點,從而實現 Kafka 副本之間數據的複製,以實現高可用。
對於服務器故障等單點問題,我們可以使用熱備節點的方式來解決,具體代碼如下所示:
apiVersion: v1 kind: Pod metadata: name: kafka-0 labels: broker.id: "0" spec: containers: - name: kafka image: wurstmeister/kafka:2.13-2.8.1 env: - name: KAFKA_BROKER_ID value: "0" - name: KAFKA_ADVERTISED_HOST_NAME value: kafka.example.com - name: KAFKA_META_BROKER_LIST value: "kafka-0:9092,kafka-1:9092,kafka-2:9092" - name: KAFKA_ZOOKEEPER_CONNECT value: "zk-0:2181,zk-1:2181,zk-2:2181/kafka" ports: - containerPort: 9092 volumeMounts: - name: kafka-data mountPath: /var/lib/kafka - name: config-volume mountPath: /opt/kafka/config/kafka-0.properties subPath: kafka-0.properties volumes: - name: kafka-data persistentVolumeClaim: claimName: pvc-kafka-0 - name: config-volume configMap: name: kafka-config-map items: - key: kafka-0.properties path: kafka-0.properties defaultMode: 420
上述代碼中定義了一個名為 kafka-0 的副本,用於備份 Kafka 集群中的數據。如此一來,當 Kafka 集群中某一台主節點宕機時,副本節點會接替主節點的職責,實現高可用。
六、總結
本文介紹了如何在 Kubernetes 環境下打造高可用的 Kafka 集群,分別從高可用架構、存儲、網絡、監控以及實現各節點的高可用等方面進行了詳細講解,是初學者學習 Kubernetes Kafka 集群的一篇不可多得的好文章。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/183185.html