概要描述
星环科技TOS组件中的节点通信由证书控制, 其中一个控制服务端通信的证书会在2023-03-10日过期。
证书过期后将可能会影响集群的正常使用。
受影响的版本
如下版本将会受到影响:
- TDH:
- 受影响的TOS版本:1.9.x ≤ TOS版本 ≤ 2.1.x
- TDH 5.x 之后的版本,请检查是否受到影响
- TDC:
- 受影响的TOS版本:1.9.x ≤ TOS版本 ≤ 2.0.x
- TDC 2.4 之前的所有版本(TDC版本 < 2.4)
TOS 版本 < 1.9 时,不受影响
为了保证集群的健康运行,请在证书过期前更新证书。
您可以通过纯手工方式更新证书,或通过脚本方式 (需要安装sshpass工具) 更便捷的更新证书。
本文主要介绍通过脚本方式续签证书,若您的环境不方便使用脚本的方式,您可以参考 TOS etcd-ca 及相关证书续签 使用纯手工方式更新证书。
详细说明
本文测试环境概述如下,后续提到的命令中包含了集群的 hostname、IP 信息的时候,请根据您环境的实际情况进行相应的替换。
//TDH环境
172.22.17.71 ddmidv111
172.22.17.72 ddmidv222
172.22.17.73 ddmidv333
详细操作步骤如下:
一、操作前环境检查与信息确认
-
检查TOS版本信息
使用命令kubectl version
查看TOS版本信息,确认当前版本是否受到影响(若当前TOS版本不受影响,则无需进行续签证书操作):# kubectl version
如下截图,本文测试环境TDH所包含的TOS版本为2.1.0,为受影响版本:
-
检查您的集群环境内etcd-ca证书过期时间:
可以SSH进入到集群任意节点/srv/kubernetes/
目录下,使用openssl x509 -text -in etcd-ca.pem | grep "Not"
命令查看证书过期时间:# cd /srv/kubernetes/ # openssl x509 -text -in etcd-ca.pem | grep "Not" Not Before: Mar 11 10:30:00 2018 GMT Not After : Mar 10 10:30:00 2023 GMT
当发现Not After为2023年时,则您的集群需要更新证书。
- 检查集群etcd状态,查找TOS Master节点(包含hostname, IP信息)
使用命令kubectl -n kube-system get pod -owide | grep etcd
查看etcd 的pod状态是否为1/1 running# kubectl -n kube-system get pod -owide | grep etcd tos-etcd-tos-ddmidv111 1/1 Running 10 283d 172.22.17.71 ddmidv111
tos-etcd-tos-ddmidv222 1/1 Running 15 124d 172.22.17.72 ddmidv222 tos-etcd-tos-ddmidv333 1/1 Running 11 283d 172.22.17.73 ddmidv333 所列三个节点为TOS Master节点。
- 检查etcd服务状态(若状态不正常则请联系 星环科技售后技术支持)
使用命令ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://hostname1:4001,https://hostname2:4001,https://hostname3:4001 endpoint status
查看etcd服务状态:# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://ddmidv111:4001,https://ddmidv222:4001,https://ddmidv333:4001 endpoint status 2023-01-12 19:29:33.107430 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated https://jiujiu-tdh-10:4001, 58b07431c59f5a61, 3.1.18, 15 MB, false, 386, 14180208 https://jiujiu-tdh-11:4001, ca5c6c5dcde5192e, 3.1.18, 15 MB, true, 386, 14180208 https://jiujiu-tdh-12:4001, e6f4c353dbabdd8d, 3.1.18, 15 MB, false, 386, 14180208
(需要将命令中的hostname注意要换成自己集群etcd所在节点的hostname)
对TDC环境,需要使用2379端口,例如执行:
# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://tos155:2379,https://tos156:2379,https://tos157:2379 endpoint status
- 检查etcd的健康状态
将步骤4中参数 endpoint status 更改为 endpoint health,运行,查看健康状态:# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://ddmidv111:4001,https://ddmidv222:4001,https://ddmidv333:4001 endpoint health
对于tdc环境,需要将端口更改为2379:
etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://tos155:2379,https://tos156:2379,https://tos157:2379 endpoint health
若环境检查遇到问题,请联系 星环科技售后技术支持) 先修复etcd集群,避免证书更新遇到问题,以及etcd选主失败。
二、准备脚本运行环境
-
下载脚本:
(1) 证书脚本- x86环境:点击下载 etcdca.tar.gz
MD5:779960fc199efea7f549e9fc9af59b6f - ARM环境:点击下载 etcdca-arm64.tar.gz
MD5: 8c4c0d0dc42dee1e9db6038013c5db90
(2)更新manager数据库脚本:
点击下载 更新manager数据库脚本
- x86环境:点击下载 etcdca.tar.gz
-
上传脚本至集群的第一个TOS Master节点
务必将脚本上传到集群的第一个 Master 节点(一.3中列出的第一个节点),放在任意空目录中,后续续签及生成证书的操作默认都在第一台 MASTER 节点。 -
解压缩脚本包
SSH进入第一个Master节点上存放脚本包的目录,解压脚本包tar -xzvf etcdca.tar.gz
-
确认该Master节点上已经安装了sshpass工具,若没有安装,请安装
# 为了在每个节点上执行该证书的备份与更新,需要通过密码传参 ssh 到其他节点,使用到 sshpass 工具,因此要确保当前执行该脚本的节点有 sshpass 命令 # sshpass的rpm包见:ftp://tosftp.transwarp.io/pub/tosftp/rpmrepo/x86_64/centos76/sshpass-1.06-2.el7.x86_64.rpm # 因此如果想要安装sshpass命令,首先需要获得所需rpm包: wget ftp://tosftp.transwarp.io/pub/tosftp/rpmrepo/x86_64/centos76/sshpass-1.06-2.el7.x86_64.rpm # 再将rpm包上传到执行命令的节点(即目标集群第一个master节点)上,然后进行安装: rpm -ivh sshpass-1.06-2.el7.x86_64.rpm # 安装后检查通过,即可重新执行precheck.sh command -v sshpass
或者本地有yum源,可以直接yum安装即可
yum install sshpass -y
若无法安装 sshpass,则无法使用脚本方式更新证书,您可以参考 TOS etcd-ca 及相关证书续签 使用纯手工方式更新证书。
-
填写集群节点信息
将集群的MASTER节点信息填写入 hosts.txt 文件中( 一般为3个,一.3中列出的信息,请务必只填写MASTER节点!! )
host.txt 文件里面为集群的三个 MASTER 节点 hostname、IP 及 root 密码,需要将内容更改为安装集群的节点hostname、ip 和密码,中间以空格隔开,例如:[root@ddmidv111 etcdca]# cat hosts.txt ddmidv111 172.22.17.71 123456 ddmidv222 172.22.17.72 123456 ddmidv333 172.22.17.73 123456
-
环境预检与证书备份
运行precheck.sh
脚本,做初始检查,检查通过后,即可开始更新证书:chmod 777 precheck.sh #赋权 ./precheck.sh #开始检查
正常执行结果如下图:
注意!请务必等待备份完成再进行下一步操作.
三、使用脚本更新证书
-
运行
gencerts.sh
,生成新证书:chmod 777 gencerts.sh #赋权 ./gencerts.sh #开始生成证书
-
拷贝与分发生成的证书
chmod 777 copy.sh #赋权 ./copy.sh #证书拷贝和分发
-
重启etcd服务
从第1个TOS Master节点开始,在3台 TOS Master 节点上依次操作mv /opt/kubernetes/manifests-multi/tos-etcd.manifest /opt/kubernetes/
间隔1 分钟,执行:
mv /opt/kubernetes/tos-etcd.manifest /opt/kubernetes/manifests-multi/
完成后,再依次操作另外2台TOS Master节点。
执行完成之后再去重复确认一下etcd状态检查的步骤(步骤一.4,5)
- 重启api服务
3台master 节点依次操作mv /opt/kubernetes/manifests-multi/tos-apiserver.manifest /opt/kubernetes/
间隔1分钟, 执行
mv /opt/kubernetes/tos-apiserver.manifest /opt/kubernetes/manifests-multi/
确认是否正常启动
kubectl get pods -n kube-system -owide | grep apiserver
四、TDC的额外特定操作
重启 Prometheus operator
kubectl delete secret -n monitor kube-etcd-certs
kubectl create secret -n monitor generic kube-etcd-certs --from-file=/srv/kubernetes/etcd-ca.pem --from-file=/srv/kubernetes/etcd.pem --from-file=etcd-key.pem
kubectl delete po -n monitor prometheus-prometheus-operator-prometheus-0 prometheus-prometheus-operator-prometheus-1
kubectl get po -n monitor | grep prometheus-operator-prometheus ## 确保pod 正常 running
五、TDH环境的额外特定操作(flannel,未安装flannel可跳过)
若安装了flannel服务,需要将其复制到flannel的所有安装节点上
- 获取flannel所在节点,如下显示flannel节点为jiujiu-tdh-10, jiujiu-tdh-11, jiujiu-tdh-12,若与etcd/tos master节点重合, 则不需要做额外的复制操作
[root@jiujiu-tdh-10 ~]# kubectl get po -owide -n kube-system |grep flannel flanneld-flannel-kg54q 1/1 Running 1 94d 172.22.25.11 jiujiu-tdh-11 flanneld-flannel-xcsq5 1/1 Running 0 3d 172.22.25.12 jiujiu-tdh-12 flanneld-flannel-z5rv7 1/1 Running 2 152d 172.22.25.10 jiujiu-tdh-10 kube-dns-flannel-768v7 1/1 Running 0 3d 172.22.25.12 jiujiu-tdh-12 kube-dns-flannel-c6888 1/1 Running 3 94d 172.22.25.11 jiujiu-tdh-11 kube-dns-flannel-nxdxv 1/1 Running 2 152d 172.22.25.10 jiujiu-tdh-10
2.若flannel所在节点为非etcd/tos master节点, 则需要将更新了的证书复制到这些非etcd/tos master节点
# scp /srv/kubernetes/etcd* root@《非etcd节点的ip》:/srv/kubernetes/
3.重启flannel服务
kubectl delete po $(kubectl get po -owide -n kube-system |grep flannel|awk '{print $1}') -n kube-system
六、TDH环境的额外特定操作(manager)
TDH环境下,需要更新metainfo目录下的证书和manager数据库
manager-6.0.1811a之后的版本会存储tos证书到数据库中分发到各个节点,同时生成其他证书相关的逻辑会使用metainfo中的etcd-ca.pem,所以需要更新相关文件和数据库数据,防止后续角色重启变更分发证书导致证书再次失效
(1). 更新metainfo目录下证书
- 找到当前tos版本的对应的metainfo目录
在任意节点使用root 执行 :kubectl describe po $(kubectl get pods -n kube-system |grep registry|awk '{print $1}') -n kube-system |grep -i image:
可获取tag
例1:[root@jiujiu-tdh-12 ~]# kubectl describe po $(kubectl get pods -n kube-system |grep registry|awk '{print $1}') -n kube-system |grep -i image: Image: transwarp/registry:manager-7.0.1910a-final Image: transwarp/registryui:manager-7.0.1910a-final
对应的在manager 节点的tos 目录应该是
/var/lib/transwarp-manager/master/content/meta/services/TOS/manager-7.0.1910a-final/templates/gencerts/
例2:
[root@argodb1~]$ kubectl describe po $(kubectl get pods -n kube-system |grep registry|awk '{print $1}') -n kube-system |grep -i image:
Image: transwarp/registry:tos-2.1
对应的在manager 节点的tos 目录应该是 /var/lib/transwarp-manager/master/content/meta/services/TOS/tos-2.1/templates/gencerts/
注意!manager节点不一定是tos master/etcd 节点,请根据实际情况从已经更新过证书的节点拷贝到manager节点
-
将上面新生成的etcd-ca.pem证书替换到对应的/var/lib/transwarp-manager/master/connent/meta/services/TOS/tos版本/templates/gencerts/目录下(etcd.pem和etcd-key.pem会在manager分发证书的时候重新执行生成命令)
[root@jiujiu-tdh-10 ~]# cd /srv/kubernetes ## manager-7.0.1910a-final为 上一步骤获取的版本 [root@jiujiu-tdh-10 gencerts]# cp etcd-ca.pem /var/lib/transwarp-manager/master/content/meta/services/TOS/manager-7.0.1910a-final/templates/gencerts/
-
将/var/lib/transwarp-manager/master/connent/meta/services/TOS/tos版本/templates/gencerts/目录下的config.json文件中的expiry 的87600h改为 876000h
(2).更新manager数据库的证书数据(脚本和手动的方式二选一)
脚本操作: 使用 上面下载的更新manager数据库的脚本更新
- 将update_manager_info.sh 脚本放到manager节点上
- 赋权并执行脚本
chmod +x update_manager_info.sh ./update_manager_info.sh
手动操作:
-
备份原表,根据各个版本查看Manager后台数据库的方法进入Manager数据库
create table manager_info_bak2023 like manager_info; insert into manager_info_bak2023 select * from manager_info;
-
更新证书数据:
2.1.在manager节点执行下面命令获取刚刚更新的证书内容cat /srv/kubernetes/etcd-ca.pem cat /srv/kubernetes/etcd-key.pem cat /srv/kubernetes/etcd.pem
2.2.根据 manager数据库进入方法 进入manager数据库,执行下面sql
证书内容为上一步获取的update manager_info set
value
="etcd-ca.pem证书内容" wherekey
="etcd-ca.pem"; update manager_info setvalue
="etcd.pem证书内容" wherekey
="etcd.pem"; update manager_info setvalue
="etcd-key.pem证书内容" wherekey
="etcd-key.pem";注意!证书内容要全部复制到, 后面不要有多余的回车
例如:
七、确认证书替换成功,过期时间已经如期延长
更新过的证书验证方法
openssl x509 -text -in /srv/kubernetes/etcd-ca.pem | grep "Not"
openssl x509 -text -in /srv/kubernetes/etcd.pem | grep "Not"
## tos版本在步骤5.1获取
openssl x509 -text -in /var/lib/transwarp-manager/master/content/meta/services/TOS/tos版本/templates/gencerts/etcd-ca.pem | grep "Not"
若有任何疑问, 请及时联系 星环科技售后技术支持)