• 在 GCP GKE 上部署 TiDB Operator 和 TiDB 集群
    • 环境准备
    • 配置
      • 配置 Google Cloud SDK
      • 配置 API
      • 配置 Terraform
    • 部署集群
    • 访问数据库
    • 与集群交互
    • 升级 TiDB 集群
    • 扩容
    • 自定义
      • 自定义 GCP 资源
      • 自定义 TiDB 参数配置
      • 自定义节点池
    • 销毁集群

    在 GCP GKE 上部署 TiDB Operator 和 TiDB 集群

    本文介绍了如何使用个人电脑(Linux 或 macOS 系统)在 GCP GKE 上部署 TiDB Operator 和 TiDB 集群。

    环境准备

    部署前,确认已安装以下软件:

    • Google Cloud SDK
    • terraform >= 0.12
    • kubectl >= 1.14
    • helm >= 2.9.0 且 < 3.0.0
    • jq

    配置

    为保证部署顺利,需要提前进行一些配置。

    配置 Google Cloud SDK

    安装 Google Cloud SDK 后,需要执行 gcloud init 进行初始化。

    配置 API

    如果使用的 GCP 项目是新项目,确保以下 API 已启用:

    {{< copyable “shell-regular” >}}

    1. gcloud services enable cloudresourcemanager.googleapis.com && \
    2. gcloud services enable cloudbilling.googleapis.com && \
    3. gcloud services enable iam.googleapis.com && \
    4. gcloud services enable compute.googleapis.com && \
    5. gcloud services enable container.googleapis.com

    配置 Terraform

    执行 Terraform 脚本需要 3 个环境变量。可以等 Terraform 提示输入,或提前 export 变量。所需的 3 个环境变量如下:

    • TF_VAR_GCP_CREDENTIALS_PATH:GCP 证书文件路径
      • 建议另建服务账号给 Terraform 使用。参考 服务账号 来创建服务账号并授予账号 Project Editor 权限。
      • 参考 服务账号密钥 来创建服务账号密钥。创建过程中选择 JSON 类型密钥。创建完成后,自动下载的 JSON 文件就是所需的证书文件。
    • TF_VAR_GCP_REGION:创建资源所在的区域,例如:us-west1
    • TF_VAR_GCP_PROJECT:GCP 项目的名称。

    要设置这 3 个环境变量,可在终端中输入如下示例,并将下面的值替换为所下载 JSON 文件的路径、GCP 区域和 GCP 项目名称:

    {{< copyable “shell-regular” >}}

    1. export TF_VAR_GCP_CREDENTIALS_PATH="/Path/to/my-project.json"

    {{< copyable “shell-regular” >}}

    1. export TF_VAR_GCP_REGION="us-west1"

    {{< copyable “shell-regular” >}}

    1. export TF_VAR_GCP_PROJECT="my-project"

    也可以将以上命令追加到 ~/.bash_profile,以便下次登录时自动 export 以上命令。

    部署集群

    默认部署会创建一个新的 VPC、两个子网、一个 f1-micro 实例作为堡垒机和包含以下实例作为工作节点的 GKE 集群:

    • 3 台 n1-standard-4 实例,部署 PD
    • 3 台 n1-highmem-8 实例,部署 TiKV
    • 3 台 n1-standard-16 实例,部署 TiDB
    • 3 台 n1-standard-2 实例,部署监控组件

    注意:

    工作节点的数量取决于指定 region 中可用区的数量。大部分 region 有 3 个可用区,但是 us-central1 有 4 个。参考 Regions and Zones 以获取更多信息。参考自定义部分来自定义区域集群的节点池。

    如上所述,默认部署需要 91 个 CPU,超过了 GCP 项目的默认配额。可以参考配额来增加项目配额。扩容同样需要更多 CPU。

    所有信息现已配置好,可以启动脚本来部署 TiDB 集群:

    {{< copyable “shell-regular” >}}

    1. git clone --depth=1 https://github.com/pingcap/tidb-operator && \
    2. cd tidb-operator/deploy/gcp

    {{< copyable “shell-regular” >}}

    1. terraform init

    {{< copyable “shell-regular” >}}

    1. terraform apply

    如果未提前 export 上述 3 个环境变量,执行 terraform apply 过程中会有提示出现,要求对 3 个变量进行设置。详情请参考配置 Terraform。

    整个过程可能至少需要 10 分钟。terraform apply 执行成功后,会输出类似如下的信息:

    1. Apply complete! Resources: 17 added, 0 changed, 0 destroyed.
    2. Outputs:
    3. cluster_id = my-cluster
    4. cluster_name = my-cluster
    5. how_to_connect_to_mysql_from_bastion = mysql -h 172.31.252.20 -P 4000 -u root
    6. how_to_ssh_to_bastion = gcloud compute ssh bastion --zone us-west1-b
    7. kubeconfig_file = ./credentials/kubeconfig_my-cluster
    8. monitor_ilb_ip = 35.227.134.146
    9. monitor_port = 3000
    10. region = us-west1
    11. tidb_ilb_ip = 172.31.252.20
    12. tidb_port = 4000
    13. tidb_version = v3.0.0-rc.1

    访问数据库

    terraform apply 完成后,可先通过 ssh 远程连接到堡垒机,再通过 MySQL client 来访问 TiDB 集群。

    所需命令如下(用上面的输出信息替换 <> 部分内容):

    {{< copyable “shell-regular” >}}

    1. gcloud compute ssh bastion --zone <zone>

    {{< copyable “shell-regular” >}}

    1. mysql -h <tidb_ilb_ip> -P 4000 -u root

    与集群交互

    你可以通过 kubectlhelm 使用 kubeconfig 文件 credentials/kubeconfig_<cluster_name> 和 GKE 集群交互。主要有两种方式进行交互,如下所示。

    • 指定 —kubeconfig 参数:

      {{< copyable “shell-regular” >}}

      1. kubectl --kubeconfig credentials/kubeconfig_<cluster_name> get po -n tidb

      {{< copyable “shell-regular” >}}

      1. helm --kubeconfig credentials/kubeconfig_<cluster_name> ls
    • 或者设置 KUBECONFIG 环境变量:

      {{< copyable “shell-regular” >}}

      1. export KUBECONFIG=$PWD/credentials/kubeconfig_<cluster_name>

      {{< copyable “shell-regular” >}}

      1. kubectl get po -n tidb

      {{< copyable “shell-regular” >}}

      1. helm ls

    其中,cluster_name 默认为 my-cluster,可以通过 variables.tf 修改。

    升级 TiDB 集群

    要升级 TiDB 集群,可编辑 variables.tf 文件,修改 tidb_version 变量到更高版本,然后运行 terraform apply

    例如,要升级 TiDB 集群到 3.0.0-rc.2,可修改 tidb_versionv3.0.0-rc.2

    1. variable "tidb_version" {
    2. description = "TiDB version"
    3. default = "v3.0.0-rc.2"
    4. }

    升级过程会持续一段时间。你可以通过 kubectl --kubeconfig credentials/kubeconfig_<cluster_name> get po -n tidb --watch 命令来持续观察升级进度。

    然后你可以访问数据库 并通过 tidb_version() 确认集群是否升级成功:

    {{< copyable “sql” >}}

    1. select tidb_version();
    1. *************************** 1. row ***************************
    2. tidb_version(): Release Version: v3.0.0-rc.2
    3. Git Commit Hash: 06f3f63d5a87e7f0436c0618cf524fea7172eb93
    4. Git Branch: HEAD
    5. UTC Build Time: 2019-05-28 12:48:52
    6. GoVersion: go version go1.12 linux/amd64
    7. Race Enabled: false
    8. TiKV Min Version: 2.1.0-alpha.1-ff3dd160846b7d1aed9079c389fc188f7f5ea13e
    9. Check Table Before Drop: false
    10. 1 row in set (0.001 sec)

    扩容

    若要扩容 TiDB 集群,可按需修改 variables.tf 文件中的 tikv_counttikv_replica_counttidb_counttidb_replica_count 变量,然后运行 terraform apply

    由于缩容过程中无法确定哪个节点会被删除,因此目前不支持集群缩容。

    扩容过程会持续几分钟,你可以通过 kubectl --kubeconfig credentials/kubeconfig_<cluster_name> get po -n tidb --watch 命令来持续观察进度。

    例如,可以将 tidb_count 从 1 改为 2 来扩容 TiDB:

    1. variable "tidb_count" {
    2. description = "Number of TiDB nodes per availability zone"
    3. default = 2
    4. }

    注意:

    增加节点数量会在每个可用区都增加节点。

    自定义

    你可以按需修改 variables.tf 文件中的默认值,例如集群名称和镜像版本等。

    自定义 GCP 资源

    GCP 允许 n1-standard-1 或者更大的实例类型挂载本地 SSD,这提供了更好的自定义特性。

    自定义 TiDB 参数配置

    目前,暴露出来可以自定义修改的 TiDB 参数并不多。但是你可以在部署集群之前,修改 templates/tidb-cluster-values.yaml.tpl 文件中的配置。如果集群已经在运行,每次修改 templates/tidb-cluster-values.yaml.tpl 文件中的配置都需要执行 terraform apply,并手动删除 Pod(s)。

    自定义节点池

    集群是按区域 (regional) 而非按可用区 (zonal) 创建的。也就是说,GKE 向每个可用区复制相同的节点池,以实现更高的可用性。但对于 Grafana 这样的监控服务来说,这可能就没有必要了。可以通过 gcloud 手动删除节点。

    注意:

    GKE 节点池通过实例组管理。如果你通过 gcloud compute instances delete 删除某个节点,GKE 会自动重新创建节点并添加到集群。

    假如需要从监控节点池中删掉一个节点,首先输入命令:

    {{< copyable “shell-regular” >}}

    1. gcloud compute instance-groups managed list | grep monitor

    结果类似下面输出:

    1. gke-my-cluster-monitor-pool-08578e18-grp us-west1-b zone gke-my-cluster-monitor-pool-08578e18 0 0 gke-my-cluster-monitor-pool-08578e18 no
    2. gke-my-cluster-monitor-pool-7e31100f-grp us-west1-c zone gke-my-cluster-monitor-pool-7e31100f 1 1 gke-my-cluster-monitor-pool-7e31100f no
    3. gke-my-cluster-monitor-pool-78a961e5-grp us-west1-a zone gke-my-cluster-monitor-pool-78a961e5 1 1 gke-my-cluster-monitor-pool-78a961e5 no

    第一列是托管的实例组,第二列是所在可用区。你还需要获取实例组中的实例名字:

    {{< copyable “shell-regular” >}}

    1. gcloud compute instance-groups managed list-instances <the-name-of-the-managed-instance-group> --zone <zone>

    示例:

    {{< copyable “shell-regular” >}}

    1. gcloud compute instance-groups managed list-instances gke-my-cluster-monitor-pool-08578e18-grp --zone us-west1-b
    1. NAME ZONE STATUS ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
    2. gke-my-cluster-monitor-pool-08578e18-c7vd us-west1-b RUNNING NONE gke-my-cluster-monitor-pool-08578e18

    现在你可以通过指定托管的实例组和实例的名称来删掉这个实例。例如:

    {{< copyable “shell-regular” >}}

    1. gcloud compute instance-groups managed delete-instances gke-my-cluster-monitor-pool-08578e18-grp --instances=gke-my-cluster-monitor-pool-08578e18-c7vd --zone us-west1-b

    销毁集群

    可以通过如下命令销毁集群:

    {{< copyable “shell-regular” >}}

    1. terraform destroy

    如果你不再需要之前的数据,执行完 terraform destroy 后,可通过 Google Cloud 控制台或者 gcloud 删除磁盘。

    注意:

    在执行 terraform destroy 过程中,可能发生错误:Error reading Container Cluster "my-cluster": Cluster "my-cluster" has status "RECONCILING" with message""。当 GCP 升级 kubernetes master 节点时会出现该问题。一旦问题出现,就无法删除集群,需要等待 GCP 升级结束,再次执行 terraform destroy