使用 Strimzi 將 Apache Kafka 部署至 GKE

本指南說明如何使用 Strimzi 運算子部署 Apache Kafka 叢集。

Kafka 是開放原始碼的分散式訊息系統,專為處理大量、高輸送量和即時串流資料而設計。您可以使用這項服務建構串流資料管道,在不同系統和應用程式之間穩定傳輸資料,以支援處理和分析工作。

運算子是軟體擴充功能,可運用自訂資源管理應用程式及其元件。如要進一步瞭解使用運算子的動機,請參閱開放原始碼 Kubernetes 說明文件中的「運算子模式」。Strimzi 運算子提供彈性的部署選項,並可讓您使用 Kubernetes 汙點和容許度,在專用節點上執行 Kafka。

本指南適用於有興趣在 GKE 上部署 Kafka 叢集的平台管理員、雲端架構師和營運專業人員。

如果您想瞭解如何使用第三方運算子部署 Kafka 叢集,以自動化管理作業並減少錯誤,這項解決方案是個不錯的起點。

目標

  • 規劃及部署 Apache Kafka 的 GKE 基礎架構
  • 部署及設定 Strimzi 運算子
  • 使用 Strimzi 運算子設定 Apache Kafka

優點

Strimzi 具有下列優點:

  • Strimzi 運算子提供簡化的 Kubernetes 原生方法,可管理 Kafka 叢集。Strimzi 會使用代表 Kafka 主題和使用者的自訂資源,讓叢集管理作業更加簡單,並符合 Kubernetes 最佳做法。
  • Strimzi 預設會優先考量安全性,為接聽程式產生憑證,並支援 TLS、SCRAM-SHA 和 OAuth 等安全驗證方法。Strimzi 也會處理所有 Kafka 監聽器的 NetworkPolicy。
  • Strimzi 不依賴外部依附元件。內含 Kafka 和 ZooKeeper 叢集,並內建指標匯出工具,讓您不必再使用其他工具。您也可以微調代理程式設定,以符合特定需求。

部署架構

Kafka 叢集由一或多個伺服器 (稱為代理) 組成,這些伺服器會協同管理傳入的資料串流,並為 Kafka 用戶端 (稱為消費者) 簡化發布/訂閱訊息傳遞作業。

Kafka 叢集中的每個資料分割區都會指派領導代理程式,負責管理該分割區的所有讀取和寫入作業。分割區也可以有一或多個追隨者代理程式,被動複製領導者代理程式的動作。

在一般設定中,ZooKeeper 會協助在代理程式中選擇領導者,並確保發生任何問題時能順利容錯移轉,藉此協調 Kafka 叢集。

您也可以啟用 KRaft 模式,在沒有 Zookeeper 的情況下部署 Kafka 設定,但 Strimzi 社群認為這種方法尚未準備好用於正式環境,因為不支援 KafkaTopic 資源、憑證驗證等。

可用性和災難復原

本教學課程會為 Kafka 和 ZooKeeper 叢集使用不同的節點集區和可用區,確保高可用性,並為災難復原做好準備。

在 Google Cloud 中使用多個節點和可用區,對於實現高可用性 Kubernetes 叢集至關重要,原因如下:

  • 容錯能力:多個節點會在叢集中分配工作負載,確保其中一個節點故障時,其他節點可以接管工作,避免停機和服務中斷。
  • 擴充性:使用多個節點可確保水平調度資源可視需要新增或移除節點,有助於最佳化資源分配,並因應流量或工作負載需求增加的情況。
  • 高可用性:在區域內使用多個可用區,有助於確保備援,並將單點故障的風險降到最低。如果整個可用區發生中斷情形,叢集仍可在其他可用區繼續運作,維持服務可用性。
  • 地理位置備援:將節點分散至各個區域,叢集的資料和服務就會分散至各地,可抵禦天災、停電或其他可能影響單一可用區的區域性中斷事件。
  • 輪流更新和維護:使用多個可用區有助於確保可對個別節點執行輪流更新和維護作業,不會影響叢集的整體可用性。這有助於確保服務不中斷,同時允許系統順利套用必要的更新和修補程式。
  • 服務水準協議 (SLA): Google Cloud 為多區域部署提供 SLA,確保最低運作時間和可用性。

部署圖表

下圖顯示在 GKE 叢集的多個節點和可用區中執行的 Kafka 叢集:

在圖中,Kafka StrimziPodSet 部署在三個不同可用區的三個節點上。如要控管這項設定,請在 StrimziPodSet 自訂資源規格中設定必要的 Pod 親和性和拓撲散布規則。

如果某個可用區發生故障,使用建議的設定時,GKE 會在新節點上重新排定 Pod 的排程,並從其餘副本複製 Kafka 和 Zookeeper 的資料。

下圖顯示 ZooKeeper StrimziPodSet 部署在三個不同可用區的三個節點中:

StrimziPodSet 自訂資源

本教學課程使用 Strimzi 0.29 版導入的StrimziPodSet自訂資源,而非 StatefulSets。

StrimziPodSet 資源可提升叢集的擴充性,並讓您傳遞設定選項,更精細地變更 Pod。在 Strimzi 0.35 以上版本中,StrimziPodSet 資源預設為啟用。

費用

在本文件中,您會使用下列 Google Cloud的計費元件:

如要根據預測用量估算費用,請使用 Pricing Calculator。

初次使用 Google Cloud 的使用者可能符合免費試用期資格。

完成本文所述工作後,您可以刪除建立的資源,避免繼續計費,詳情請參閱「清除所用資源」。

事前準備

  1. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  2. 安裝 Google Cloud CLI。

  3. 若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  4. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  5. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Google Cloud 專案名稱。

  6. 確認專案已啟用計費功能 Google Cloud 。

  7. 如果尚未啟用 Compute Engine、IAM、GKE、GKE 備份和 Resource Manager API,請啟用這些 API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  8. 安裝 Google Cloud CLI。

  9. 若您採用的是外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。

  10. 執行下列指令,初始化 gcloud CLI:

    gcloud init
  11. 建立或選取 Google Cloud 專案。

    選取或建立專案所需的角色

    • 選取專案:選取專案時,不需要具備特定 IAM 角色,只要您在專案中獲派角色,即可選取該專案。
    • 建立專案:如要建立專案,您需要「專案建立者」角色 (roles/resourcemanager.projectCreator),其中包含 resourcemanager.projects.create 權限。瞭解如何授予角色。
    • 建立 Google Cloud 專案:

      gcloud projects create PROJECT_ID

      將 PROJECT_ID 替換為您要建立的 Google Cloud 專案名稱。

    • 選取您建立的 Google Cloud 專案:

      gcloud config set project PROJECT_ID

      將 PROJECT_ID 替換為 Google Cloud 專案名稱。

  12. 確認專案已啟用計費功能 Google Cloud 。

  13. 如果尚未啟用 Compute Engine、IAM、GKE、GKE 備份和 Resource Manager API,請啟用這些 API:

    啟用 API 時所需的角色

    如要啟用 API,您必須具備 serviceusage.services.enable 權限。如果您建立了專案,可能已透過「擁有者」角色 (roles/owner) 取得這項權限。否則,您可以透過「服務使用情形管理員」角色 (roles/serviceusage.serviceUsageAdmin) 取得這項權限。瞭解如何授予角色。

    gcloud services enable compute.googleapis.com iam.googleapis.com container.googleapis.com gkebackup.googleapis.com cloudresourcemanager.googleapis.com
  14. 將角色授予使用者帳戶。針對下列每個 IAM 角色,執行一次下列指令: roles/storage.objectViewer, roles/logging.logWriter, roles/container.clusterAdmin, roles/container.serviceAgent, roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageAdmin, roles/iam.serviceAccountAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    更改下列內容:

    • PROJECT_ID:專案 ID。
    • USER_IDENTIFIER:使用者帳戶的 ID。 例如:myemail@example.com。
    • ROLE:授予使用者帳戶的 IAM 角色。

準備環境

在本教學課程中,您將使用 Cloud Shell 管理 Google Cloud上代管的資源。Cloud Shell 已預先安裝本教學課程所需的軟體,包括 kubectl、gcloud CLI、Helm 和 Terraform。

如要使用 Cloud Shell 設定環境,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,按一下Cloud Shell 啟用圖示Google Cloud 控制台中的「啟用 Cloud Shell」,啟動 Cloud Shell 工作階段。 系統會在 Google Cloud 控制台的底部窗格啟動工作階段。

  2. 設定環境變數:

    export PROJECT_ID=PROJECT_ID
    export KUBERNETES_CLUSTER_PREFIX=kafka
    export REGION=us-central1
    

    將 PROJECT_ID 替換為您的 Google Cloud 專案 ID。

  3. 複製 GitHub 存放區:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    
  4. 變更為目前使用的目錄:

    cd kubernetes-engine-samples/streaming/
    

建立叢集基礎架構

在本節中,您將執行 Terraform 指令碼,建立具有私人節點的高可用性區域 GKE 叢集。下列步驟可讓控制層公開存取。如要限制存取權,請將叢集設為僅透過內部端點公開控制層。

您可以使用標準或 Autopilot 叢集安裝運算子。

標準

下圖顯示包含私有節點的區域標準叢集,GKE 叢集部署在三個不同的可用區:

如要部署這項基礎架構,請從 Cloud Shell 執行下列指令:

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=kafka/terraform/gke-standard init
terraform -chdir=kafka/terraform/gke-standard apply -var project_id=${PROJECT_ID} \
  -var region=${REGION} \
  -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

系統顯示提示訊息時,請輸入 yes。這個指令會在幾分鐘內執行完畢,叢集也會顯示就緒狀態。

Terraform 會建立下列資源:

  • Kubernetes 節點的虛擬私有雲網路和私有子網路。
  • 透過 NAT 存取網際網路的路由器。
  • 位於 us-central1 區域的 GKE 叢集,其中包含私人節點。
  • 2 個已啟用自動調度資源功能的節點集區 (每個可用區 1 到 2 個節點,每個可用區至少 1 個節點)
  • 具備記錄和監控權限的 ServiceAccount。
  • GKE 備份,用於災難復原。
  • Google Cloud Managed Service for Prometheus,用於監控叢集。

輸出結果會與下列內容相似:

...
Apply complete! Resources: 14 added, 0 changed, 0 destroyed.

Outputs:

kubectl_connection_command = "gcloud container clusters get-credentials strimzi-cluster --region us-central1"

Autopilot

下圖顯示具有私人節點的區域 Autopilot 叢集 GKE 叢集:

如要部署基礎架構,請從 Cloud Shell 執行下列指令:

export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
terraform -chdir=kafka/terraform/gke-autopilot init
terraform -chdir=kafka/terraform/gke-autopilot apply -var project_id=${PROJECT_ID} \
  -var region=${REGION} \
  -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}

系統顯示提示訊息時,請輸入 yes。這個指令會在幾分鐘內執行完畢,叢集也會顯示就緒狀態。

Terraform 會建立下列資源:

  • Kubernetes 節點的虛擬私有雲網路和私有子網路。
  • 透過 NAT 存取網際網路的路由器。
  • 位於 us-central1 區域的 GKE 叢集,其中包含私人節點。
  • 具備記錄與監控權限的 ServiceAccount
  • Google Cloud Managed Service for Prometheus,用於監控叢集。

輸出結果會與下列內容相似:

...
Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

Outputs:

kubectl_connection_command = "gcloud container clusters get-credentials strimzi-cluster --region us-central1"

連線至叢集

設定 kubectl 與叢集通訊:

gcloud container clusters get-credentials ${KUBERNETES_CLUSTER_PREFIX}-cluster --region ${REGION}

將 Strimzi 運算子部署至叢集

在本節中,您將使用 Helm 資訊套件部署 Strimzi 運算子。此外,還有其他幾種方式可部署 Strimzi。

  1. 新增 Strimzi Helm 資訊套件存放區:

    helm repo add strimzi https://strimzi.io/charts/
    
  2. 為 Strimzi Operator 和 Kafka 叢集新增命名空間:

    kubectl create ns kafka
    
  3. 使用 Helm 部署 Strimzi 叢集運算子:

    helm install strimzi-operator strimzi/strimzi-kafka-operator -n kafka
    

    如要將 Strimzi Cluster Operator 和 Kafka 叢集部署到不同的命名空間,請在 helm 指令中新增 --set watchNamespaces="{kafka-namespace,kafka-namespace-2,...}" 參數。

  4. 使用 Helm 確認 Strimzi Cluster Operator 是否已成功部署:

    helm ls -n kafka
    

    輸出結果會與下列內容相似:

    NAME            NAMESPACE    REVISION    UPDATED                              STATUS    CHART                        APP VERSION
    strimzi-operator    kafka      1       2023-06-27 11:22:15.850545 +0200 CEST    deployed    strimzi-kafka-operator-0.35.0    0.35.0
    

部署 Kafka

將運算子部署至叢集後,即可部署 Kafka 叢集執行個體。

在本節中,您將以基本設定部署 Kafka,然後嘗試各種進階設定情境,以滿足可用性、安全性及可觀測性需求。

基本設定

Kafka 執行個體的基本設定包含下列元件:

  • 三個 Kafka 代理程式副本,至少要有兩個可用副本,才能確保叢集一致性。
  • 三個 ZooKeeper 節點副本,組成一個叢集。
  • 兩個 Kafka 監聽器:一個不需驗證,另一個使用 TLS 驗證,並搭配 Strimzi 產生的憑證。
  • Kafka 的 Java MaxHeapSize 和 MinHeapSize 設為 4 GB,ZooKeeper 則設為 2 GB。
  • Kafka 和 ZooKeeper 的 CPU 資源配置均為 1 個 CPU 要求和 2 個 CPU 限制,以及 Kafka 的 5 GB 記憶體要求和限制 (主要服務為 4 GB,指標匯出工具為 0.5 GB),以及 ZooKeeper 的 2.5 GB 記憶體要求和限制 (主要服務為 2 GB,指標匯出工具為 0.5 GB)。
  • 實體運算子,具有下列要求和限制:
    • tlsSidecar:100 m/500 m CPU 和 128 Mi 記憶體。
    • topicOperator:100 m/500 m CPU 和 512 Mi 記憶體。
    • userOperator:500 m CPU 和 2 Gi 記憶體。
  • 每個 Pod 分配 100 GB 的儲存空間,使用 premium-rwo storageClass。
  • 為每個工作負載設定容許條件、nodeAffinity 和 podAntiAffinity,確保工作負載適當分配到各個節點,並使用各自的節點集區和不同可用區。
  • 叢集內部的通訊受到自行簽署的憑證保護:叢集和用戶端 (mTLS) 各有不同的憑證授權單位 (CA)。您也可以設定使用其他憑證授權單位。

這項設定代表建立可供實際工作環境使用的 Kafka 叢集所需的最低設定。以下各節將示範自訂設定,以解決叢集安全性、存取控制清單 (ACL)、主題管理、憑證管理等問題。

建立基本 Kafka 叢集

  1. 使用基本設定建立新的 Kafka 叢集:

    kubectl apply -n kafka -f kafka-strimzi/manifests/01-basic-cluster/my-cluster.yaml
    

    這個指令會建立 Strimzi 運算子的 Kafka 自訂資源,其中包含 CPU 和記憶體要求與限制、區塊儲存空間要求,以及用於在 Kubernetes 節點間分配佈建 Pod 的汙點和親和性組合。

  2. 請稍候幾分鐘,讓 Kubernetes 啟動必要的工作負載:

    kubectl wait kafka/my-cluster --for=condition=Ready --timeout=600s -n kafka
    
  3. 確認已建立 Kafka 工作負載:

    kubectl get pod,service,deploy,pdb -l=strimzi.io/cluster=my-cluster -n kafka
    

    輸出結果會與下列內容相似:

    NAME                                            READY   STATUS  RESTARTS   AGE
    pod/my-cluster-entity-operator-848698874f-j5m7f   3/3   Running   0        44m
    pod/my-cluster-kafka-0                          1/1   Running   0        5m
    pod/my-cluster-kafka-1                          1/1   Running   0        5m
    pod/my-cluster-kafka-2                          1/1   Running   0        5m
    pod/my-cluster-zookeeper-0                      1/1   Running   0        6m
    pod/my-cluster-zookeeper-1                      1/1   Running   0        6m
    pod/my-cluster-zookeeper-2                      1/1   Running   0        6m
    
    NAME                                TYPE      CLUSTER-IP   EXTERNAL-IP   PORT(S)                             AGE
    service/my-cluster-kafka-bootstrap  ClusterIP   10.52.8.80   <none>      9091/TCP,9092/TCP,9093/TCP          5m
    service/my-cluster-kafka-brokers    ClusterIP   None         <none>      9090/TCP,9091/TCP,9092/TCP,9093/TCP   5m
    service/my-cluster-zookeeper-client   ClusterIP   10.52.11.144   <none>      2181/TCP                            6m
    service/my-cluster-zookeeper-nodes  ClusterIP   None         <none>      2181/TCP,2888/TCP,3888/TCP          6m
    
    NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/my-cluster-entity-operator   1/1   1          1         44m
    
    NAME                                            MIN AVAILABLE   MAX UNAVAILABLE   ALLOWED DISRUPTIONS   AGE
    poddisruptionbudget.policy/my-cluster-kafka     2             N/A             1                   5m
    poddisruptionbudget.policy/my-cluster-zookeeper   2             N/A             1                   6m
    

運算子會建立下列資源:

  • Kafka 和 ZooKeeper 各兩個 StrimziPodSets。
  • Kafka 代理程式副本的三個 Pod。
  • 三個 ZooKeeper 副本的 Pod。
  • 兩個 PodDisruptionBudgets,確保叢集一致性至少有兩個副本可用。
  • 名為 my-cluster-kafka-bootstrap 的 Service,可做為從 Kubernetes 叢集內連線的 Kafka 用戶端啟動伺服器。這項服務提供所有內部 Kafka 監聽器。
  • 名為 my-cluster-kafka-brokers 的無標頭 Service,可直接解析 Kafka 代理程式 Pod IP 位址的 DNS。這項服務用於代理程式間的通訊。
  • 名為 my-cluster-zookeeper-client 的服務,可讓 Kafka 代理程式以用戶端身分連線至 ZooKeeper 節點。
  • 名為 my-cluster-zookeeper-nodes 的無頭 Service,可直接解析 ZooKeeper Pod IP 位址的 DNS。這項服務用於連線至 ZooKeeper 副本。
  • 名為 my-cluster-entity-operator 的部署作業,其中包含 topic-operator 和 user-operator,並可協助管理自訂資源 KafkaTopics 和 KafkaUsers。

您也可以設定兩個 NetworkPolicies,方便從任何 Pod 和命名空間連線至 Kafka 監聽器。這些政策也會限制與 ZooKeeper 的連線,僅限於代理程式,並啟用叢集 Pod 與內部服務連接埠之間的通訊,僅供叢集通訊使用。

驗證和使用者管理

本節說明如何啟用驗證和授權,確保 Kafka 監聽器安全無虞,並與用戶端共用憑證。

Strimzi 提供 Kubernetes 原生方法,可透過個別的 User Operator 和對應的 Kubernetes 自訂資源 KafkaUser (定義使用者設定) 管理使用者。使用者設定包括驗證和授權設定,並在 Kafka 中佈建對應的使用者。

Strimzi 可以建立支援多種驗證機制的 Kafka 監聽器和使用者,例如以使用者名稱和密碼為基礎的驗證 (SCRAM-SHA-512) 或 TLS。您也可以使用 OAuth 2.0 驗證,相較於使用密碼或憑證進行驗證,OAuth 2.0 通常被認為是更好的方法,因為它具有安全性,且可管理外部憑證。

部署 Kafka 叢集

本節說明如何部署 Strimzi 運算子,示範使用者管理功能,包括:

  • 在其中一個監聽器上啟用密碼驗證 (SCRAM-SHA-512) 的 Kafka 叢集。
  • 包含 3 個副本的 KafkaTopic。
  • KafkaUser,並透過 ACL 指定使用者對該主題擁有讀取和寫入權限。
  1. 將 Kafka 叢集設定為在通訊埠 9094 上使用具備密碼式 SCRAM-SHA-512 驗證的監聽器,以及簡單授權:

    kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/my-cluster.yaml
    
  2. 建立 Topic、User 和用戶端 Pod,針對 Kafka 叢集執行指令:

    kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/topic.yaml
    kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/my-user.yaml
    

    Secret my-user 會以磁碟區的形式,掛接至用戶端 Pod。

    這些憑證會確認使用者有權使用已啟用密碼驗證 (SCRAM-SHA-512) 的接聽程式,將訊息發布至主題。

  3. 建立用戶端 Pod:

    kubectl apply -n kafka -f kafka-strimzi/manifests/03-auth/kafkacat.yaml
    
  4. 請稍待幾分鐘,讓用戶端 Pod 變成 Ready,然後連線至該 Pod:

    kubectl wait --for=condition=Ready pod --all -n kafka --timeout=600s
    kubectl exec -it kafkacat -n kafka -- /bin/sh
    
  5. 使用 my-user 憑證產生新訊息,然後嘗試取用:

    echo "Message from my-user" |kcat \
      -b my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9094 \
      -X security.protocol=SASL_SSL \
      -X sasl.mechanisms=SCRAM-SHA-512 \
      -X sasl.username=my-user \
      -X sasl.password=$(cat /my-user/password) \
      -t my-topic -P
    kcat -b my-cluster-kafka-bootstrap.kafka.svc.cluster.local:9094 \
      -X security.protocol=SASL_SSL \
      -X sasl.mechanisms=SCRAM-SHA-512 \
      -X sasl.username=my-user \
      -X sasl.password=$(cat /my-user/password) \
      -t my-topic -C
    

    輸出結果會與下列內容相似:

    Message from my-user
    % Reached end of topic my-topic [0] at offset 0
    % Reached end of topic my-topic [2] at offset 1
    % Reached end of topic my-topic [1] at offset 0
    

    輸入 CTRL+C 即可停止消費者程序。

  6. 退出 Pod Shell

    exit
    

