在 Minikube 集群上部署 TiDB 集群

Minikube 可以让你在个人电脑上的虚拟机中创建一个 Kubernetes 集群,支持 macOS、Linux 和 Windows 系统。本文介绍如何在 Minikube 集群上部署 TiDB 集群。

警告:

  • 对于生产环境,不要使用此方式进行部署。

  • 尽管 Minikube 支持通过 --vm-driver=none 选项使用主机 Docker 而不使用虚拟机,但是目前尚没有针对 TiDB Operator 做过全面的测试,可能会无法正常工作。如果你想在不支持虚拟化的系统(例如,VPS)上试用 TiDB Operator,可以考虑使用 kind

安装 Minikube 并启动 Kubernetes 集群

参考安装 Minikube,在你的机器上安装 Minikube 1.0.0+。

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

  1. minikube start

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

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

或者给 Docker 配置 HTTP/HTTPS 代理。

将下面命令中的 127.0.0.1:1086 替换为你自己的 HTTP/HTTPS 代理地址:

  1. minikube start --docker-env https_proxy=http://127.0.0.1:1086 \
  2. --docker-env http_proxy=http://127.0.0.1:1086

注意:

由于 Minikube 通过虚拟机(默认)运行,127.0.0.1 是虚拟机本身,有些情况下你可能想要使用你的主机的实际 IP。

参考 Minikube setup 查看配置虚拟机和 Kubernetes 集群的更多选项。

安装 kubectl 并访问集群

Kubernetes 命令行工具 kubectl,可以让你执行命令访问 Kubernetes 集群。

参考 Install and Set Up kubectl 安装和配置 kubectl。

kubectl 安装完成后,测试 Minikube Kubernetes 集群:

  1. kubectl cluster-info

安装 TiDB Operator 并运行 TiDB 集群

安装 Helm

Helm 是 Kubernetes 包管理工具,通过 Helm 可以一键安装 TiDB 的所有分布式组件。安装 Helm 需要同时安装服务端和客户端组件。

  1. curl https://raw.githubusercontent.com/helm/helm/master/scripts/get | bash

安装 helm tiller:

  1. helm init

如果无法访问 gcr.io,你可以尝试 mirror 仓库:

  1. helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:$(helm version --client --short | grep -Eo 'v[0-9]\.[0-9]+\.[0-9]+')

安装完成后,执行 helm version 会同时显示客户端和服务端组件版本:

  1. helm version

输出类似如下内容:

  1. Client: &version.Version{SemVer:"v2.13.1",
  2. GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}
  3. Server: &version.Version{SemVer:"v2.13.1",
  4. GitCommit:"618447cbf203d147601b4b9bd7f8c37a5d39fbb4", GitTreeState:"clean"}

如果只显示客户端版本,表示 helm 无法连接到服务端。通过 kubectl 查看 tiller pod 是否在运行:

  1. kubectl -n kube-system get pods -l app=helm

添加 Helm 仓库

Helm 仓库 (https://charts.pingcap.org/) 存放着 PingCAP 发布的 charts,例如 tidb-operator、tidb-cluster 和 tidb-backup 等等。可使用以下命令添加仓库:

  1. helm repo add pingcap https://charts.pingcap.org/ && \
  2. helm repo list

然后可以查看可用的 chart:

  1. helm repo update && \
  2. helm search tidb-cluster -l && \
  3. helm search tidb-operator -l

在 Kubernetes 集群上安装 TiDB Operator

注意:

<chartVersion> 在后面文档中代表 chart 版本,例如 v1.0.0

克隆 tidb-operator 代码库并安装 TiDB Operator:

  1. git clone --depth=1 https://github.com/pingcap/tidb-operator && \
  2. cd tidb-operator && \
  3. kubectl apply -f ./manifests/crd.yaml && \
  4. helm install pingcap/tidb-operator --name tidb-operator --namespace tidb-admin --version=<chartVersion>

然后,可以通过如下命令查看 TiDB Operator 的启动情况:

  1. kubectl get pods --namespace tidb-admin -o wide --watch

如果无法访问 gcr.io(Pod 由于 ErrImagePull 无法启动),可以尝试从 mirror 仓库中拉取 kube-scheduler 镜像。可以通过以下命令升级 tidb-operator:

  1. helm upgrade tidb-operator pingcap/tidb-operator --namespace tidb-admin --set \
  2. scheduler.kubeSchedulerImageName=registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler --version=<chartVersion>

如果 tidb-scheduler 和 tidb-controller-manager 都进入 running 状态,你可以继续下一步启动一个 TiDB 集群。

启动 TiDB 集群

通过下面命令启动 TiDB 集群:

  1. helm install pingcap/tidb-cluster --name demo --set \
  2. schedulerName=default-scheduler,pd.storageClassName=standard,tikv.storageClassName=standard,pd.replicas=1,tikv.replicas=1,tidb.replicas=1 --version=<chartVersion>

可以通过下面命令观察集群的状态:

  1. kubectl get pods --namespace default -l app.kubernetes.io/instance=demo -o wide --watch

通过 Ctrl+C 停止观察。

测试 TiDB 集群

测试 TiDB 集群之前,请确保已经安装 MySQL 客户端。从 Pod 启动、运行到服务可以访问有一些延时,可以通过下面命令查看服务:

  1. kubectl get svc --watch

如果看到 demo-tidb 出现,说明服务已经可以访问,可以 Ctrl+C 停止。

按照以下步骤访问 TiDB 集群:

  1. 转发本地端口到 TiDB 端口。

    1. kubectl port-forward svc/demo-tidb 4000:4000
  2. 在另一个终端窗口中,通过 MySQL 客户端访问 TiDB:

    1. mysql -h 127.0.0.1 -P 4000 -uroot

    或者可以直接执行 SQL 命令:

    1. mysql -h 127.0.0.1 -P 4000 -uroot -e 'select tidb_version();'

监控 TiDB 集群

按照以下步骤监控 TiDB 集群状态:

  1. 转发本地端口到 Grafana 端口。

    1. kubectl port-forward svc/demo-grafana 3000:3000
  2. 打开浏览器,通过 http://localhost:3000 访问 Grafana。

    或者,Minikube 提供了 minikube service 的方式暴露 Grafana 服务,可以更方便的接入。

    1. minikube service demo-grafana

    上述命令会自动搭建代理并在浏览器中打开 Grafana。

删除 TiDB 集群

通过下面命令删除 demo 集群:

  1. helm delete --purge demo

更新 demo 集群使用的 PV 的 reclaim 策略为 Delete:

  1. kubectl get pv -l app.kubernetes.io/instance=demo -o name | xargs -I {} kubectl patch {} -p '{"spec":{"persistentVolumeReclaimPolicy":"Delete"}}'

删除 PVC:

  1. kubectl delete pvc -l app.kubernetes.io/managed-by=tidb-operator

FAQ

Minikube 上的 TiDB 集群不响应或者响应非常慢

Minikube 虚拟机默认配置为 2048 MB 内存和 2 个 CPU。可以在 minikube start 时通过--memory--cpus 选项为其分配更多资源。注意,为了使配置修改生效,你需要重新创建 Minikube 虚拟机。

  1. minikube delete && \
  2. minikube start --cpus 4 --memory 4096 ...