作者: lqbyz 原文来源:https://tidb.net/blog/7ecfecd2
通过 TiDB Operator 来部署管理 Kubernete 上的 TiDB 集群,可以通过滚动更新来升级 TiDB 集群的版本,来减少对业务的影响。本文介绍如何使用滚动更新来升级 Kubernetes 上的 TiDB 集群。
滚动更新功能介绍
Kubernetes 提供了滚动更新功能,在不影响应用可用性的前提下执行更新。
使用滚动更新时,TiDB Operator 会按 PD、TiFlash、TiKV、TiDB 的顺序,串行地删除旧版本的 Pod,并创建新版本的 Pod。当新版本的 Pod 正常运行后,再处理下一个 Pod。
滚动更新中,TiDB Operator 会自动处理 PD 和 TiKV 的 Leader 迁移。因此,在多节点的部署拓扑下(最小环境:PD * 3、TiKV * 3、TiDB * 2),滚动更新 TiKV、PD 不会影响业务正常运行。对于有连接重试功能的客户端,滚动更新 TiDB 同样不会影响业务。
注意事项
升级步骤
在 TidbCluster 中通过修改升级集群组件的镜像配置, 一般修改spec.version
即可,如果要为集群内不同组件设置不同的版本,修改 spec、<pd/tidb/tikv/pump/tiflash/ticdc>.version
。
[root@k8s-master tidb]# kubectl apply -f tidb.yaml
tidbcluster.pingcap.com/lqb configured
复制代码
查看升级进度
[root@k8s-master ~]# kubectl get pod -ntidb -w
NAME READY STATUS RESTARTS AGE
yz-discovery-68674b48b8-49vrl 1/1 Running 0 2d1h
yz-pd-0 1/1 Running 0 2d22h
yz-pd-1 1/1 Running 0 2d22h
yz-pd-2 1/1 Running 0 2m55s
yz-tidb-0 2/2 Running 0 2d4h
yz-tidb-1 2/2 Running 0 2d22h
yz-tidb-initializer-b8l8f 0/1 Completed 0 35d
yz-tiflash-0 4/4 Running 0 6d4h
yz-tikv-0 1/1 Running 0 2d4h
yz-tikv-1 1/1 Running 0 6d4h
yz-tikv-2 1/1 Running 2 3d
yz-tikv-3 1/1 Running 0 3d
yz-pd-1 1/1 Terminating 0 2d22h
yz-pd-2 1/1 Running 0 3m24s
yz-pd-1 0/1 Terminating 0 2d22h
yz-pd-1 0/1 Terminating 0 2d22h
yz-pd-1 0/1 Terminating 0 2d22h
yz-pd-1 0/1 Pending 0 0s
yz-pd-1 0/1 Pending 0 0s
yz-pd-1 0/1 ContainerCreating 0 0s
yz-pd-1 1/1 Running 0 1s
yz-pd-0 1/1 Terminating 0 2d22h
yz-pd-0 0/1 Terminating 0 2d22h
yz-pd-1 1/1 Running 0 21s
yz-pd-0 0/1 Terminating 0 2d22h
yz-pd-0 0/1 Terminating 0 2d22h
yz-pd-0 0/1 Pending 0 0s
yz-pd-0 0/1 Pending 0 0s
yz-pd-0 0/1 ContainerCreating 0 0s
yz-pd-0 0/1 ErrImagePull 0 20s
yz-pd-0 0/1 ImagePullBackOff 0 31s
复制代码
查看集群升级是否完成
当所有 Pod 都重建完毕进入 Running
且 TC 都是 True 表示升级完成。
[root@k8s-master tidb]# kubectl get tc -ntidb
NAME READY PD STORAGE READY DESIRE TIKV STORAGE READY DESIRE TIDB READY DESIRE AGE
lqb True pingcap/pd:v6.1.0 12Gi 3 3 pingcap/tikv:v6.1.0 12Gi 3 3 pingcap/tidb:v6.1.0 1 1 6d21h
yz True pingcap/pd:v6.5.0 12Gi 3 3 pingcap/tikv:v6.5.0 12Gi 4 4 pingcap/tidb:v6.5.0 2 2 6d5h
[root@k8s-master tidb]# kubectl get pod -ntidb
NAME READY STATUS RESTARTS AGE
tidbngmonitoring-yz-ng-monitoring-0 1/1 Running 1 4d13h
yz-discovery-68674b48b8-49vrl 1/1 Running 0 2d2h
yz-pd-0 1/1 Running 0 55m
yz-pd-1 1/1 Running 0 55m
yz-pd-2 1/1 Running 0 59m
yz-tidb-0 2/2 Running 0 35m
yz-tidb-1 2/2 Running 0 38m
yz-tidb-initializer-b8l8f 0/1 Completed 0 35d
yz-tikv-0 1/1 Running 0 39m
yz-tikv-1 1/1 Running 0 43m
yz-tikv-2 1/1 Running 0 44m
yz-tikv-3 1/1 Running 0 49m
复制代码
升级出现故障解决方法
如果因为 PD 配置错误、PD 镜像 tag 错误、NodeAffinity 等相关的原因,导致 PD 集群不可用,此时无法成功升级 TiDB 集群版本。这种情况下,可使用 force-upgrade
强制升级集群以恢复集群功能。
强制升级步骤如下:
为集群设置 annotation,并进行查看
[root@k8s-master tidb]# kubectl annotate --overwrite tc yz -n tidb tidb.pingcap.com/force-upgrade=true
tidbcluster.pingcap.com/yz annotated
复制代码
修改 PD 相关配置,确保 PD 进入正常状态。
修复 PD 配置后,删除刚才强制升级功能,否则下次升级过程可能会出现异常:
[root@k8s-master tidb]# kubectl annotate tc yz -n tidb tidb.pingcap.com/force-upgrade-
tidbcluster.pingcap.com/yz annotated
复制代码
完成上述步骤后,TiDB 集群功能将恢复正常,可以正常进行升级。
评论