使用 Terraform 在亚马逊 EKS 中部署 CockroachDB 集群 - AWS 规范指引

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Terraform 在亚马逊 EKS 中部署 CockroachDB 集群

亚马逊 Web Services 的 Sandip Gangapadhyay 和 Kalyan Senthilnathan

Summary

这种模式提供了一个 HashiCorp Terraform 模块,用于使用 CockroachDB 运算符在亚马逊 Elastic Kubernetes Service(Amazon EKS)上部署多节点 Coc kroachDB 集群。CockRoachDB 是一个分布式 SQL 数据库,可跨地理分布的集群提供自动水平分片、高可用性和一致的性能。此模式使用 Amazon EKS 作为托管 Kubernetes 平台,并实现证书管理器用于受 TL S 保护的节点通信。它还使用 Network Load Balancer 进行流量分配,并创建 CockroachDB StatefulSets,其容错能力和性能可自动复制数据。

目标受众

要实现此模式,我们建议您熟悉以下内容:

  • HashiCorp Terraform 概念和基础设施即代码 (IaC) 实践

  • AWS 服务,尤其是 Amazon EKS

  • Kubernetes 基础知识 StatefulSets,包括运算符和服务配置

  • 分布式 SQL 数据库

  • 安全概念,例如 TLS 证书管理。

  • DevOps 实践、 CI/CD 工作流程和基础设施自动化

先决条件和限制

先决条件

限制

产品版本

  • CockroachDB 版本 22.2.2

架构

目标架构

下图显示了虚拟私有云 (VPC) 中跨三个可用区域的高 AWS 可用性 CockroachDB 部署。CockroachDB 吊舱通过亚马逊 EKS 进行管理。该架构说明了用户如何通过 Network Load Balancer 访问数据库,该负载均衡器将流量分配到 CockroachDB 容器。Pod 在每个可用区的亚马逊弹性计算云 (Amazon EC2) 实例上运行,这提供了弹性和容错能力。

在 VPC 内的三个 AWS 可用区域中部署的高可用性 CockroachDB。

资源已创建

部署此模式中使用的 Terraform 模块会创建以下资源:

  1. Network Load Balancer — 此资源充当客户端请求的入口点,并在 CockroachDB 实例之间均匀分配流量。

  2. CockroachDB StatefulSet — StatefulSet 定义了 Amazon EKS 集群中 CockroachDB 部署的所需状态。它管理 CockroachDB 容器的有序部署、扩展和更新。

  3. CockroachDB pod — 这些 pod 是 CockroachDB 在 Kubernetes 容器中作为容器运行的实例。这些 Pod 存储和管理分布式集群中的数据。

  4. CockroachDB 数据库 — 这是由 CockroachDB 管理的分布式数据库,跨越多个 pod。它复制数据以实现高可用性、容错能力和性能。

工具

AWS 服务

其他工具

  • HashiCorp Terraform 是一款基础设施即代码(IaC)工具,可帮助您使用代码来预调配和管理云基础设施和资源。

  • kubectl:针对 Kubernetes 集群运行命令的命令行界面。

代码存储库

此模式的代码可在使用 Terra form 存储库的 Amazon EKS 中 GitHub 部署 CockroachDB 集群中找到。代码存储库包含以下适用于 Terraform 的文件和文件夹:

  • modules文件夹 — 此文件夹包含 CockroachDB 的 Terraform 模块

  • main文件夹 — 此文件夹包含调用 CockroachDB 子模块来创建 CockroachDB 数据库集群的根模块。

最佳实践

  • 不要缩减到少于三个节点。这被认为是 CockroachDB 上的反模式,可能会导致错误。有关更多信息,请参阅 CockroachDB 文档中的集群扩展

  • 使用 Karpernter 或集群自动扩缩器实现 Amazon EKS 自动扩展。这允许 CockroachDB 集群进行水平扩展,并自动添加新节点。有关更多信息,请参阅 Amazon EKS 文档中的使用 Karpenter 和 Cluster Autoscaler 扩展集群计算

    注意

    由于 podAntiAffinity Kubernetes 的调度规则,只能在一个 Amazon EKS 节点中调度一个 CockroachDB 容器。

  • 有关 Amazon EKS 安全最佳实践,请参阅 Amazon EKS 文档中的安全最佳实践。

  • 有关 CockroachDB 的 SQL 性能最佳实践,请参阅 CockroachDB 文档中的 SQL 性能最佳实践

  • 有关为 Terraform 状态文件设置亚马逊简单存储服务 (Amazon S3) 远程后端的更多信息,请参阅 Terraform 文档中的亚马逊 S 3。

操作说明

Task说明所需技能

克隆代码存储库。

输入以下命令来克隆存储库:

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

更新 Terraform 变量。

  1. 输入以下命令以导航到克隆存储库中的主文件夹:

    cd crdb-cluster-eks-terraform/main
  2. 打开变量.tf 文件。

  3. 为以下变量配置默认值:

    • region— 输入目标 AWS 区域

    • eks_cluster_name— 输入目标 Amazon EKS 集群的名称

    • number_of_nodes— 输入要部署的节点数量

  4. 保存并关闭变量.tf 文件。

DevOps 工程师,Terraform
Task说明所需技能

部署基础设施。

  1. 输入以下命令来初始化 Terraform 部署:

    terraform init
  2. 输入以下命令生成执行计划:

    terraform plan
  3. 审查计划,并验证将要创建的资源和基础设施组件。

  4. 输入以下命令部署基础设施:

    terraform apply
  5. 出现提示时,输入确认部署。

  6. 请等待部署完成。

DevOps 工程师,Terraform
Task说明所需技能

验证资源创建。

  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 的数量是否与您在变量.t f 文件中定义的值相匹配。

DevOps 工程师

(可选)向上或向下扩展。

  1. 变量.tf 文件中,增加或减少节点数,然后保存该文件。

  2. 重复上述步骤,通过 Terraform 部署基础架构。Terraform 添加或移除吊舱。

  3. 重复这些步骤以验证使用 Cockroach DB 的 pod 的数量。例如,如果您将节点数量从三个增加到四个,那么现在应该会看到四个 Pod 在运行。

DevOps 工程师,Terraform
Task说明所需技能

删除基础设施。

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 吊舱处于待处理状态

  1. 由于 podAntiAffinity Kubernetes 的调度规则,只能在一个 Amazon EKS 节点中调度一个 CockroachDB 容器。如果 CockroachDB 容器的数量超过可用的 Amazon EKS 节点的数量,那么 CockroachDB 容器可能处于待处理状态。在这种情况下,您需要实现集群自动扩缩器或 Karpenter,这样 Amazon EKS 节点才能自动扩展。有关更多信息,请参阅使用 Karpenter 扩展集群计算和集群自动扩缩器

  2. 输入以下命令,检查 Kubernetes 工作节点是否有node=cockroachdb标签:

    kubectl get nodes --show-labels

    如果不是,则需要确保所有工作节点都已正确标记。有关更多信息,请参阅 Amazon EKS 文档中的编辑节点组配置

相关资源

附件

要访问与此文档相关联的其他内容,请解压以下文件:attachment.zip