1.2.3.2.5 维护 TiDB 集群所在的 Kubernetes 节点

1. TiDB 与 PD 所在服务器异常下线

由于节点维护需要至少 4 台服务器才能操作完成,本节基于 kind 模拟 5 个节点,讲解第 5 个 node 服务器故障时的维护方法。

PD 和 TiDB 实例的迁移较快,可以采取主动驱逐实例到其它节点上的策略进行节点维护:

  1. # kubectl get pod --all-namespaces -o wide | grep worker5|grep dba-test
  2. dba-test test-pd-2 1/1 Running 0 5m18s 10.244.5.4 kind-worker5 <none> <none>

以上显示 kind-worker5 节点运行了一个 PD 实例,使用 kubectl cordon 命令防止新的 Pod 调度到待维护节点上:

  1. # kubectl cordon kind-worker5
  2. node/kind-worker5 cordoned

使用 kubectl drain 命令将待维护节点上的数据库实例迁移到其它节点上:

  1. # kubectl drain kind-worker5 --ignore-daemonsets --delete-local-data
  2. node/kind-worker5 already cordoned
  3. WARNING: ...
  4. pod/test-pd-2 evicted

等待一会儿,检查 kind-worker5 节点上的 Pod:

  1. # kubectl get pods -n dba-test|grep kind-worker5

无输出,表明 kind-worker5 节点上的 Pod 已全部迁移走出去。再观察 TiDB 集群的 Pod 状态:

  1. # kubectl get pods -n dba-test
  2. NAME READY STATUS RESTARTS AGE
  3. test-discovery-854fb5b46c-c8lng 1/1 Running 0 21m
  4. test-monitor-59468bcd58-btbpc 3/3 Running 0 10m
  5. test-pd-0 1/1 Running 2 21m
  6. test-pd-1 1/1 Running 0 21m
  7. test-pd-2 1/1 Running 0 4m50s
  8. test-tidb-0 2/2 Running 0 19m
  9. test-tidb-1 2/2 Running 0 19m
  10. test-tikv-0 1/1 Running 0 20m
  11. test-tikv-1 1/1 Running 0 20m
  12. test-tikv-2 1/1 Running 0 20m

集群所有 Pod 已在正常运行,集群已恢复正常。

此时,分两种情况:

  1. 短期维护(对节点无破坏性);
  2. 长期维护,服务器需要长时间修复,甚至需要重装系统。

短期维护场景下,维护完毕后,将节点解除调度限制即可:

  1. # kubectl uncordon kind-worker5

长期维护场景下,将节点下线,修复之后,再由 K8s 运维专家将服务器上线到 K8s 集群:

  1. # kubectl delete node kind-worker5
  2. node "kind-worker5" deleted

2. TiKV 所在服务器异常下线

本节讲解 TiKV node 需要下线维护的场景。

注意: 至少要确保有 4 个 TiKV 实例正常运行才能操作成功(默认副本数为3)。

使用 kubectl cordon 命令防止新的 Pod 调度到待维护节点上:

  1. # kubectl cordon kind-worker4
  2. node/kind-worker4 cordoned

查看待维护节点上的 TiKV 实例:

  1. # kubectl get pods -n dba-test -owide|grep tikv|grep kind-worker4
  2. test-tikv-2 1/1 Running 0 5m28s 10.244.1.7 kind-worker4 <none> <none>

查看 TiKV 实例的 store-id

  1. # kubectl get tc test -ojson -n dba-test| jq '.status.tikv.stores | .[] | select ( .podName == "test-tikv-2" ) | .id'
  2. "115"

开启 PD 访问:

  1. # nohup kubectl port-forward svc/test-pd 2379:2379 -n dba-test &
  2. [1] 8968

使用 pd-ctl 下线 TiKV 实例:

  1. # pd-ctl -d store delete 115
  2. Success!

等待 TiKV store 状态(state_name)转化为 Tombstone

  1. # pd-ctl -d store 115|grep state_name
  2. "state_name": "Tombstone"

接下来,还需要解除 TiKV 实例与节点本地盘的绑定:

查询 Pod 使用的 PVC:

  1. # kubectl get -n dba-test pod test-tikv-2 -ojson | jq '.spec.volumes | .[] | select (.name == "tikv") | .persistentVolumeClaim.claimName'
  2. "tikv-test-tikv-2"

删除该 PVC:

  1. # kubectl delete pvc/tikv-test-tikv-2 -n dba-test
  2. persistentvolumeclaim "tikv-test-tikv-2" deleted

删除 TiKV 实例:

  1. # kubectl delete pod/test-tikv-2 -n dba-test
  2. pod "test-tikv-2" deleted

观察该 TiKV 实例是否正常调度到其它节点上:

  1. # kubectl get pods -n dba-test -owide|grep tikv
  2. test-tikv-0 1/1 Running 0 29m 10.244.2.6 kind-worker2 <none> <none>
  3. test-tikv-1 1/1 Running 0 29m 10.244.4.6 kind-worker3 <none> <none>
  4. test-tikv-2 1/1 Running 0 34s 10.244.3.6 kind-worker <none> <none>
  5. test-tikv-3 1/1 Running 0 25m 10.244.3.5 kind-worker <none> <none>

此时, test-tikv-2 已经从 kind-worker4 迁移到 kind-worker了。

此时,分两种情况:

  1. 短期维护(对节点无破坏性);
  2. 长期维护,服务器需要长时间修复,甚至需要重装系统。

短期维护场景,维护完毕后,将节点解除调度限制即可:

  1. # kubectl uncordon kind-worker4

长期维护场景,将节点下线,修复之后,再由 K8s 运维专家将服务器上线到 K8s 集群:

  1. # kubectl delete node kind-worker4
  2. node "kind-worker4" deleted