備份與災難復原

雖然 Strimzi 運算子未提供內建備份功能,但您可以按照特定模式實作有效的備份策略。

您可以使用 GKE 備份功能備份下列項目:

  • Kubernetes 資源資訊清單。
  • 從備份叢集的 Kubernetes API 伺服器擷取的 Strimzi API 自訂資源及其定義。
  • 與資訊清單中 PersistentVolumeClaim 資源對應的卷宗。

您也可以備份使用 Strimzi 運算子部署的 Kafka 叢集。建議備份的資料:

  • Kafka 設定,包括 Strimzi API 的所有自訂資源,例如 KafkaTopics 和 KafkaUsers。
  • 資料會儲存在 Kafka 代理程式的 PersistentVolume 中。

將 Kubernetes 資源資訊清單 (包括 Strimzi 設定) 儲存在 Git 存放區中,就不必為 Kafka 設定另外備份,因為必要時,資源可以重新套用至新的 Kubernetes 叢集。

為確保在 Kafka 伺服器執行個體或部署 Kafka 的 Kubernetes 叢集遺失時,Kafka 資料能夠復原,建議您將用於為 Kafka 代理程式佈建磁碟區的 Kubernetes 儲存空間級別,設定為 reclaimPolicy 選項設為 Retain。我們也建議您為 Kafka 代理程式磁碟區建立快照。

以下資訊清單說明使用 reclaimPolicy 選項 Retain 的 StorageClass:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: premium-rwo-retain
...
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

以下範例顯示新增至 Kafka 叢集自訂資源 spec 的 StorageClass:

# ...
spec:
  kafka:
    # ...
    storage:
      type: persistent-claim
      size: 100Gi
      class: premium-rwo-retain

透過這項設定,即使刪除對應的 PersistentVolumeClaim,使用儲存空間類別佈建的 PersistentVolume 也不會刪除。

如要使用現有設定和代理程式執行個體資料,在新 Kubernetes 叢集上復原 Kafka 執行個體,請按照下列步驟操作:

  1. 將現有的 Strimzi Kafka 自訂資源 (Kakfa、KafkaTopic、KafkaUser 等) 套用至新的 Kubernetes 叢集
  2. 使用 PersistentVolumeClaim 的 spec.volumeName 屬性,將 PersistentVolumeClaims 更新為舊 PersistentVolumes 的新 Kafka 代理程式執行個體名稱。

清除所用資源

為避免因為本教學課程所用資源,導致系統向 Google Cloud 收取費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

    刪除 Google Cloud 專案:

    gcloud projects delete PROJECT_ID

刪除個別資源

如果您使用現有專案,但不想刪除專案,請刪除個別資源。

  1. 設定環境變數。

    export PROJECT_ID=${PROJECT_ID}
    export KUBERNETES_CLUSTER_PREFIX=kafka
    export REGION=us-central1
    
  2. 執行 terraform destroy 指令:

    export GOOGLE_OAUTH_ACCESS_TOKEN=$(gcloud auth print-access-token)
    terraform -chdir=kafka/terraform/FOLDER destroy -var project_id=${PROJECT_ID}   \
      -var region=${REGION}  \
      -var cluster_prefix=${KUBERNETES_CLUSTER_PREFIX}
    

    將 FOLDER 替換為 gke-autopilot 或 gke-standard。

    系統顯示提示訊息時,請輸入 yes。

  3. 找出所有未連接的磁碟:

    export disk_list=$(gcloud compute disks list --filter="-users:* AND labels.name=${KUBERNETES_CLUSTER_PREFIX}-cluster" --format "value[separator=|](name,zone)")
    

    這是因為 Strimzi 預設會使用 deleteClaim: false 參數做為儲存空間。刪除叢集後,所有磁碟仍可使用。

  4. 刪除磁碟:

    for i in $disk_list; do
      disk_name=$(echo $i| cut -d'|' -f1)
      disk_zone=$(echo $i| cut -d'|' -f2|sed 's|.*/||')
      echo "Deleting $disk_name"
      gcloud compute disks delete $disk_name --zone $disk_zone --quiet
    done
    

後續步驟