在标准 Kubernetes 上部署 TiDB 集群

本文主要描述了如何在标准的 Kubernetes 集群上通过 TiDB Operator 部署 TiDB 集群。

前置条件

  • 参考 TiDB Operator 完成集群中的 TiDB Operator 部署;
  • 参考 使用 Helm 安装 Helm 并配置 PingCAP 官方 chart 仓库。

配置 TiDB 集群

通过下面命令获取待安装的 tidb-cluster chart 的 values.yaml 配置文件:

mkdir -p /home/tidb/<release-name> && \
helm inspect values pingcap/tidb-cluster --version=<chart-version> > /home/tidb/<release-name>/values-<release-name>.yaml

注意:

  • /home/tidb 可以替换为你想用的目录。
  • release-name 将会作为 Kubernetes 相关资源(例如 Pod,Service 等)的前缀名,可以起一个方便记忆的名字,要求全局唯一,通过 helm ls -q 可以查看集群中已经有的 release-name
  • chart-version 是 tidb-cluster chart 发布的版本,可以通过 helm search -l tidb-cluster 查看当前支持的版本。
  • 下文会用 values.yaml 指代 /home/tidb/<release-name>/values-<release-name>.yaml

存储类型

集群默认使用 local-storage 存储类型。

  • 生产环境:推荐使用本地存储,但实际 Kubernetes 集群中本地存储可能按磁盘类型进行了分类,例如 nvme-diskssas-disks
  • 演示环境或功能性验证:可以使用网络存储,例如 ebsnfs 等。

另外 TiDB 集群不同组件对磁盘的要求不一样,所以部署集群前要根据当前 Kubernetes 集群支持的存储类型以及使用场景为 TiDB 集群各组件选择合适的存储类型,通过修改 values.yaml 中各组件的 storageClassName 字段设置存储类型。关于 Kubernetes 集群支持哪些存储类型,请联系系统管理员确定。

注意:

如果创建集群时设置了集群中不存在的存储类型,则会导致集群创建处于 Pending 状态,需要将集群彻底销毁掉

集群拓扑

默认部署的集群拓扑是:3 个 PD Pod,3 个 TiKV Pod,2 个 TiDB Pod 和 1 个监控 Pod。在该部署拓扑下根据数据高可用原则,TiDB Operator 扩展调度器要求 Kubernetes 集群中至少有 3 个节点。如果 Kubernetes 集群节点个数少于 3 个,将会导致有一个 PD Pod 处于 Pending 状态,而 TiKV 和 TiDB Pod 也都不会被创建。

Kubernetes 集群节点个数少于 3 个时,为了使 TiDB 集群能启动起来,可以将默认部署的 PD 和 TiKV Pod 个数都减小到 1 个,或者将 values.yamlschedulerName 改为 Kubernetes 内置调度器 default-scheduler

警告:

default-scheduler 仅适用于演示环境,改为 default-scheduler 后,TiDB 集群的调度将无法保证数据高可用,另外一些其它特性也无法支持,例如 TiDB Pod StableScheduling 等。

其它更多配置参数请参考 TiDB 集群部署配置文档

部署 TiDB 集群

TiDB Operator 部署并配置完成后,可以通过下面命令部署 TiDB 集群:

helm install pingcap/tidb-cluster --name=<release-name> --namespace=<namespace> --version=<chart-version> -f /home/tidb/<release-name>/values-<release-name>.yaml

注意:

namespace命名空间,你可以起一个方便记忆的名字,比如和 release-name 相同的名称。

通过下面命令可以查看 Pod 状态:

kubectl get po -n <namespace> -l app.kubernetes.io/instance=<release-name>

单个 Kubernetes 集群中可以利用 TiDB Operator 部署管理多套 TiDB 集群,重复以上命令并将 release-name 替换成不同名字即可。不同集群既可以在相同 namespace 中,也可以在不同 namespace 中,可根据实际需求进行选择。