快速上手 TiDB Operator

    警告

    本文中的部署说明仅用于测试目的,不要直接用于生产环境。如果要在生产环境部署,请参阅探索更多

    部署的基本步骤如下:

    1. 部署 TiDB Operator
    2. 连接 TiDB 集群
    3. 销毁 TiDB 集群和 Kubernetes 集群

    你可以先观看下面视频(时长约 12 分钟)。该视频完整的演示了快速上手的操作流程。

    本节介绍了两种创建 Kubernetes 测试集群的方法,可用于测试 TiDB Operator 管理的 TiDB 集群。

    • 创建在 Docker 中运行的 Kubernetes,这是目前比较通用的部署方式。
    • 使用 minikube 创建在虚拟机中运行的 Kubernetes

    你也可以使用 在 Google Cloud Platform 的 Google Kubernetes Engine 中部署 Kubernetes 集群。

    目前比较通用的方式是使用 kind 部署本地测试 Kubernetes 集群。kind 适用于使用 Docker 容器作为集群节点运行本地 Kubernetes 集群。请参阅 以查看可用 tags。默认使用当前 kind 支持的最新版本。

    部署前,请确保满足以下要求:

    • docker:版本 >= 17.03
    • :版本 >= 1.12
    • kind:版本 >= 0.8.0
    • 若使用 Linux, 需要被设置为 1

    以下以 0.8.1 版本为例:

    点击查看期望输出

    1. Creating cluster "kind" ...
    2. Ensuring node image (kindest/node:v1.18.2) 🖼
    3. Preparing nodes 📦
    4. Writing configuration 📜
    5. Starting control-plane 🕹️
    6. Installing CNI 🔌
    7. Installing StorageClass 💾
    8. Set kubectl context to "kind-kind"
    9. You can now use your cluster with:
    10. kubectl cluster-info --context kind-kind
    11. Thanks for using kind! 😊

    检查集群是否创建成功:

    1. kubectl cluster-info

    点击查看期望输出

    1. Kubernetes master is running at https://127.0.0.1:51026
    2. KubeDNS is running at https://127.0.0.1:51026/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
    3. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

    Kubernetes 集群部署完成,现在就可以开始部署 TiDB Operator 了!

    使用 minikube 创建 Kubernetes 集群

    可以在虚拟机中创建一个 Kubernetes 集群。minikube 可在 macOS, Linux 和 Windows 上运行。

    部署前,请确保满足以下要求:

    • minikube:版本 1.0.0 及以上,推荐使用较新版本。minikube 需要安装一个兼容的 hypervisor,详情见官方安装教程。
    • : 版本 >= 1.12

    你可以使用 minikube start 直接启动 Kubernetes 集群,中国大陆用户也可以通过 gcr.io mirror 仓库启动 Kubernetes 集群。以下分别对这几种方法进行介绍。

    使用 minikube start 启动 Kubernetes 集群

    安装完 minikube 后,可以执行下面命令启动 Kubernetes 集群:

    1. minikube start

    点击查看期望输出如果一切运行正常,会看到类似下面的输出,根据操作系统和使用的 hypervisor 会有些许差异。

    1. 😄 minikube v1.24.0 on Darwin 12.1
    2. Automatically selected the docker driver. Other choices: hyperkit, virtualbox, ssh
    3. 👍 Starting control plane node minikube in cluster minikube
    4. 🚜 Pulling base image ...
    5. 💾 Downloading Kubernetes v1.22.3 preload ...
    6. > gcr.io/k8s-minikube/kicbase: 355.78 MiB / 355.78 MiB 100.00% 4.46 MiB p/
    7. > preloaded-images-k8s-v13-v1...: 501.73 MiB / 501.73 MiB 100.00% 5.18 MiB
    8. 🔥 Creating docker container (CPUs=2, Memory=1985MB) ...
    9. 🐳 Preparing Kubernetes v1.22.3 on Docker 20.10.8 ...
    10. Generating certificates and keys ...
    11. Booting up control plane ...
    12. Configuring RBAC rules ...
    13. 🔎 Verifying Kubernetes components...
    14. Using image gcr.io/k8s-minikube/storage-provisioner:v5
    15. 🌟 Enabled addons: storage-provisioner, default-storageclass
    16. 🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

    使用 gcr.io mirror 仓库启动 Kubernetes 集群

    中国大陆用户可以使用国内 gcr.io mirror 仓库,例如 registry.cn-hangzhou.aliyuncs.com/google_containers

    1. minikube start --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

    使用 kubectl 进行集群操作

    你可以使用 minikube 的子命令 kubectl 来进行集群操作。要使 kubectl 命令生效,你需要在 shell 配置文件中添加以下别名设置命令,或者在打开一个新的 shell 后执行以下别名设置命令。

    1. alias kubectl='minikube kubectl --'

    执行以下命令检查集群状态,并确保可以通过 kubectl 访问集群:

      点击查看期望输出

      1. Kubernetes master is running at https://192.168.64.2:8443
      2. KubeDNS is running at https://192.168.64.2:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
      3. To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

      Kubernetes 集群部署完成,现在就可以开始部署 TiDB Operator 了!

      第 2 步:部署 TiDB Operator

      部署 TiDB Operator 的过程分为两步:

      1. 安装 TiDB Operator CRDs
      2. 安装 TiDB Operator

      安装 TiDB Operator CRDs

      TiDB Operator 包含许多实现 TiDB 集群不同组件的自定义资源类型 (CRD)。执行以下命令安装 CRD 到集群中:

      1. kubectl create -f https://raw.githubusercontent.com/pingcap/tidb-operator/v1.3.2/manifests/crd.yaml

      点击查看期望输出

      1. customresourcedefinition.apiextensions.k8s.io/tidbclusters.pingcap.com created
      2. customresourcedefinition.apiextensions.k8s.io/backups.pingcap.com created
      3. customresourcedefinition.apiextensions.k8s.io/restores.pingcap.com created
      4. customresourcedefinition.apiextensions.k8s.io/backupschedules.pingcap.com created
      5. customresourcedefinition.apiextensions.k8s.io/tidbmonitors.pingcap.com created
      6. customresourcedefinition.apiextensions.k8s.io/tidbinitializers.pingcap.com created
      7. customresourcedefinition.apiextensions.k8s.io/tidbclusterautoscalers.pingcap.com created

      快速上手 - 图2注意

      对于 Kubernetes 1.16 之前的版本,Kubernetes 仅支持 v1beta1 版本的 CRD,你需要将上述命令中的 crd.yaml 修改为 crd_v1beta1.yaml

      安装 TiDB Operator

      安装 Helm 3 并使用 Helm 3 部署 TiDB Operator。

        1. helm repo add pingcap https://charts.pingcap.org/

        点击查看期望输出

        1. "pingcap" has been added to your repositories
      1. 为 TiDB Operator 创建一个命名空间。

        1. kubectl create namespace tidb-admin

        点击查看期望输出

        1. namespace/tidb-admin created
      2. 安装 TiDB Operator。

        1. helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.3.2

        如果访问 Docker Hub 网速较慢,可以使用阿里云上的镜像:

        1. helm install --namespace tidb-admin tidb-operator pingcap/tidb-operator --version v1.3.2 \
        2. --set operatorImage=registry.cn-beijing.aliyuncs.com/tidb/tidb-operator:v1.3.2 \
        3. --set tidbBackupManagerImage=registry.cn-beijing.aliyuncs.com/tidb/tidb-backup-manager:v1.3.2 \
        4. --set scheduler.kubeSchedulerImageName=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler

        点击查看期望输出

      检查 TiDB Operator 组件是否正常运行起来:

      1. kubectl get pods --namespace tidb-admin -l app.kubernetes.io/instance=tidb-operator

      点击查看期望输出

      1. NAME READY STATUS RESTARTS AGE
      2. tidb-controller-manager-6d8d5c6d64-b8lv4 1/1 Running 0 2m22s
      3. tidb-scheduler-644d59b46f-4f6sb 2/2 Running 0 2m22s

      当所有的 pods 都处于 Running 状态时,继续下一步。

      下面分别介绍 TiDB 集群和监控的部署方法。

      部署 TiDB 集群

      1. kubectl create namespace tidb-cluster && \

      如果访问 Docker Hub 网速较慢,可以使用 UCloud 上的镜像:

      1. kubectl create namespace tidb-cluster && \
      2. kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic-cn/tidb-cluster.yaml

      点击查看期望输出

      1. namespace/tidb-cluster created
      2. tidbcluster.pingcap.com/basic created

      如果要将 TiDB 集群部署到 ARM64 机器上,可以参考在 ARM64 机器上部署 TiDB 集群

      部署 TiDB 集群监控

      1. kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic/tidb-monitor.yaml

      如果访问 Docker Hub 网速较慢,可以使用 UCloud 上的镜像:

      1. kubectl -n tidb-cluster apply -f https://raw.githubusercontent.com/pingcap/tidb-operator/master/examples/basic-cn/tidb-monitor.yaml

      点击查看期望输出

      1. tidbmonitor.pingcap.com/basic created
      1. watch kubectl get po -n tidb-cluster

      点击查看期望输出

      1. NAME READY STATUS RESTARTS AGE
      2. basic-discovery-6bb656bfd-xl5pb 1/1 Running 0 9m9s
      3. basic-monitor-5fc8589c89-gvgjj 3/3 Running 0 8m58s
      4. basic-pd-0 1/1 Running 0 9m8s
      5. basic-tidb-0 2/2 Running 0 7m14s
      6. basic-tikv-0 1/1 Running 0 8m13s

      所有组件的 Pod 都启动后,每种类型组件(pdtikvtidb)都会处于 Running 状态。此时,你可以按 Ctrl+C 返回命令行,然后进行下一步。

      第 4 步:连接 TiDB 集群

      由于 TiDB 支持 MySQL 传输协议及其绝大多数的语法,因此你可以直接使用 mysql 命令行工具连接 TiDB 进行操作。以下说明连接 TiDB 集群的步骤。

      安装 mysql 命令行工具

      要连接到 TiDB,你需要在使用 kubectl 的主机上安装与 MySQL 兼容的命令行客户端。可以安装 MySQL Server、MariaDB Server 和 Percona Server 的 MySQL 可执行文件,也可以从操作系统软件仓库中安装。

      转发 TiDB 服务 4000 端口

      本步骤将端口从本地主机转发到 Kubernetes 中的 TiDB Servcie

      首先,获取 tidb-cluster 命名空间中的服务列表:

      1. kubectl get svc -n tidb-cluster

      点击查看期望输出

      1. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      2. basic-discovery ClusterIP 10.101.69.5 <none> 10261/TCP 10m
      3. basic-grafana ClusterIP 10.106.41.250 <none> 3000/TCP 10m
      4. basic-monitor-reloader ClusterIP 10.99.157.225 <none> 9089/TCP 10m
      5. basic-pd ClusterIP 10.104.43.232 <none> 2379/TCP 10m
      6. basic-pd-peer ClusterIP None <none> 2380/TCP 10m
      7. basic-prometheus ClusterIP 10.106.177.227 <none> 9090/TCP 10m
      8. basic-tidb ClusterIP 10.99.24.91 <none> 4000/TCP,10080/TCP 8m40s
      9. basic-tidb-peer ClusterIP None <none> 10080/TCP 8m40s
      10. basic-tikv-peer ClusterIP None <none> 20160/TCP 9m39s

      这个例子中,TiDB Servicebasic-tidb

      然后,使用以下命令转发本地端口到集群:

      1. kubectl port-forward -n tidb-cluster svc/basic-tidb 14000:4000 > pf14000.out &

      如果端口 14000 已经被占用,可以更换一个空闲端口。命令会在后台运行,并将输出转发到文件 pf14000.out。所以,你可以继续在当前 shell 会话中执行命令。

      连接 TiDB 服务

      注意

      当使用 MySQL Client 8.0 访问 TiDB 服务(TiDB 版本 < v4.0.7)时,如果用户账户有配置密码,必须显式指定 --default-auth=mysql_native_password 参数,因为 mysql_native_password 不再是默认的插件

      1. mysql --comments -h 127.0.0.1 -P 14000 -u root

      点击查看期望输出

      1. Welcome to the MariaDB monitor. Commands end with ; or \g.
      2. Your MySQL connection id is 178505
      3. Server version: 5.7.25-TiDB-v5.4.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
      4. Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
      5. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
      6. MySQL [(none)]>

      以下是一些可以用来验证集群功能的命令。

      1. mysql> use test;
      2. mysql> create table hello_world (id int unsigned not null auto_increment primary key, v varchar(32));
      3. Query OK, 0 rows affected (0.17 sec)
      4. mysql> select * from information_schema.tikv_region_status where db_name=database() and table_name='hello_world'\G
      5. *************************** 1. row ***************************
      6. REGION_ID: 2
      7. START_KEY: 7480000000000000FF3700000000000000F8
      8. END_KEY:
      9. TABLE_ID: 55
      10. DB_NAME: test
      11. TABLE_NAME: hello_world
      12. IS_INDEX: 0
      13. INDEX_ID: NULL
      14. INDEX_NAME: NULL
      15. EPOCH_VERSION: 23
      16. WRITTEN_BYTES: 0
      17. READ_BYTES: 0
      18. APPROXIMATE_SIZE: 1
      19. APPROXIMATE_KEYS: 0
      20. 1 row in set (0.03 sec)

      查询 TiDB 版本号

      1. mysql> select tidb_version()\G
      2. *************************** 1. row ***************************
      3. tidb_version(): Release Version: v5.4.0
      4. Edition: Community
      5. Git Branch: heads/refs/tags/v5.4.0
      6. UTC Build Time: 2021-11-24 13:32:39
      7. GoVersion: go1.16.4
      8. Race Enabled: false
      9. TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
      10. Check Table Before Drop: false
      11. 1 row in set (0.01 sec)

      查询 TiKV 存储状态

      查询 TiDB 集群基本信息

      该命令需要 TiDB 4.0 或以上版本,如果你部署的 TiDB 版本不支持该命令,请先。

      1. mysql> select * from information_schema.cluster_info\G
      2. *************************** 1. row ***************************
      3. TYPE: tidb
      4. INSTANCE: basic-tidb-0.basic-tidb-peer.tidb-cluster.svc:4000
      5. STATUS_ADDRESS: basic-tidb-0.basic-tidb-peer.tidb-cluster.svc:10080
      6. VERSION: 5.2.1
      7. GIT_HASH: 689a6b6439ae7835947fcaccf329a3fc303986cb
      8. START_TIME: 2020-05-28T22:50:11Z
      9. UPTIME: 3m21.459090928s
      10. *************************** 2. row ***************************
      11. TYPE: pd
      12. INSTANCE: basic-pd:2379
      13. STATUS_ADDRESS: basic-pd:2379
      14. VERSION: 5.2.1
      15. GIT_HASH: 56d4c3d2237f5bf6fb11a794731ed1d95c8020c2
      16. START_TIME: 2020-05-28T22:45:04Z
      17. UPTIME: 8m28.459091915s
      18. *************************** 3. row ***************************
      19. TYPE: tikv
      20. INSTANCE: basic-tikv-0.basic-tikv-peer.tidb-cluster.svc:20160
      21. STATUS_ADDRESS: 0.0.0.0:20180
      22. VERSION: 5.2.1
      23. GIT_HASH: 198a2cea01734ce8f46d55a29708f123f9133944
      24. START_TIME: 2020-05-28T22:48:21Z
      25. UPTIME: 5m11.459102648s
      26. 3 rows in set (0.01 sec)

      访问 Grafana 面板

      你可以转发 Grafana 服务端口,以便本地访问 Grafana 面板。

      1. kubectl port-forward -n tidb-cluster svc/basic-grafana 3000 > pf3000.out &

      Grafana 面板可在 kubectl 所运行的主机上通过 访问。默认用户名和密码都是 “admin” 。

      请注意,如果你是非本机(比如 Docker 容器或远程服务器)上运行 kubectl port-forward,将无法在本地浏览器里通过 localhost:3000 访问,可以通过下面命令监听所有地址:

      1. kubectl port-forward --address 0.0.0.0 -n tidb-cluster svc/basic-grafana 3000 > pf3000.out &

      然后通过 http://${远程服务器IP}:3000 访问 Grafana。

      了解更多使用 TiDB Operator 部署 TiDB 集群监控的信息,可以查阅 。

      TiDB Operator 还可简化 TiDB 集群的滚动升级。以下展示使用 kubectl 命令行工具更新 TiDB 版本到 nightly 版本的过程。在此之前,先了解一下 kubectl 的子命令 kubectl patch。 它可以直接应用补丁。Kubernetes 支持几种不同的补丁策略,每种策略有不同的功能、格式等。可参考 Kubernetes Patch 了解更多细节。

      修改 TiDB 集群版本

      执行以下命令,将 TiDB 集群升级到 nightly 版本:

      1. kubectl patch tc basic -n tidb-cluster --type merge -p '{"spec": {"version": "nightly"} }'

      点击查看期望输出

      1. tidbcluster.pingcap.com/basic patched

      执行以下命令以了解集群升级组件时的进度。你可以看到某些 Pods 进入 Terminating 状态后,又回到 ContainerCreating,最后重新进入 Running 状态。

      1. watch kubectl get po -n tidb-cluster

      点击查看期望输出

      1. NAME READY STATUS RESTARTS AGE
      2. basic-discovery-6bb656bfd-7lbhx 1/1 Running 0 24m
      3. basic-pd-0 1/1 Terminating 0 5m31s
      4. basic-tidb-0 2/2 Running 0 2m19s
      5. basic-tikv-0 1/1 Running 0 4m13s

      转发 TiDB 服务端口

      当所有 Pods 都重启后,将看到版本号已更改。需要注意的是,由于相关 Pods 已被销毁重建,这里需要重新设置端口转发。

      1. kubectl port-forward -n tidb-cluster svc/basic-tidb 24000:4000 > pf24000.out &

      如果端口 24000 已经被占用,可以更换一个空闲端口。

      检查 TiDB 集群版本

      1. mysql --comments -h 127.0.0.1 -P 24000 -u root -e 'select tidb_version()\G'

      点击查看期望输出

      注意, nightly 不是固定版本,不同时间会有不同结果。下面示例仅供参考。

      1. *************************** 1. row ***************************
      2. tidb_version(): Release Version: v5.4.0-alpha-445-g778e188fa
      3. Edition: Community
      4. Git Commit Hash: 778e188fa7af4f48497ff9e05ca6681bf9a5fa16
      5. Git Branch: master
      6. UTC Build Time: 2021-12-17 17:02:49
      7. GoVersion: go1.16.4
      8. Race Enabled: false
      9. TiKV Min Version: v3.0.0-60965b006877ca7234adaced7890d7b029ed1306
      10. Check Table Before Drop: false

      第 6 步:销毁 TiDB 集群和 Kubernetes 集群

      完成测试后,你可能希望销毁 TiDB 集群和 Kubernetes 集群。

      停止 kubectl 的端口转发

      如果你仍在运行正在转发端口的 kubectl 进程,请终止它们:

      1. pgrep -lfa kubectl

      销毁 TiDB 集群

      销毁 TiDB 集群的步骤如下。

      删除 TiDB Cluster

      1. kubectl delete tc basic -n tidb-cluster

      此命令中,tc 为 tidbclusters 的简称。

      删除 TiDB Monitor

      1. kubectl delete tidbmonitor basic -n tidb-cluster

      删除 PV 数据

      如果你的部署使用持久性数据存储,则删除 TiDB 集群将不会删除集群的数据。如果不再需要数据,可以运行以下命令来清理数据:

      1. kubectl delete pvc -n tidb-cluster -l app.kubernetes.io/instance=basic,app.kubernetes.io/managed-by=tidb-operator && \
      2. kubectl get pv -l app.kubernetes.io/namespace=tidb-cluster,app.kubernetes.io/managed-by=tidb-operator,app.kubernetes.io/instance=basic -o name | xargs -I {} kubectl patch {} -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

      删除命名空间

      为确保没有残余资源,你可以删除用于 TiDB 集群的命名空间。

      1. kubectl delete namespace tidb-cluster

      销毁 Kubernetes 集群

      销毁 Kubernetes 集群的方法取决于其创建方式。以下是销毁 Kubernetes 集群的步骤。

      如果使用了 kind 创建 Kubernetes 集群,在测试完成后,执行下面命令来销毁集群:

      1. kind delete cluster

      如果使用了 minikube 创建 Kubernetes 集群,测试完成后,执行下面命令来销毁集群:

      如果你想在生产环境部署,请参考以下文档:

      在公有云上部署: