From 26c36eaabb1ad0841b6507b9617f731cd79bdb3a Mon Sep 17 00:00:00 2001 From: Yilong Li Date: Tue, 10 Nov 2020 14:27:05 +0800 Subject: [PATCH] zh: Improve deploy on AWS EKS (#802) --- zh/deploy-on-aws-eks.md | 208 ++++++++++++++++++++++------------------ 1 file changed, 115 insertions(+), 93 deletions(-) diff --git a/zh/deploy-on-aws-eks.md b/zh/deploy-on-aws-eks.md index 548dfc9862..6b6d644937 100644 --- a/zh/deploy-on-aws-eks.md +++ b/zh/deploy-on-aws-eks.md @@ -1,5 +1,5 @@ --- -title: 在 AWS EKS 上部署 TiDB +title: 在 AWS EKS 上部署 TiDB 集群 summary: 介绍如何在 AWS EKS (Elastic Kubernetes Service) 上部署 TiDB 集群。 aliases: ['/docs-cn/tidb-in-kubernetes/dev/deploy-on-aws-eks/'] --- @@ -8,27 +8,27 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/deploy-on-aws-eks/'] 本文介绍了如何在 AWS EKS (Elastic Kubernetes Service) 上部署 TiDB 集群。 -## 环境配置准备 +## 环境准备 部署前,请确认已完成以下环境准备: -* 安装 [Helm](https://helm.sh/docs/intro/install/):用于安装 TiDB Operator。 +- 安装 [Helm](https://helm.sh/docs/intro/install/):用于安装 TiDB Operator。 -* 完成 AWS [eksctl 入门](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/getting-started-eksctl.html) 中所有操作。 +- 完成 AWS [eksctl 入门](https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/getting-started-eksctl.html)中所有操作。 -该教程包含以下内容: + 该教程包含以下内容: -* 安装并配置 AWS 的命令行工具 awscli -* 安装并配置创建 Kubernetes 集群的命令行工具 eksctl -* 安装 Kubernetes 命令行工具 kubectl + - 安装并配置 AWS 的命令行工具 awscli + - 安装并配置创建 Kubernetes 集群的命令行工具 eksctl + - 安装 Kubernetes 命令行工具 kubectl > **注意:** > -> 本文档的操作需要 AWS Access Key 至少具有 [eksctl 所需最少权限](https://eksctl.io/usage/minimum-iam-policies/) 和创建 [Linux 堡垒机所涉及的服务权限](https://docs.aws.amazon.com/quickstart/latest/linux-bastion/architecture.html#aws-services)。 +> 本文档的操作需要 AWS Access Key 至少具有 [eksctl 所需最少权限](https://eksctl.io/usage/minimum-iam-policies/)和创建 [Linux 堡垒机所涉及的服务权限](https://docs.aws.amazon.com/quickstart/latest/linux-bastion/architecture.html#aws-services)。 -## 部署 +## 创建 EKS 集群和节点池 -### 创建 EKS 和节点池 +将以下配置存为 cluster.yaml 文件,并替换 `${clusterName}` 为自己想命名的集群名字: {{< copyable "shell-regular" >}} @@ -36,7 +36,7 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/deploy-on-aws-eks/'] apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: - name: + name: ${clusterName} region: us-west-2 nodeGroups: @@ -67,7 +67,7 @@ nodeGroups: dedicated: tikv:NoSchedule ``` -将以上配置存为 cluster.yaml 文件,并替换 `` 为自己想命名的集群名字后,执行以下命令创建集群: +执行以下命令创建集群: {{< copyable "shell-regular" >}} @@ -77,95 +77,96 @@ eksctl create cluster -f cluster.yaml > **注意:** > -> - 该命令需要等待 EKS 集群创建完成,以及节点组创建完成并加入进去,耗时 5 到 10 分钟不等。 -> - 可参考 [eksctl 文档](https://eksctl.io/usage/creating-and-managing-clusters/#using-config-files)了解更多集群配置选项。 +> 该命令需要等待 EKS 集群创建完成,以及节点组创建完成并加入进去,耗时约 5~10 分钟。可参考 [eksctl 文档](https://eksctl.io/usage/creating-and-managing-clusters/#using-config-files)了解更多集群配置选项。 -### 部署 TiDB Operator +## 部署 TiDB Operator -参考快速上手中[部署 TiDB Operator](get-started.md#部署-tidb-operator),将 TiDB Operator 部署进 Kubernetes 集群。 +参考快速上手中[部署 TiDB Operator](get-started.md#部署-tidb-operator),在 EKS 集群中部署 TiDB Operator。 -### 部署 TiDB 集群和监控 +## 部署 TiDB 集群和监控 -1. 准备 TidbCluster 和 TidbMonitor CR 文件: +下面介绍如何在 AWS EKS 上部署 TiDB 集群和监控组件。 - {{< copyable "shell-regular" >}} +### 创建 namespace - ```shell - curl -LO https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/aws/tidb-cluster.yaml && - curl -LO https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/aws/tidb-monitor.yaml - ``` +执行以下命令,创建 TiDB 集群安装的 namespace: -2. 创建 `Namespace`: +{{< copyable "shell-regular" >}} - {{< copyable "shell-regular" >}} +```shell +kubectl create namespace tidb-cluster +``` - ```shell - kubectl create namespace tidb-cluster - ``` +> **注意:** +> +> 这里创建的 namespace 是指 [Kubernetes 命名空间](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)。本文档使用 `tidb-cluster` 为例,若使用了其他名字,修改相应的 `-n` 或 `--namespace` 参数为对应的名字即可。 - > **注意:** - > - > `namespace` 是[命名空间](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)。本文档使用 `tidb-cluster` 为例,若使用了其他名字,修改相应的 `-n` 或 `--namespace` 参数为对应的名字即可。 +### 部署 TiDB 集群和监控 -3. 部署 TiDB 集群: +执行以下命令,在 EKS 集群中部署 TidbCluster 和 TidbMonitor CR。 - {{< copyable "shell-regular" >}} +{{< copyable "shell-regular" >}} - ```shell - kubectl create -f tidb-cluster.yaml -n tidb-cluster && - kubectl create -f tidb-monitor.yaml -n tidb-cluster - ``` +```shell +kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/aws/tidb-cluster.yaml -n tidb-cluster && \ + kubectl apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/aws/tidb-monitor.yaml -n tidb-cluster +``` -4. 查看 TiDB 集群启动状态: +当上述 yaml 文件被应用到 Kubernetes 集群后,TiDB Operator 会负责根据 yaml 文件描述,创建对应配置的 TiDB 集群及其监控。 - {{< copyable "shell-regular" >}} +### 查看 TiDB 集群启动状态 - ```shell - kubectl get pods -n tidb-cluster - ``` +使用以下命令查看 TiDB 集群启动状态: - 当所有 pods 都处于 Running & Ready 状态时,则可以认为 TiDB 集群已经成功启动。一个正常运行的 TiDB 集群的案例: +{{< copyable "shell-regular" >}} - ``` - NAME READY STATUS RESTARTS AGE - tidb-discovery-5cb8474d89-n8cxk 1/1 Running 0 47h - tidb-monitor-6fbcc68669-dsjlc 3/3 Running 0 47h - tidb-pd-0 1/1 Running 0 47h - tidb-pd-1 1/1 Running 0 46h - tidb-pd-2 1/1 Running 0 46h - tidb-tidb-0 2/2 Running 0 47h - tidb-tidb-1 2/2 Running 0 46h - tidb-tikv-0 1/1 Running 0 47h - tidb-tikv-1 1/1 Running 0 47h - tidb-tikv-2 1/1 Running 0 47h - ``` +```shell +kubectl get pods -n tidb-cluster +``` + +当所有 pods 都处于 Running & Ready 状态时,则可以认为 TiDB 集群已经成功启动。如下是一个正常运行的 TiDB 集群的示例输出: + +``` +NAME READY STATUS RESTARTS AGE +tidb-discovery-5cb8474d89-n8cxk 1/1 Running 0 47h +tidb-monitor-6fbcc68669-dsjlc 3/3 Running 0 47h +tidb-pd-0 1/1 Running 0 47h +tidb-pd-1 1/1 Running 0 46h +tidb-pd-2 1/1 Running 0 46h +tidb-tidb-0 2/2 Running 0 47h +tidb-tidb-1 2/2 Running 0 46h +tidb-tikv-0 1/1 Running 0 47h +tidb-tikv-1 1/1 Running 0 47h +tidb-tikv-2 1/1 Running 0 47h +``` ## 访问数据库 -### 准备一台可以访问集群的机器 +创建好 TiDB 集群后,我们就可以访问数据库,进行测试和开发了。 + +### 准备一台堡垒机 -我们为 TiDB 集群创建的是内网 LoadBalancer。我们可在集群 VPC 内创建一台[堡垒机](https://aws.amazon.com/quickstart/architecture/linux-bastion/)访问数据库,参考 [AWS Linux 堡垒机文档](https://aws.amazon.com/quickstart/architecture/linux-bastion/)在 AWS Console 上创建即可。 +我们为 TiDB 集群创建的是内网 LoadBalancer,因此可以在集群 VPC 内创建一台[堡垒机](https://aws.amazon.com/quickstart/architecture/linux-bastion/)来访问数据库。具体参考 [AWS Linux 堡垒机文档](https://aws.amazon.com/quickstart/architecture/linux-bastion/)在 AWS Console 上创建即可。 VPC 和 Subnet 需选择集群的 VPC 和 Subnet,在下拉框通过集群名字确认是否正确。可以通过以下命令查看集群的 VPC 和 Subnet 来验证: {{< copyable "shell-regular" >}} ```shell -eksctl get cluster -n +eksctl get cluster -n ${clusterName} ``` 同时需允许本机网络访问,并选择正确的 Key Pair 以便能通过 SSH 登录机器。 > **注意:** > -> - 除使用堡垒机以外,也可以使用 [VPC Peering](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 连接现有机器到集群 VPC。 -> - 若 EKS 创建于已经存在的 VPC 中,可使用 VPC 内现有机器。 +> 除使用堡垒机以外,也可以使用 [VPC Peering](https://docs.aws.amazon.com/vpc/latest/peering/what-is-vpc-peering.html) 连接现有机器到集群 VPC。若 EKS 创建于已经存在的 VPC 中,可使用 VPC 内现有机器。 ### 安装 MySQL 客户端并连接 -待创建好堡垒机后,我们可以通过 SSH 远程连接到堡垒机,再通过 MySQL 客户端 来访问 TiDB 集群。 +创建好堡垒机后,我们可以通过 SSH 远程连接到堡垒机,再通过 MySQL 客户端来访问 TiDB 集群。 -用 SSH 连接到堡垒机: +使用 SSH 登录堡垒机: {{< copyable "shell-regular" >}} @@ -173,7 +174,7 @@ eksctl get cluster -n ssh [-i /path/to/your/private-key.pem] ec2-user@ ``` -安装 MySQL 客户端: +在堡垒机上安装 MySQL 客户端: {{< copyable "shell-regular" >}} @@ -186,12 +187,12 @@ sudo yum install mysql -y {{< copyable "shell-regular" >}} ```shell -mysql -h -P 4000 -u root +mysql -h ${tidb-nlb-dnsname} -P 4000 -u root ``` -`` 为 TiDB Service 的 LoadBalancer 域名,可以通过 `kubectl get svc basic-tidb -n tidb-cluster` 输出中的 `EXTERNAL-IP` 字段查看。 +其中 `${tidb-nlb-dnsname}` 为 TiDB Service 的 LoadBalancer 域名,可以通过命令 `kubectl get svc basic-tidb -n tidb-cluster` 输出中的 `EXTERNAL-IP` 字段查看。 -示例: +以下为一个连接 TiDB 集群的示例: ```shell $ mysql -h abfc623004ccb4cc3b363f3f37475af1-9774d22c27310bc1.elb.us-west-2.amazonaws.com -P 4000 -u root @@ -219,10 +220,10 @@ MySQL [(none)]> show status; > **注意:** > -> * [MySQL 8.0 默认认证插件](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin)从 `mysql_native_password` 更新为 `caching_sha2_password`,因此如果使用 MySQL 8.0 客户端访问 TiDB 服务(TiDB 版本 < v4.0.7),并且用户账户有配置密码,需要显示指定 `--default-auth=mysql_native_password` 参数。 -> * TiDB(v4.0.2 起)默认会定期收集使用情况信息,并将这些信息分享给 PingCAP 用于改善产品。若要了解所收集的信息详情及如何禁用该行为,请参见[遥测](https://docs.pingcap.com/zh/tidb/stable/telemetry)。 +> - [MySQL 8.0 默认认证插件](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin)从 `mysql_native_password` 更新为 `caching_sha2_password`,因此如果使用 MySQL 8.0 客户端访问 TiDB 服务(TiDB 版本*小于* v4.0.7),并且用户账户有配置密码,需要显示指定 `--default-auth=mysql_native_password` 参数。 +> - TiDB(v4.0.2 起)默认会定期收集使用情况信息,并将这些信息分享给 PingCAP 用于改善产品。若要了解所收集的信息详情及如何禁用该行为,请参见 [TiDB 遥测功能使用文档](https://docs.pingcap.com/zh/tidb/stable/telemetry)。 -## Grafana 监控 +### 访问 Grafana 监控 先获取 Grafana 的 LoadBalancer 域名: @@ -232,7 +233,7 @@ MySQL [(none)]> show status; kubectl -n tidb-cluster get svc basic-grafana ``` -示例: +示例输出: ``` $ kubectl get svc basic-grafana @@ -242,42 +243,47 @@ basic-grafana LoadBalancer 10.100.199.42 a806cfe84c12a4831aa3313e792e3eed- 其中 `EXTERNAL-IP` 栏即为 LoadBalancer 域名。 -你可以通过浏览器访问 `:3000` 地址查看 Grafana 监控指标。其中 `` 替换成前面获取的域名。 +你可以通过浏览器访问 `${grafana-lb}:3000` 地址查看 Grafana 监控指标。其中 `${grafana-lb}` 替换成前面获取的域名。 -Grafana 默认登录信息: - -- 用户名:admin -- 密码:admin +> **注意:** +> +> Grafana 默认用户名和密码均为 admin。 ## 升级 TiDB 集群 -要升级 TiDB 集群,可以通过 `kubectl edit tc basic -n tidb-cluster` 修改 `spec.version`。 +要升级 TiDB 集群,可以通过 `kubectl edit tc basic -n tidb-cluster` 命令修改 `spec.version`。 升级过程会持续一段时间,你可以通过 `kubectl get pods -n tidb-cluster --watch` 命令持续观察升级进度。 ## 扩容 TiDB 集群 -注意扩容前需要对相应的节点组进行扩容,以便新的实例有足够的资源运行。 +扩容前需要对相应的节点组进行扩容,以便新的实例有足够的资源运行。以下展示扩容 EKS 节点组和 TiDB 集群组件的操作。 -下面是将集群 `` 的 `tikv` 组扩容到 4 节点的示例: +### 扩容 EKS 节点组 + +以下是将集群 `${clusterName}` 的 `tikv` 节点组扩容到 4 节点的示例: {{< copyable "shell-regular" >}} ```shell -eksctl scale nodegroup --cluster --name tikv --nodes 4 --nodes-min 4 --nodes-max 4 +eksctl scale nodegroup --cluster ${clusterName} --name tikv --nodes 4 --nodes-min 4 --nodes-max 4 ``` -然后通过 `kubectl edit tc basic -n tidb-cluster` 修改各组件的 `replicas` 为期望的新副本数进行扩容。 - 更多节点组管理可参考 [eksctl 文档](https://eksctl.io/usage/managing-nodegroups/)。 +### 扩容 TiDB 组件 + +扩容 EKS 节点组后,可以使用命令 `kubectl edit tc basic -n tidb-cluster` 修改各组件的 `replicas` 为期望的新副本数进行扩容。 + ## 部署 TiFlash/TiCDC +[TiFlash](https://docs.pingcap.com/zh/tidb/stable/tiflash-overview) 是 TiKV 的列存扩展,[TiCDC](https://docs.pingcap.com/zh/tidb/stable/ticdc-overview) 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具。这两个组件不是必选安装项,这里提供一个快速安装上手示例。 + ### 新增节点组 在 eksctl 的配置文件 cluster.yaml 中新增以下两项,为 TiFlash/TiCDC 各自新增一个节点组。`desiredCapacity` 决定期望的节点数,根据实际需求而定。 -``` +```yaml - name: tiflash desiredCapacity: 3 labels: @@ -292,10 +298,12 @@ eksctl scale nodegroup --cluster --name tikv --nodes 4 --nodes-min dedicated: ticdc:NoSchedule ``` +具体命令根据 EKS 集群创建情况而定: + - 若集群还未创建,使用 `eksctl create cluster -f cluster.yaml` 命令创建集群和节点组。 - 若集群已经创建,使用 `eksctl create nodegroup -f cluster.yaml` 命令只创建节点组(已经存在的节点组会忽略,不会重复创建)。 -### 配置并部署 +### 配置并部署 TiFlash/TiCDC 如果要部署 TiFlash,可以在 tidb-cluster.yaml 中配置 `spec.tiflash`,例如: @@ -316,7 +324,7 @@ spec: value: tiflash ``` -其他参数可以参考[集群配置文档](configure-a-tidb-cluster.md)进行配置。 +其他参数可以参考 [TiDB 集群配置文档](configure-a-tidb-cluster.md)进行配置。 > **警告:** > @@ -345,7 +353,7 @@ spec: ## 使用企业版 -值得注意的是,如果需要部署企业版的 TiDB/PD/TiKV/TiFlash/TiCDC,需要将 tidb-cluster.yaml 中 `spec..baseImage` 配置为企业版镜像,格式为 `pingcap/-enterprise`。 +部署企业版 TiDB/PD/TiKV/TiFlash/TiCDC 时,只需要将 tidb-cluster.yaml 中 `spec.[tidb|pd|tikv|tiflash|ticdc].baseImage` 配置为企业版镜像,格式为 `pingcap/[tidb|pd|tikv|tiflash|ticdc]-enterprise`。 例如: @@ -363,7 +371,7 @@ spec: AWS EBS 支持多种存储类型。若需要低延迟、高吞吐,可以选择 `io1` 类型。首先我们为 `io1` 新建一个存储类 (Storage Class): -``` +```yaml kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: @@ -372,11 +380,25 @@ provisioner: kubernetes.io/aws-ebs parameters: type: io1 fsType: ext4 + iopsPerGB: "10" + encrypted: "false" ``` -然后在 tidb cluster 的 YAML 文件中,通过 `storageClassName` 字段指定 `io1` 存储类申请 `io1` 类型的 EBS 存储。 +然后在 tidb cluster 的 YAML 文件中,通过 `storageClassName` 字段指定 `io1` 存储类申请 `io1` 类型的 EBS 存储。可以参考以下 TiKV 配置示例使用: -更多存储类配置以及 EBS 存储类型选择,可以查看 [Storage Class 官方文档](https://kubernetes.io/docs/concepts/storage/storage-classes/) 和 [EBS 存储类型文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html)。 +```yaml +spec: + tikv: + baseImage: pingcap/tikv + replicas: 3 + storageClaims: + - resources: + requests: + storage: 100Gi + storageClassName: io1 +``` + +更多存储类配置以及 EBS 存储类型选择,可以查看 [Storage Class 官方文档](https://kubernetes.io/docs/concepts/storage/storage-classes/)和 [EBS 存储类型文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html)。 ## 使用本地存储 @@ -386,7 +408,7 @@ AWS 部分实例类型提供额外的 [NVMe SSD 本地存储卷](https://docs.aw > > 运行中的 TiDB 集群不能动态更换 storage class,可创建一个新的 TiDB 集群测试。 > -> 由于 EKS 升级过程中节点重建,本地盘数据会[丢失](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-lifetime)。由于 EKS 升级或其他原因造成的节点重建,会导致需要迁移 TiKV 数据,如果无法接受这一点,则不建议在生产环境中使用本地盘。 +> 由于 EKS 升级过程中节点重建,[本地盘数据会丢失](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html#instance-store-lifetime)。由于 EKS 升级或其他原因造成的节点重建,会导致需要迁移 TiKV 数据,如果无法接受这一点,则不建议在生产环境中使用本地盘。 了解哪些实例可提供本地存储卷,可以查看 [AWS 实例列表](https://aws.amazon.com/ec2/instance-types/)。以下以 `c5d.4xlarge` 为例: @@ -394,7 +416,7 @@ AWS 部分实例类型提供额外的 [NVMe SSD 本地存储卷](https://docs.aw 修改 `eksctl` 配置文件中 TiKV 节点组实例类型为 `c5d.4xlarge`: - ``` + ```yaml - name: tikv instanceType: c5d.4xlarge labels: @@ -426,4 +448,4 @@ AWS 部分实例类型提供额外的 [NVMe SSD 本地存储卷](https://docs.aw 3. 使用本地存储。 - 完成前面步骤后,local-volume-provisioner 即可发现集群内所有本地 NVMe SSD 盘。在 tidb-cluster.yaml 中添加 `tikv.storageClassName` 字段并设置为 `local-storage` 即可。 + 完成前面步骤后,local-volume-provisioner 即可发现集群内所有本地 NVMe SSD 盘。在 tidb-cluster.yaml 中添加 `tikv.storageClassName` 字段并设置为 `local-storage` 即可,可以参考前文[部署 TiDB 集群和监控](#部署-tidb-集群和监控)部分。