隨着近年來大數據的快速發展和人工智能技術的不斷普及,消息隊列已經成為了大量企業和機構中不可或缺的關鍵組件。其中,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
微信掃一掃
支付寶掃一掃