Skip to content

TiDB Kubernetes 部署 ​

TiDB 提供了完整的 Kubernetes 支持,通过 TiDB Operator 可以在 Kubernetes 集群上自动化部署、管理和运维 TiDB 集群。TiDB Operator 基于 Kubernetes 自定义资源定义(CRD)和控制器模式,实现了 TiDB 集群的全生命周期管理。

部署前准备 ​

1. Kubernetes 集群要求 ​

部署 TiDB 集群前,需要准备一个符合以下要求的 Kubernetes 集群:

  • Kubernetes 版本:1.19 及以上
  • 节点数量:至少 3 个节点,用于部署 TiDB、TiKV 和 PD
  • 节点资源:
    • TiDB 节点:8 核 CPU、16 GB 内存
    • TiKV 节点:8 核 CPU、32 GB 内存、500 GB SSD 磁盘
    • PD 节点:4 核 CPU、8 GB 内存、100 GB SSD 磁盘
  • 存储:支持动态卷供应,如 Ceph RBD、AWS EBS、GCP PD 等
  • 网络:支持 Pod 间通信,建议使用 Calico、Flannel 等网络插件

2. 安装 TiDB Operator ​

TiDB Operator 是部署和管理 TiDB 集群的核心组件,需要先安装 TiDB Operator:

使用 Helm 安装 TiDB Operator ​

bash
# 添加 PingCAP Helm 仓库
helm repo add pingcap https://charts.pingcap.org/
helm repo update

# 创建命名空间
kubectl create namespace tidb-operator

# 安装 TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-operator --version v1.5.0

# 验证 TiDB Operator 安装状态
kubectl get pods -n tidb-operator

自定义 TiDB Operator 配置 ​

根据 Kubernetes 集群的规模和需求,可以自定义 TiDB Operator 的配置:

bash
# 创建 values.yaml 文件
cat << EOF > values.yaml
tidbOperator:
  controllerManager:
    replicas: 2
    resources:
      limits:
        cpu: 1000m
        memory: 1Gi
      requests:
        cpu: 500m
        memory: 512Mi
EOF

# 安装或升级 TiDB Operator
helm install tidb-operator pingcap/tidb-operator --namespace tidb-operator --version v1.5.0 -f values.yaml

3. 配置存储类 ​

TiDB 集群需要使用高性能的存储,建议配置 SSD 存储类:

配置 Ceph RBD 存储类 ​

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
  clusterID: <ceph-cluster-id>
  pool: <ceph-pool-name>
  imageFeatures: layering
  csi.storage.k8s.io/provisioner-secret-name: csi-rbd-provisioner
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-provisioner
  csi.storage.k8s.io/controller-expand-secret-namespace: kube-system
  csi.storage.k8s.io/node-stage-secret-name: csi-rbd-node
  csi.storage.k8s.io/node-stage-secret-namespace: kube-system
  csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - discard
EOF

# 应用存储类配置
kubectl apply -f ceph-rbd-sc.yaml

配置 AWS EBS 存储类 ​

yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: gp3
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp3
  iopsPerGB: "10000"
  throughput: "125"
  fsType: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - discard
EOF

# 应用存储类配置
kubectl apply -f aws-ebs-sc.yaml

部署 TiDB 集群 ​

1. 准备集群配置文件 ​

创建 TiDB 集群的配置文件,定义集群的规模、资源、存储等配置:

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbCluster
metadata:
  name: basic
  namespace: tidb-cluster
spec:
  version: v7.5.0
  timezone: UTC
  pvReclaimPolicy: Delete
  enableDynamicConfiguration: true
  configUpdateStrategy: RollingUpdate
  discovery:
    image: pingcap/tidb-discovery:v1.5.0
  enableTLSCluster: false

  pd:
    baseImage: pingcap/pd
    replicas: 3
    requests:
      storage: "100Gi"
    config:
      replication:
        max-replicas: 3
    storageClassName: ceph-rbd

  tikv:
    baseImage: pingcap/tikv
    replicas: 3
    requests:
      storage: "500Gi"
    config:
      storage:
        block-cache-size: "24GB"
    storageClassName: ceph-rbd

  tidb:
    baseImage: pingcap/tidb
    replicas: 2
    service:
      type: NodePort
    config:
      performance:
        max-procs: 8

  monitor:
    baseImage: prom/prometheus
    replicas: 1
    requests:
      storage: "100Gi"
    config:
      retention: 7d
    storageClassName: ceph-rbd

  grafana:
    baseImage: grafana/grafana
    replicas: 1

  alertmanager:
    baseImage: prom/alertmanager
    replicas: 1
