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 等。