重启 Kubernetes 上的 TiDB 集群
在使用 TiDB 集群的过程中,如果某个 Pod 存在内存泄漏等问题,可能需要重启集群。本文介绍如何优雅滚动重启 TiDB 集群中某个组件的所有 Pod,或单独优雅重启某个 Pod。
优雅滚动重启某个组件的所有 Pod
要优雅滚动重启某个组件(例如 PD、TiKV 或 TiDB)的所有 Pod,需要修改该组件对应的 Component Group Custom Resource (CR) 配置,在 .spec.template.metadata 部分添加 pingcap.com/restartedAt 的 label 或 annotation,并将其值设置为一个保证幂等性的字符串,例如当前时间。
以下示例展示如何为 PD 组件添加一个 annotation,从而触发对该 PDGroup 下所有 PD Pod 的优雅滚动重启:
apiVersion: core.pingcap.com/v1alpha1
kind: PDGroup
metadata:
name: pd
spec:
replicas: 3
template:
metadata:
annotations:
pingcap.com/restartedAt: 2025-06-30T12:00
优雅重启某个组件的单个 Pod
你可以单独重启 TiDB 集群中的特定 Pod。不同组件的 Pod,操作略有不同。
对于 TiKV Pod,为确保有足够时间驱逐 Region Leader,在删除 Pod 时需要指定 --grace-period 选项,否则操作可能失败。以下示例为 TiKV Pod 设置了 60 秒的宽限期:
kubectl -n ${namespace} delete pod ${pod_name} --grace-period=60
对于其他组件的 Pod,可以通过给 Pod 对应的实例 (Instance CR) 添加标签或注解的方式实现优雅重启。以 PD 为例:
根据 Pod 查询对应的 PD Instance CR:
kubectl get pod -n ${namespace} ${pod_name} -o jsonpath='{.metadata.labels.pingcap\.com/instance}'给该 PD 实例添加新标签以触发重启,例如:
kubectl label pd -n ${namespace} ${pd_instance_name} pingcap.com/restartedAt=2025-06-30T12:00如果该 PD 为 Leader,TiDB Operator 会先将 Leader 迁移到其他 PD,再重启该 Pod。