EOF

2. 部署 TiDB 集群 ​

bash
# 创建命名空间
kubectl create namespace tidb-cluster

# 部署 TiDB 集群
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 查看集群部署状态
kubectl get pods -n tidb-cluster

# 查看集群状态
kubectl get tc basic -n tidb-cluster

3. 访问 TiDB 集群 ​

部署完成后,可以通过以下方式访问 TiDB 集群:

通过 NodePort 访问 ​

bash
# 获取 TiDB NodePort
TIDB_NODE_PORT=$(kubectl get svc basic-tidb -n tidb-cluster -o jsonpath='{.spec.ports[?(@.name=="mysql-client")].nodePort}')

# 获取 Node IP
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')

# 使用 MySQL 客户端访问
mysql -h $NODE_IP -P $TIDB_NODE_PORT -u root

通过 LoadBalancer 访问 ​

如果 Kubernetes 集群支持 LoadBalancer,可以修改 TiDB Service 的类型为 LoadBalancer:

yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.service.type 为 LoadBalancer
tidb:
  service:
    type: LoadBalancer
bash
# 应用修改
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 获取 LoadBalancer IP
TIDB_LB_IP=$(kubectl get svc basic-tidb -n tidb-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

# 使用 MySQL 客户端访问
mysql -h $TIDB_LB_IP -P 4000 -u root

配置管理 ​

1. 修改集群配置 ​

TiDB 集群部署后,可以通过修改 TidbCluster 自定义资源来调整集群配置:

调整 TiKV 资源配置 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.requests 和 tikv.limits
tikv:
  requests:
    cpu: "8"
    memory: "32Gi"
    storage: "500Gi"
  limits:
    cpu: "8"
    memory: "32Gi"

调整 TiDB 配置 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.config
tidb:
  config:
    performance:
      max-procs: 8
    log:
      level: "info"

应用配置修改 ​

bash
# 应用修改
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 查看配置更新状态
kubectl get tc basic -n tidb-cluster -o jsonpath='{.status.conditions}'

2. 使用 ConfigMap 配置 ​

对于更复杂的配置,可以使用 ConfigMap 来管理:

bash
# 创建 ConfigMap
kubectl create configmap tikv-config -n tidb-cluster --from-file=tikv.toml

# 在 TidbCluster 中引用 ConfigMap
tikv:
  configRef:
    name: tikv-config
    key: tikv.toml

监控和告警 ​

1. 访问监控面板 ​

TiDB 集群部署时会自动部署 Prometheus、Grafana 和 Alertmanager:

访问 Grafana ​

bash
# 获取 Grafana Service
kubectl get svc basic-grafana -n tidb-cluster

# 端口转发访问 Grafana
kubectl port-forward svc/basic-grafana 3000:3000 -n tidb-cluster

访问 http://localhost:3000,使用默认用户名 admin 和密码 admin 登录。

访问 Prometheus ​

bash
# 端口转发访问 Prometheus
kubectl port-forward svc/basic-prometheus 9090:9090 -n tidb-cluster

访问 http://localhost:9090。

访问 Alertmanager ​

bash
# 端口转发访问 Alertmanager
kubectl port-forward svc/basic-alertmanager 9093:9093 -n tidb-cluster

访问 http://localhost:9093。

2. 配置告警规则 ​

可以通过修改 TidbMonitor 自定义资源来配置告警规则:

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbMonitor
metadata:
  name: basic
  namespace: tidb-cluster
spec:
  clusters:
  - name: basic
  prometheus:
    baseImage: prom/prometheus
    replicas: 1
    service:
      type: NodePort
    config:
      rule_files:
      - /etc/prometheus/rules/alertmanager/tidb.rules.yaml
      - /etc/prometheus/rules/alertmanager/tikv.rules.yaml
      - /etc/prometheus/rules/alertmanager/pd.rules.yaml
      - /etc/prometheus/rules/alertmanager/node.rules.yaml
      - /etc/prometheus/rules/alertmanager/k8s.rules.yaml
  grafana:
    baseImage: grafana/grafana
    replicas: 1
    service:
      type: NodePort
  alertmanager:
    baseImage: prom/alertmanager
    replicas: 1
    service:
      type: NodePort
    config:
      global:
        resolve_timeout: 5m
      route:
        group_by:
        - alertname
        - cluster
        - service
        group_wait: 30s
        group_interval: 5m
        repeat_interval: 1h
        receiver: default-receiver
      receivers:
      - name: default-receiver
        email_configs:
        - to: alerts@example.com
          from: alertmanager@example.com
          smarthost: smtp.example.com:587
          auth_username: alertmanager@example.com
          auth_password: password
          require_tls: true
EOF

# 应用配置
kubectl apply -f tidb-monitor.yaml -n tidb-cluster

集群维护 ​

1. 扩容集群 ​

可以通过修改 TidbCluster 自定义资源来扩容集群:

扩容 TiKV 节点 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.replicas
tikv:
  replicas: 5

扩容 TiDB 节点 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.replicas
tidb:
  replicas: 3

应用扩容配置 ​

bash
# 应用扩容配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 查看扩容进度
kubectl get pods -n tidb-cluster -w

2. 缩容集群 ​

可以通过修改 TidbCluster 自定义资源来缩容集群:

缩容 TiKV 节点 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tikv.replicas
tikv:
  replicas: 3

缩容 TiDB 节点 ​

yaml
# 修改 tidb-cluster.yaml 文件中的 tidb.replicas
tidb:
  replicas: 2

应用缩容配置 ​

bash
# 应用缩容配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 查看缩容进度
kubectl get pods -n tidb-cluster -w

3. 升级集群 ​

可以通过修改 TidbCluster 自定义资源来升级集群:

yaml
# 修改 tidb-cluster.yaml 文件中的 spec.version
spec:
  version: v7.6.0
bash
# 应用升级配置
kubectl apply -f tidb-cluster.yaml -n tidb-cluster

# 查看升级进度
kubectl get pods -n tidb-cluster -w

# 查看升级状态
kubectl get tc basic -n tidb-cluster -o jsonpath='{.status.conditions}'

4. 备份和恢复 ​

在 Kubernetes 上,可以使用 TiDB Operator 提供的 TidbBackup 和 TidbRestore 自定义资源来管理备份和恢复:

创建备份 ​

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbBackup
metadata:
  name: basic-backup
  namespace: tidb-cluster
spec:
  from:
    name: basic
  br:
    cluster:
      namespace: tidb-cluster
    clusterName: basic
    sendCredToTikv: true
    options:
    - --ratelimit=128
    - --concurrency=64
  s3:
    provider: aws
    secretName: s3-secret
    bucket: tidb-backup
    prefix: basic
    region: us-east-1
    endpoint: s3.amazonaws.com
EOF

# 应用备份配置
kubectl apply -f tidb-backup.yaml -n tidb-cluster

# 查看备份状态
kubectl get tb basic-backup -n tidb-cluster -o jsonpath='{.status.conditions}'

恢复备份 ​

yaml
apiVersion: pingcap.com/v1alpha1
kind: TidbRestore
metadata:
  name: basic-restore
  namespace: tidb-cluster
spec:
  to:
    name: basic
  br:
    cluster:
      namespace: tidb-cluster
    clusterName: basic
    sendCredToTikv: true
    options:
    - --ratelimit=128
    - --concurrency=64
  s3:
    provider: aws
    secretName: s3-secret
    bucket: tidb-backup
    prefix: basic
    region: us-east-1
    endpoint: s3.amazonaws.com
EOF

# 应用恢复配置
kubectl apply -f tidb-restore.yaml -n tidb-cluster

# 查看恢复状态
kubectl get tr basic-restore -n tidb-cluster -o jsonpath='{.status.conditions}'

故障排除 ​

1. 查看集群状态 ​

bash
# 查看 TidbCluster 状态
kubectl get tc basic -n tidb-cluster -o yaml

# 查看 Pod 状态
kubectl get pods -n tidb-cluster

# 查看 Pod 日志
kubectl logs -f <pod-name> -n tidb-cluster

# 查看事件
kubectl get events -n tidb-cluster

2. 常见故障及解决方案 ​

PD 集群无法启动 ​

可能原因:

  • 存储卷无法挂载
  • PD 节点间网络通信失败
  • 初始集群配置错误

解决方案:

  • 检查存储类配置,确保动态卷供应正常
  • 检查网络插件配置,确保 Pod 间通信正常
  • 检查 PD 配置,特别是 initial-cluster 配置

TiKV 节点频繁重启 ​

可能原因:

  • 内存不足,导致 OOM
  • 磁盘 I/O 性能不足
  • 配置错误

解决方案:

  • 增加 TiKV 节点的内存资源
  • 检查存储性能,确保使用高性能 SSD
  • 检查 TiKV 配置,特别是内存相关配置

TiDB 连接失败 ​

可能原因:

  • TiDB Pod 未就绪
  • Service 配置错误
  • 网络访问限制

解决方案:

  • 检查 TiDB Pod 状态,确保所有 Pod 就绪
  • 检查 Service 配置,确保端口映射正确
  • 检查网络策略,确保允许外部访问

最佳实践 ​

1. 资源配置最佳实践 ​

  • PD 节点:

    • CPU:4 核+
    • 内存:8 GB+
    • 存储:100 GB+ SSD
  • TiKV 节点:

    • CPU:8 核+
    • 内存:32 GB+,建议内存大小为 CPU 核心数的 4-8 倍
    • 存储:500 GB+ NVMe SSD
  • TiDB 节点:

    • CPU:8 核+
    • 内存:16 GB+
    • 存储:200 GB+ SSD

2. 存储最佳实践 ​

  • 使用 SSD 存储,推荐 NVMe SSD
  • 配置合理的存储类,支持动态卷供应
  • 设置合适的存储容量,预留足够的扩容空间
  • 启用卷扩展功能,便于后续扩容

3. 高可用性最佳实践 ​

  • 部署至少 3 个 PD 节点,确保 PD 集群的高可用性
  • 部署至少 3 个 TiKV 节点,确保数据的高可用性
  • 部署至少 2 个 TiDB 节点,确保服务的高可用性
  • 跨可用区部署,提高集群的容灾能力

4. 监控和告警最佳实践 ​

  • 配置全面的监控指标,包括集群性能、资源使用、存储状态等
  • 设置合理的告警阈值,避免误告警
  • 配置多个告警渠道,确保告警及时送达
  • 定期审查告警规则,根据业务需求调整

5. 备份和恢复最佳实践 ​

  • 定期进行全量备份,建议每天一次
  • 启用增量备份,减少数据丢失风险
  • 将备份数据存储在异地,提高容灾能力
  • 定期进行恢复测试,验证备份数据的可用性

常见问题(FAQ) ​

Q1: TiDB Operator 支持哪些 Kubernetes 版本? ​

A1: TiDB Operator 支持 Kubernetes 1.19 及以上版本,建议使用 Kubernetes 1.20 或更高版本。

Q2: 如何选择 TiDB 集群的存储类? ​

A2: 建议选择高性能的 SSD 存储类,如 Ceph RBD、AWS EBS gp3、GCP PD SSD 等。存储类需要支持动态卷供应和卷扩展功能。

Q3: 如何访问 TiDB 集群的监控面板? ​

A3: 可以通过以下方式访问监控面板:

  • 使用 kubectl port-forward 命令进行端口转发
  • 将 Service 类型设置为 NodePort 或 LoadBalancer
  • 使用 Ingress 或 API Gateway 进行访问

Q4: 如何升级 TiDB 集群? ​

A4: 可以通过修改 TidbCluster 自定义资源的 spec.version 字段来升级 TiDB 集群。TiDB Operator 会自动执行滚动升级,确保升级过程中服务不中断。

Q5: 如何备份和恢复 TiDB 集群? ​

A5: 可以使用 TiDB Operator 提供的 TidbBackup 和 TidbRestore 自定义资源来管理备份和恢复。支持备份到 S3、GCS、Azure Blob Storage 等存储服务。

Q6: TiDB 集群的高可用性如何保证? ​

A6: TiDB 集群通过以下方式保证高可用性:

  • PD 集群采用 Raft 协议,确保元数据的高可用性
  • TiKV 集群采用 Raft 协议,确保数据的高可用性
  • TiDB 节点无状态,可以水平扩展,确保服务的高可用性
  • TiDB Operator 自动监控和恢复故障节点

Q7: 如何调整 TiDB 集群的配置? ​

A7: 可以通过修改 TidbCluster 自定义资源的配置字段来调整 TiDB 集群的配置。支持在线调整配置,无需重启集群。

Q8: 如何监控 TiDB 集群的性能? ​

A8: TiDB 集群部署时会自动部署 Prometheus 和 Grafana,可以通过 Grafana 查看集群的性能指标。同时,也可以将监控数据导出到外部监控系统,如 Prometheus、InfluxDB 等。