构建多个网络互通的 GCP GKE 集群

    如果仅需要部署一个 TiDB 集群到一个 GCP GKE 集群,请参考在 GCP GKE 上部署 TiDB 集群文档。

    部署前,请确认已完成以下环境准备:

    • :用于安装 TiDB Operator
    • gcloud:用于创建和管理 GCP 服务的命令行工具
    • 完成 中的准备工作 (Before you begin)

    配置 GCP 服务

    使用以下命令,设置好你的 GCP 项目:

    1. 创建一个自定义子网的 VPC 网络。

    2. 在新创建的 VPC 网络下创建三个属于不同 Region 的子网,子网的 CIDR block 相互不重叠。

      1. gcloud compute networks subnets create ${subnet_1} \
      2. --region=${region_1} \
      3. --network=${network_name} \
      4. --range=10.0.0.0/16 \
      5. --secondary-range pods=10.10.0.0/16,services=10.100.0.0/16
      1. gcloud compute networks subnets create ${subnet_2} \
      2. --region=${region_2} \
      3. --network=${network_name} \
      4. --range=10.1.0.0/16 \
      5. --secondary-range pods=10.11.0.0/16,services=10.101.0.0/16
      1. gcloud compute networks subnets create ${subnet_3} \
      2. --region=${region_3} \
      3. --network=${network_name} \
      4. --range=10.2.0.0/16 \
      5. --secondary-range pods=10.12.0.0/16,services=10.102.0.0/16

      ${subnet_1}${subnet_2}${subnet_3} 为三个不同子网的名字。

      参数 --range=10.0.0.0/16 指定集群的子网的 CIRD 块,所有集群的子网的 CIDR block 必须不相互重叠。

      参数 --secondary-range pods=10.11.0.0/16,services=10.101.0.0/16 中指定了 Kubernetes 的 Pod 与 Service 使用的 CIRD block,将会在后面使用到。

    第 2 步:启动 Kubernetes 集群

    创建三个 GKE 集群,每个集群使用上述创建的子网。

    1. 创建三个 GKE 集群,每个集群有一个默认的节点池:

      1. gcloud beta container clusters create ${cluster_1} \
      2. --region ${region_1} --num-nodes 1 \
      3. --network ${network_name} --subnetwork ${subnet_1} \
      4. --cluster-dns clouddns --cluster-dns-scope vpc \
      5. --cluster-dns-domain ${cluster_domain_1}
      6. --cluster-secondary-range-name=pods --services-secondary-range-name=services
      1. gcloud beta container clusters create ${cluster_3} \
      2. --region ${region_3} --num-nodes 1 \
      3. --network ${network_name} --subnetwork ${subnet_3} \
      4. --cluster-dns clouddns --cluster-dns-scope vpc \
      5. --cluster-dns-domain ${cluster_domain_3}
      6. --enable-ip-alias \
      7. --cluster-secondary-range-name=pods --services-secondary-range-name=services

      使用 VPC 范围的 Cloud DNS 服务,使得集群可以解析其他集群的 Pod 和 Service 地址。

    2. 为每个集群创建 PD、TiKV 和 TiDB 使用的独立的节点池。

      以集群 1 为例:

      1. gcloud container node-pools create pd --cluster ${cluster_1} --machine-type n1-standard-4 --num-nodes=1 \
      2. --node-labels=dedicated=pd --node-taints=dedicated=pd:NoSchedule
      3. gcloud container node-pools create tikv --cluster ${cluster_1} --machine-type n1-highmem-8 --num-nodes=1 \
      4. --node-labels=dedicated=tikv --node-taints=dedicated=tikv:NoSchedule
      5. gcloud container node-pools create tidb --cluster ${cluster_1} --machine-type n1-standard-8 --num-nodes=1 \
      6. --node-labels=dedicated=tidb --node-taints=dedicated=tidb:NoSchedule
    3. 获取每个集群的 Kubenetes context,后续当你使用 kubectl 命令操作特定的集群时,需要指定对应的 context。

      1. kubectl config get-contexts

      输出类似如下,其中的 NAME 项就是你后续需要使用的 context。

      1. CURRENT NAME CLUSTER AUTHINFO NAMESPACE
      2. * gke_pingcap_us-west1_tidb-1 gke_pingcap_us-west1_tidb-1 gke_pingcap_us-west1_tidb-1
      3. gke_pingcap_us-west2_tidb-2 gke_pingcap_us-west2_tidb-2 gke_pingcap_us-west2_tidb-2
      4. gke_pingcap_us-west3_tidb-3 gke_pingcap_us-west3_tidb-3 gke_pingcap_us-west3_tidb-3

      后文中,使用 ${context_1}${context_2}${context_3} 分别代表各个集群的 context。

    1. 更新集群 1 的防火墙规则。

      1. 找到用于 GKE Pod 间通信的防火墙规则的名字,防火墙规则命名规则类似于:gke-${cluster_1}-${hash}-all

        1. gcloud compute firewall-rules list --filter='name~gke-${cluster_1}-.*-all'

        输出类似如下,其 NAME 项为规则的名字。

      2. 更新该防火墙规则的 source range,加上另外两个集群的 Pod 网络的 CIDR block。

        1. gcloud compute firewall-rules update ${firewall_rule_name} --source-ranges 10.10.0.0/16,10.11.0.0/16,10.12.0.0/16
        1. gcloud compute firewall-rules describe ${firewall_rule_name}
    2. 按照步骤 1,更新集群 2 与集群 3 的防火墙规则。

    在部署 TiDB 集群之前,你需要先验证多个集群之间的网络连通性。

    1. 将下面定义保存到 sample-nginx.yaml 文件。

      1. apiVersion: v1
      2. kind: Pod
      3. metadata:
      4. name: sample-nginx
      5. labels:
      6. app: sample-nginx
      7. spec:
      8. subdomain: sample-nginx-peer
      9. containers:
      10. - image: nginx:1.21.5
      11. name: nginx
      12. ports:
      13. - name: http
      14. containerPort: 80
      15. restartPolicy: Always
      16. ---
      17. apiVersion: v1
      18. kind: Service
      19. metadata:
      20. name: sample-nginx-peer
      21. spec:
      22. ports:
      23. - port: 80
      24. selector:
      25. app: sample-nginx
      26. clusterIP: None
    2. 在三个集群对应的命名空间下部署 NGINX 服务。

      1. kubectl --context ${context_1} -n default apply -f sample-nginx.yaml
      2. kubectl --context ${context_2} -n default apply -f sample-nginx.yaml
      3. kubectl --context ${context_3} -n default apply -f sample-nginx.yaml
    3. 通过访问其他集群的 NGINX 服务,来验证网络是否连通。

      以验证集群 1 到集群 2 的网络连通性为例,执行以下命令。

      1. kubectl --context ${context_1} exec sample-nginx -- curl http://sample-nginx.sample-nginx-peer.default.svc.${cluster_domain_2}:80

      如果输出为 NGINX 的欢迎页面,那么就表明网络是正常连通的。

    4. 验证完成后,执行以下命令删除 NGINX 服务。

    第 4 步:部署 TiDB Operator

    每个集群的 TidbCluster CR 由当前集群的 TiDB Operator 管理,因此每个集群都需要部署 TiDB Operator。

    参考在 Kubernetes 上部署 TiDB Operator 部署 TiDB Operator 到每个 GKE 集群。区别在于,需要通过命令 kubectl --context ${context}helm --kube-context ${context} 为每个 GKE 集群部署 TiDB Operator。

    • 在配置 TidbCluster CR 时使用的 spec.clusterDomain 字段需要和一节定义的 ${cluster_domain_n} 一致。

    例如,部署初始集群 TidbCluster CR 到集群 1 时,将 spec.clusterDomain 指定为 ${cluster_domain_1}:

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbCluster
    3. # ...
    4. spec:
    5. #..
    6. clusterDomain: "${cluster_domain_1}"

    探索更多

    • 阅读,了解如何管理跨 Kubernetes 集群的 TiDB 集群。