

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

# 使用 Terraform 在亚马逊 EKS 中部署 CockroachDB 集群
<a name="deploy-cockroachdb-on-eks-using-terraform"></a>

*亚马逊 Web Services 的 Sandip Gangapadhyay 和 Kalyan Senthilnathan*

## Summary
<a name="deploy-cockroachdb-on-eks-using-terraform-summary"></a>

[这种模式提供了一个 HashiCorp Terraform 模块，用于使用 [CockroachDB 运算符在亚马逊 Elastic Kubernetes Service（Amazon EKS）上部署多节点 Coc](https://www.cockroachlabs.com/docs/stable/) kroachDB 集群。](https://www.cockroachlabs.com/docs/v25.4/cockroachdb-operator-overview)CockRoachDB 是一个分布式 SQL 数据库，可跨地理分布的集群提供自动水平分片、高可用性和一致的性能。此模式使用 Amazon EKS 作为托管 Kubernetes 平台，并实现[证书管理器用于受 TL](https://cert-manager.io/docs/) S 保护的节点通信。它还使用 [Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/introduction.html) 进行流量分配，并创建 CockroachDB [StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)，其容错能力和性能可自动复制数据。

**目标受众**

要实现此模式，我们建议您熟悉以下内容：
+ HashiCorp Terraform 概念和基础设施即代码 (IaC) 实践
+ AWS 服务，尤其是 Amazon EKS
+ Kubernetes 基础知识 StatefulSets，包括运算符和服务配置
+ 分布式 SQL 数据库
+ 安全概念，例如 TLS 证书管理。
+ DevOps 实践、 CI/CD 工作流程和基础设施自动化

## 先决条件和限制
<a name="deploy-cockroachdb-on-eks-using-terraform-prereqs"></a>

**先决条件**
+ 活跃的 AWS 账户
+ 在 Amazon EKS 集群中部署资源的权限
+ Amazon EKS 集群版本 1.23 或更高版本，其节点标记为 `node=cockroachdb`
+ [Amazon Elastic Block Store 容器存储接口 (CSI) 驱动程序](https://github.com/kubernetes-sigs/aws-ebs-csi-driver)版本 1.19.0 或更高版本，安装在 Amazon EKS 集群中
+ [Terraform CLI 版本 1.0.0 或更高版本，已安装](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)
+ [kubectl，已安装](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)
+ Git，[已安装](https://git-scm.com/install/)
+ AWS Command Line Interface [(AWS CLI) 版本 2.9.18 或更高版本，[已安装并配置](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)

**限制**
+ CockroachDB Kubernetes 运营商不支持多个 Kubernetes 集群进行多区域部署。[有关更多限制，请参阅[跨多个 Kubernetes 集群编排 CockroachDB（CockroachDB 文档）和 CockroachDB Kubernetes](https://www.cockroachlabs.com/docs/stable/orchestrate-cockroachdb-with-kubernetes-multi-cluster.html#eks) Operator ()。](https://github.com/cockroachdb/cockroach-operator) GitHub
+ 默认情况下，永久卷声明的自动修剪功能 (PVCs) 处于禁用状态。这意味着，在停用和移除节点后，操作员将不会移除已安装到其 pod 上的永久卷。有关更多信息，请参阅 CockroachDB 文档中的[自动 PVC 修剪](https://www.cockroachlabs.com/docs/stable/scale-cockroachdb-kubernetes.html#automatic-pvc-pruning)。

**产品版本**
+ CockroachDB 版本 22.2.2

## 架构
<a name="deploy-cockroachdb-on-eks-using-terraform-architecture"></a>

**目标架构**

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

![在 VPC 内的三个 AWS 可用区域中部署的高可用性 CockroachDB。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/e22d81ab-b85c-4709-8579-4c9cdb4afdb6/images/4b163abf-6fdc-4310-840c-bda621ab25dd.png)


**资源已创建**

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

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

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

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

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

## 工具
<a name="deploy-cockroachdb-on-eks-using-terraform-tools"></a>

**AWS 服务**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) 是一个开源工具，可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。
+ [亚马逊 Elastic Kubernetes Service（亚马逊](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) EKS）可帮助你在上面运行 AWS Kubernetes，而无需安装或维护自己的 Kubernetes 控制平面或节点。

**其他工具**
+ [HashiCorp Terraform](https://www.terraform.io/docs) 是一款基础设施即代码（IaC）工具，可帮助您使用代码来预调配和管理云基础设施和资源。
+ [kubectl](https://kubernetes.io/docs/tasks/tools/)：针对 Kubernetes 集群运行命令的命令行界面。

**代码存储库**

此模式的代码可在使用 Terra [form 存储库的 Amazon EKS 中 GitHub 部署 CockroachDB 集群中](https://github.com/aws-samples/crdb-cluster-eks-terraform)找到。代码存储库包含以下适用于 Terraform 的文件和文件夹：
+ `modules`文件夹 — 此文件夹包含 CockroachDB 的 Terraform 模块
+ `main`文件夹 — 此文件夹包含调用 CockroachDB 子模块来创建 CockroachDB 数据库集群的根模块。

## 最佳实践
<a name="deploy-cockroachdb-on-eks-using-terraform-best-practices"></a>
+ 不要缩减到少于三个节点。这被认为是 CockroachDB 上的反模式，可能会导致错误。有关更多信息，请参阅 CockroachDB 文档中的[集群扩展](https://www.cockroachlabs.com/docs/stable/scale-cockroachdb-kubernetes.html)。
+ 使用 Karpernter 或集群自动扩缩器实现 Amazon EKS 自动扩展。这允许 CockroachDB 集群进行水平扩展，并自动添加新节点。有关更多信息，请参阅 Amazon EKS 文档中的[使用 Karpenter 和 Cluster Autoscaler 扩展集群计算](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html)。
**注意**  
由于 `podAntiAffinity` Kubernetes 的调度规则，只能在一个 Amazon EKS 节点中调度一个 CockroachDB 容器。
+ 有关 Amazon EKS 安全最佳实践，请参阅 Amazon EKS 文档中的[安全最佳实](https://docs.aws.amazon.com/eks/latest/best-practices/security.html)践。
+ 有关 CockroachDB 的 SQL 性能最佳实践，请参阅 CockroachDB 文档中的 [SQL 性能最佳实践](https://www.cockroachlabs.com/docs/stable/performance-best-practices-overview.html)。
+ 有关为 Terraform 状态文件设置亚马逊简单存储服务 (Amazon S3) 远程后端的更多信息，请参阅 Terraform 文档中的亚马逊 [S](https://developer.hashicorp.com/terraform/language/backend/s3) 3。

## 操作说明
<a name="deploy-cockroachdb-on-eks-using-terraform-epics"></a>

### 设置您的环境
<a name="set-up-your-environment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 克隆代码存储库。 | 输入以下命令来克隆存储库：<pre>git clone https://github.com/aws-samples/crdb-cluster-eks-terraform.git</pre> | DevOps 工程师，Git | 
| 更新 Terraform 变量。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程师，Terraform | 

### 部署资源
<a name="deploy-the-resources"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署基础设施。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程师，Terraform | 

### 验证部署
<a name="verify-the-deployment"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证资源创建。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程师 | 
| （可选）向上或向下扩展。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | DevOps 工程师，Terraform | 

### 清理
<a name="clean-up"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 删除基础设施。 | `0`将节点扩展到可以降低计算成本。但是，对于由此模块创建的永久性 Amazon EBS 卷，您仍然需要付费。要消除存储成本，请按照以下步骤删除所有卷：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | Terraform | 

## 问题排查
<a name="deploy-cockroachdb-on-eks-using-terraform-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 验证提供商凭证时出错 | 当你运行 Terraform `apply` 或`destroy`命令时，你可能会遇到以下错误：<br />`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.`<br />此错误是由本地计算机配置中使用的凭证安全令牌过期引起的。有关如何解决该错误的说明，请参阅 AWS CLI 文档中的[设置和查看配置设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods)。 | 
| CockroachDB 吊舱处于待处理状态 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/deploy-cockroachdb-on-eks-using-terraform.html) | 

## 相关资源
<a name="deploy-cockroachdb-on-eks-using-terraform-resources"></a>
+ 在@@ [单个 Kubernetes 集群中部署 CockroachDB（Cock](https://www.cockroachlabs.com/docs/dev/deploy-cockroachdb-with-kubernetes.html) roachDB 文档）
+ 在@@ [多个 Kubernetes 集群中编排 CockroachDB](https://www.cockroachlabs.com/docs/dev/orchestrate-cockroachdb-with-kubernetes-multi-cluster.html)（CockroachDB 文档）
+ [AWS 提供者](https://registry.terraform.io/providers/hashicorp/aws/latest/docs)（Terraform 文档）

## 附件
<a name="attachments-e22d81ab-b85c-4709-8579-4c9cdb4afdb6"></a>

要访问与此文档相关联的其他内容，请解压以下文件：[attachment.zip](samples/p-attach/e22d81ab-b85c-4709-8579-4c9cdb4afdb6/attachments/attachment.zip)