使用 Terraform 在 Amazon EKS 中部署 CockroachDB 叢集 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Terraform 在 Amazon EKS 中部署 CockroachDB 叢集

Sandip Gangapadhyay 和 Kalyan Senthilnathan,Amazon Web Services

總結

此模式提供 HashiCorp Terraform 模組,用於使用 CockroachDB 運算子在 Amazon Elastic Kubernetes Service (Amazon EKS) 上部署多節點 CockroachDB 叢集。CockroachDB 是分散式 SQL 資料庫,可在地理分佈叢集中提供自動水平分片、高可用性和一致的效能。此模式使用 Amazon EKS 作為受管 Kubernetes 平台,並實作 cert-manager 進行 TLS 安全節點通訊。它還使用 Network Load Balancer 進行流量分佈,並使用 Pod 建立 CockroachDB StatefulSets,以自動複寫資料以實現容錯能力和效能。

目標對象

若要實作此模式,建議您熟悉下列項目:

  • HashiCorp Terraform 概念和基礎設施即程式碼 (IaC) 實務

  • AWS 服務,特別是 Amazon EKS

  • Kubernetes 基本概念,包括 StatefulSets、運算子和服務組態

  • 分散式 SQL 資料庫

  • 安全概念,例如 TLS 憑證管理。

  • DevOps 實務、CI/CD 工作流程和基礎設施自動化

先決條件和限制

先決條件

