TiDB Operator 升级
作者:lqbyz
在使用TiDB Operator部署管理 Kubernetes 上的 TiDB 集群时,有时需要对Operator进行升级,从而达到更稳定的管理tidb集群的功能和扩展一些新功能。一般在升级TiDB Operator的时候有常规升级和灰度升级。如果希望升级TiDB Operator至新版本,同时控制升级的影响范围,避免对整个 Kubernetes 集群中的所有 TiDB 集群产生不可预知的影响,可以采用灰度升级的方式升级 TiDB Operator。使用灰度升级后,你可以在灰度部署的集群中确认 TiDB Operator 升级的影响,在确认 TiDB Operator 新版本稳定工作后,再常规升级TiDB Operator。
常规升级
常规升级指升级TiDB Operator到指定的版本,一般常用的方式有在线升级(可以连外网)和离线升级(不能连外网)。
在线升级
查看升级的TiDB Operator版本
helm search repo -l tidb-operator
如果输出中未包含你需要的版本则可以执行如下添加helm chart仓库,然后升级
1、添加chart仓库
helm repo add pingcap https://charts.pingcap.org/
2、更新chart仓库
helm repo update
3、搜索提供的chart仓库
helm search repo pingcap
更新 Kubernetes 的 CustomResourceDefinition (CRD)
如果Kubernetes版本大于等于1.16
- 如果 TiDB Operator 从 v1.3.x 升级到 v1.4.0 及以后版本,需要先执行下面命令创建新增加的 TidbDashboard CRD。如果是 v1.4.0 及以后版本的 TiDB Operator 升级,可跳过这一步
kubectl create -f https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd/v1/pingcap.com_tidbdashboards.yaml
- 更新CRD
kubectl replace -f https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd.yaml && \
kubectl get crd tidbclusters.pingcap.com
如果Kubernetes版本小于1.16
- 如果 TiDB Operator 从 v1.3.x 升级到 v1.4.0 及以后版本,需要先执行下面命令创建新增加的 TidbDashboard CRD。如果是 v1.4.0 及以后版本的 TiDB Operator 升级,可跳过这一步。
kubectl create -f https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd/v1beta1/pingcap.com_tidbdashboards.yaml
- 更新 CRD
kubectl replace -f https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd_v1beta1.yaml && \
kubectl get crd tidbclusters.pingcap.com
创建升级的values-tidb-operator.yaml文件
mkdir -p ${HOME}/tidb-operator/v1.4.0 && \
helm inspect values pingcap/tidb-operator --version=v1.4.0 > ${HOME}/tidb-operator/v1.4.0/values-tidb-operator.yaml
旧版本 values.yaml
中设置了自定义配置,将自定义配置合并到 ${HOME}/tidb-operator/v1.4.0/values-tidb-operator.yaml
中。
执行升级
helm upgrade tidb-operator pingcap/tidb-operator --version=v1.4.0 -f ${HOME}/tidb-operator/v1.4.0/values-tidb-operator.yaml -ntidb-admin
如果不加namespaces的话会出现如下报错:Error: UPGRADE FAILED: "tidb-operator" has no deployed releases"
解决步骤如下:加上命名空间tidb-admin,如果不清楚命名空间可以通过如下进行查询。
[root@k8s-master ~]# helm list -A
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
6 tidb 1 2022-12-02 14:48:48.917604258 +0800 CST failed tidb-lightning-v1.3.9
6.1.0 tidb 1 2022-12-02 12:25:10.149345501 +0800 CST failed tidb-lightning-v1.3.9
chaos-mesh chaos-testing 2 2022-06-09 16:51:49.542186958 +0800 CST deployed chaos-mesh-2.1.4 2.1.4
lightning tidb 1 2022-12-02 14:49:21.495945953 +0800 CST deployed tidb-lightning-v1.3.9
tidb-operator tidb-admin 10 2023-01-10 13:50:24.288162887 +0800 CST deployed tidb-operator-v1.4.0 v1.4.0
v1.3 tidb 1 2022-12-02 12:26:32.639264502 +0800 CST failed tidb-lightning-v1.3.9
v6.1.0 tidb 1 2022-12-02 12:24:46.04948406 +0800 CST failed tidb-lightning-v1.3.9
v6.1.0-20221130 tidb 1 2022-12-02 12:32:32.747777196 +0800 CST failed tidb-lightning-v1.3.9
升级后加上命名空间就可以解决了
pod全部正常启动后,查看确认TiDB Operator镜像版本
kubectl get po -n tidb-admin -l app.kubernetes.io/instance=tidb-operator -o yaml | grep 'image:.*operator:'
如果输出类似下方的结果,则表示升级成功。其中,v1.4.0
表示已升级到的版本号。
TiDB Operator 升级之后,所有 TiDB 集群中的 discovery
Deployment 都会自动升级到对应的 TiDB Operator 版本。
离线升级
下载升级所需的文件和镜像
下载所需的CRD.yaml文件
- 如果Kubernetes版本大于1.16
wget -O crd.yaml https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd.yaml
- 如果Kubernetes版本小于1.16
wget -O crd.yaml https://raw.githubusercontent.com/pingcap/tidb-operator/${operator_version}/manifests/crd_v1beta1.yaml
下载tidb-operator chart包文件
wget http://charts.pingcap.org/tidb-operator-v1.4.0.tgz
下载所需的镜像文件
docker pull pingcap/tidb-operator:v1.4.0
docker pull pingcap/tidb-backup-manager:v1.4.0
docker save -o tidb-operator-v1.4.0.tar pingcap/tidb-operator:v1.4.0
docker save -o tidb-backup-manager-v1.4.0.tar pingcap/tidb-backup-manager:v1.4.0
将下载文件和镜像上传到私有仓库和升级的operator服务器上,依次执行
1、升级 TiDB Operator 需要的 crd.yaml 文件:
kubectl replace -f ./crd.yaml
2、解压 tidb-operator chart 包文件,并拷贝 values.yaml 文件到升级目录:
tar zxvf tidb-operator-v1.4.0.tgz && \
mkdir -p ${HOME}/tidb-operator/v1.4.0 && \
cp tidb-operator/values.yaml ${HOME}/tidb-operator/v1.4.0/values-tidb-operator.yaml
修改values.yaml中operatorImage镜像版本为升级的版本
执行升级命令
helm upgrade tidb-operator ./tidb-operator --version=v1.4.0 -f ${HOME}/tidb-operator/v1.4.0/values.yaml -n tidb-admin
pod全部启动后,运行如下命令确认TiDB Operator镜像版本
kubectl get po -n tidb-admin -l app.kubernetes.io/instance=tidb-operator -o yaml | grep 'image:.*operator:'
灰度升级
TiDB Operator 目前只支持对部分组件进行灰度升级,即 tidb-controller-manager 和 tidb-scheduler,不支持对增强型 StatefulSet 控制器和准入控制器进行灰度升级。
在使用 TiDB Operator 时,tidb-scheduler
并不是必须使用。你可以参考 tidb-scheduler 与 default-scheduler,确认是否需要部署 tidb-scheduler
。
为当前TiDB Operator配置selector并进行升级
在当前的tidb operator的values-tidb-operator.yaml中添加如下selector配置
controllerManager:
selector:
- version!=canary
对当前tidb operator执行升级步骤
helm upgrade tidb-operator pingcap/tidb-operator --version=${chart_version} -f ${HOME}/tidb-operator/values-tidb-operator.yaml -ntidb-admin
部署灰度的TiDB Operator
在values-tidb-operator.yaml中添加appendReleaseSuffix
需要设置为 true
。
在不同的namespaces中部署灰度的tidb operator
helm install tidb-operator-canary pingcap/tidb-operator --namespace=tidb-admin-canary --version=${operator_version} -f ${HOME}/tidb-operator/${operator_version}/values-tidb-operator.yaml
将 ${operator_version}
替换为你需要灰度升级到的 TiDB Operator 版本号。
正常升级tidb operator
确认灰度部署的 TiDB Operator 已经正常工作后,可以正常升级 TiDB Operator。
删除灰度部署的TiDB Operator
helm -n tidb-admin-canary uninstall ${release_name}
正常升级TiDB Operator,采用常规升级即可