打造高可用的Kubernetes Kafka集群

隨著近年來大數據的快速發展和人工智慧技術的不斷普及,消息隊列已經成為了大量企業和機構中不可或缺的關鍵組件。其中,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-tw/n/183185.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 16:27
下一篇 2024-11-24 16:27

相關推薦

  • 使用Go-Redis獲取Redis集群內存使用率

    本文旨在介紹如何使用Go-Redis獲取Redis集群的內存使用率。 一、Go-Redis簡介 Go-Redis是一個用於連接Redis伺服器的Golang客戶端。它支持Redis…

    編程 2025-04-28
  • Python消費Kafka數據指南

    本文將為您詳細介紹如何使用Python消費Kafka數據,旨在幫助讀者快速掌握這一重要技能。 一、Kafka簡介 Kafka是一種高性能和可伸縮的分散式消息隊列,由Apache軟體…

    編程 2025-04-28
  • Kubernetes安裝Drone教程

    本文將通過多個方面詳細介紹如何在Kubernetes中安裝Drone,讓您快速上手使用。 一、前置條件 1、已經安裝了Kubernetes環境 2、擁有一個Github賬戶 3、已…

    編程 2025-04-27
  • Redis5.0集群擴容用法介紹

    Redis是一個內存資料庫,越來越受到開發者的歡迎。在開發中,我們經常需要考慮Redis集群的擴容問題。而Redis5.0針對集群擴容方面進行了多項優化和改進,本文將從多個方面詳細…

    編程 2025-04-27
  • CentOS安裝Kubernetes教程

    一、安裝必備組件 在開始安裝Kubernetes之前,需要安裝一些必備組件: sudo yum install -y yum-utils device-mapper-persist…

    編程 2025-04-25
  • Flink消費Kafka

    一、Flink消費Kafka簡介 Apache Flink是一個分散式流處理引擎,提供在大規模數據上實時計算的能力,同時也支持批處理模式。在結合Kafka使用時,Flink可以通過…

    編程 2025-04-25
  • 淺談Docker集群

    一、Docker簡介 Docker可以理解為是一種容器技術,可以將應用程序及其所有依賴項打包在一個標準化單元中,以便在不同的計算機上交付。這種單元被稱為容器。相比於傳統的虛擬機技術…

    編程 2025-04-24
  • Kubernetes 中的 Service

    一、簡介 Kubernetes 中的 Service 是一個重要的概念,它將一組 Pod 封裝成一個邏輯單元,並提供網路訪問,對外暴露一個統一的 IP 和埠號。這樣,無論後端 P…

    編程 2025-04-24
  • 使用Kubernetes(K8s)搭建分散式系統

    一、Kubernetes概述 Kubernetes是一個用於自動部署、擴展和管理容器化應用程序的開源平台。其提供了高可用性、自我修復能力和易於擴展的特徵,使得大規模、高度可用的分布…

    編程 2025-04-24
  • Docker Redis 集群詳解

    一、Docker Redis 集群簡介 Docker Redis 集群是一種通過 Docker 容器實現的分散式 Redis 資料庫解決方案。通過將 Redis 資料庫實例分散在多…

    編程 2025-04-24

發表回復

登錄後才能評論