限制

  • CockroachDB Kubernetes Operator 不支援多區域部署的多個 Kubernetes 叢集。如需更多限制,請參閱跨多個 Kubernetes 叢集協調 CockroachDB (CockroachDB 文件) 和 CockroachDB Kubernetes Operator (GitHub)。

  • 持久性磁碟區宣告 (PVCs的自動剔除目前預設為停用。這表示在解除委任並移除節點之後,運算子不會移除掛載至其 Pod 的持久性磁碟區。如需詳細資訊,請參閱 CockroachDB 文件中的自動 PVC 剔除

產品版本

  • CockroachDB 22.2.2 版

Architecture

目標架構

下圖顯示虛擬私有雲端 (VPC) 中三個 AWS 可用區域的高可用性 CockroachDB 部署。CockroachDB Pod 是透過 Amazon EKS 管理。架構說明使用者如何透過 Network Load Balancer 存取資料庫,將流量分配到 CockroachDB Pod。在每個可用區域中的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體上執行的 Pod,可提供彈性和容錯能力。

在 VPC 內三個 AWS 可用區域中部署高可用性的 CockroachDB。

已建立資源

部署此模式中使用的 Terraform 模組會建立下列資源:

  1. Network Load Balancer – 此資源可做為用戶端請求的進入點,並將流量平均分配到 CockroachDB 執行個體。

  2. CockroachDB StatefulSet – StatefulSet 定義 Amazon EKS 叢集中 CockroachDB 部署的所需狀態。它會管理 CockroachDB Pod 的排序部署、擴展和更新。

  3. CockroachDB Pod – 這些 Pod 是做為 Kubernetes Pod 內容器執行的 CockroachDB 執行個體。這些 Pod 會跨分散式叢集存放和管理資料。

  4. CockroachDB 資料庫 – 這是由 CockroachDB 管理的分散式資料庫,跨越多個 Pod。它會複寫資料以實現高可用性、容錯能力和效能。

工具

AWS 服務

其他工具

  • HashiCorp Terraform 是一種基礎設施即程式碼 (IaC) 工具,可協助您使用程式碼來佈建和管理雲端基礎設施和資源。

  • kubectl 是一種命令列界面,可協助您針對 Kubernetes 叢集執行命令。

程式碼儲存庫

此模式的程式碼可在 GitHub 中使用 Terraform 儲存庫在 Amazon EKS 中部署 CockroachDB 叢集中取得。程式碼儲存庫包含下列適用於 Terraform 的檔案和資料夾:

  • modules 資料夾 – 此資料夾包含 CockroachDB 的 Terraform 模組

  • main 資料夾 – 此資料夾包含呼叫 CockroachDB 子模組的根模組,以建立 CockroachDB 資料庫叢集。

最佳實務

  • 請勿縮減至少於三個節點。這被視為 CockroachDB 上的反模式,並可能導致錯誤。如需詳細資訊,請參閱 CockroachDB 文件中的叢集擴展

  • 使用 Karpernter 或 Cluster Autoscaler 實作 Amazon EKS 自動擴展。這可讓 CockroachDB 叢集自動水平擴展和自動擴展新節點。如需詳細資訊,請參閱 Amazon EKS 文件中的使用 Karpenter 和 Cluster Autoscaler 擴展叢集運算

    注意

    由於 podAntiAffinity Kubernetes 排程規則,在一個 Amazon EKS 節點中只能排程一個 CockroachDB Pod。

  • 如需 Amazon EKS 安全最佳實務,請參閱 Amazon EKS 文件中的安全最佳實務

  • 如需 CockroachDB 的 SQL 效能最佳實務,請參閱 CockroachDB 文件中的 SQL 效能最佳實務

  • 如需為 Terraform 狀態檔案設定 Amazon Simple Storage Service (Amazon S3) 遠端後端的詳細資訊,請參閱 Terraform 文件中的 Amazon S3

史詩

任務Description所需的技能

複製程式碼儲存庫。

輸入下列命令來複製儲存庫:

git clone https://github.com/aws-samples/crdb-cluster-eks-terraform.git
DevOps 工程師,Git

更新 Terraform 變數。

  1. 輸入下列命令以導覽至複製儲存庫中的主資料夾:

    cd crdb-cluster-eks-terraform/main
  2. 開啟 variable.tf 檔案。

  3. 設定下列變數的預設值:

    • region – 輸入目標 AWS 區域

    • eks_cluster_name – 輸入目標 Amazon EKS 叢集的名稱

    • number_of_nodes – 輸入要部署的節點數量

  4. 儲存並關閉 variable.tf 檔案。

DevOps 工程師,Terraform
任務Description所需的技能

部署 基礎設施。

  1. 輸入下列命令來初始化 Terraform 部署:

    terraform init
  2. 輸入下列命令來產生執行計畫:

    terraform plan
  3. 檢閱計劃,並驗證要建立的資源和基礎設施元件。

  4. 輸入下列命令來部署基礎設施:

    terraform apply
  5. 出現提示時,請輸入 yes 以確認部署。

  6. 等待部署完成。

DevOps 工程師,Terraform
任務Description所需的技能

驗證資源建立。

  1. 輸入下列命令以使用 設定 Amazon EKS 內容 AWS CLI:

    aws eks update-kubeconfig —name <eks_cluster_name>
  2. 輸入下列命令來驗證使用 CockroachDB 的 Pod 數量:

    kubectl get pods -n <namespace>

    下列為範例輸出。

    NAME READY STATUS RESTARTS AGE cockroach-operator-655fbf7847-zn9v8 1/1 Running 0 30m cockroachdb-0 1/1 Running 0 24m cockroachdb-1 1/1 Running 0 24m cockroachdb-2 1/1 Running 0 24m
  3. 確認 Pod 數量符合您在 variable.tf 檔案中定義的值。

DevOps 工程師

(選用) 向上或向下擴展。

  1. variable.tf 檔案中,增加或減少節點數量,然後儲存檔案。

  2. 重複這些步驟,透過 Terraform 部署基礎設施。Terraform 新增或移除 Pod。

  3. 重複這些步驟來驗證使用 Cockroach 資料庫的 Pod 數量。例如,如果您將節點數量從三個增加到四個,您現在應該會看到四個 Pod 正在執行。

DevOps 工程師,Terraform
任務Description所需的技能

刪除基礎設施。

將節點擴展至 0可降低運算成本。不過,對於此模組建立的持久性 Amazon EBS 磁碟區,您仍需支付費用。若要降低儲存成本,請依照下列步驟刪除所有磁碟區:

  1. 輸入下列命令來刪除基礎設施:

    terraform destroy
  2. 出現提示時,輸入 yes 進行確認。

Terraform

疑難排解

問題解決方案

驗證供應商登入資料時發生錯誤

當您執行 Terraform applydestroy命令時,您可能會遇到下列錯誤:

Error: configuring Terraform AWS Provider: error validating provider  credentials: error calling sts:GetCallerIdentity: operation error STS: GetCallerIdentity, https response error StatusCode: 403, RequestID: 123456a9-fbc1-40ed-b8d8-513d0133ba7f, api error InvalidClientTokenId: The security token included in the request is invalid.

此錯誤是由本機電腦組態中使用的登入資料的安全字符過期所造成。如需如何解決錯誤的指示,請參閱 AWS CLI 文件中的設定和檢視組態設定

處於待定狀態的 CockroachDB Pod

  1. 由於 podAntiAffinity Kubernetes 排程規則,在一個 Amazon EKS 節點中只能排程一個 CockroachDB Pod。如果 CockroachDB Pod 的數量超過可用的 Amazon EKS 節點數量,則 CockroachDB Pod 可能處於待定狀態。在這種情況下,您需要實作 Cluster Autoscaler 或 Karpenter,以便theAmazon EKS 節點自動擴展。如需詳細資訊,請參閱使用 Karpenter 擴展叢集運算和 Cluster Autoscaler

  2. 輸入下列命令,檢查 Kubernetes 工作者節點是否有node=cockroachdb標籤:

    kubectl get nodes --show-labels

    如果沒有,您需要確保所有工作者節點都已正確標記。如需詳細資訊,請參閱 Amazon EKS 文件中的編輯節點群組組態

相關資源

附件

若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip