TOS etcd-ca 相关证书脚本化续签

  其他常见问题
内容纲要

概要描述


星环科技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

详细操作步骤如下:

一、操作前环境检查与信息确认

  1. 检查TOS版本信息
    使用命令 kubectl version 查看TOS版本信息,确认当前版本是否受到影响(若当前TOS版本不受影响,则无需进行续签证书操作):

    # kubectl version

    如下截图,本文测试环境TDH所包含的TOS版本为2.1.0,为受影响版本:
    file

  2. 检查您的集群环境内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年时,则您的集群需要更新证书。

file

  1. 检查集群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节点。

file

  1. 检查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
  1. 检查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 

    file

对于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. 下载脚本:
    (1) 证书脚本

  2. 上传脚本至集群的第一个TOS Master节点
    务必将脚本上传到集群的第一个 Master 节点(一.3中列出的第一个节点),放在任意空目录中,后续续签及生成证书的操作默认都在第一台 MASTER 节点。

  3. 解压缩脚本包
    SSH进入第一个Master节点上存放脚本包的目录,解压脚本包

    tar -xzvf etcdca.tar.gz

    file

  4. 确认该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 及相关证书续签 使用纯手工方式更新证书。

  5. 填写集群节点信息
    将集群的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

    file

  6. 环境预检与证书备份
    运行 precheck.sh 脚本,做初始检查,检查通过后,即可开始更新证书:

    chmod 777 precheck.sh #赋权
    ./precheck.sh #开始检查

    正常执行结果如下图:
    file

注意!请务必等待备份完成再进行下一步操作.

三、使用脚本更新证书

  1. 运行 gencerts.sh,生成新证书:

    chmod 777 gencerts.sh #赋权
    ./gencerts.sh #开始生成证书

    file

  2. 拷贝与分发生成的证书

    chmod 777 copy.sh #赋权
    ./copy.sh #证书拷贝和分发

    file

  3. 重启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)
file

  1. 重启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

    file

四、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的所有安装节点上

  1. 获取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目录下证书

  1. 找到当前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节点

  1. 将上面新生成的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/
  2. 将/var/lib/transwarp-manager/master/connent/meta/services/TOS/tos版本/templates/gencerts/目录下的config.json文件中的expiry 的87600h改为 876000h
    file

(2).更新manager数据库的证书数据(脚本和手动的方式二选一)

脚本操作: 使用 上面下载的更新manager数据库的脚本更新

  1. 将update_manager_info.sh 脚本放到manager节点上
  2. 赋权并执行脚本
    chmod +x update_manager_info.sh
    ./update_manager_info.sh

手动操作

  1. 备份原表,根据各个版本查看Manager后台数据库的方法进入Manager数据库

    create table  manager_info_bak2023 like  manager_info;
    insert into manager_info_bak2023 select * from manager_info;

    file

  2. 更新证书数据
    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证书内容" where key="etcd-ca.pem";
    update manager_info set value="etcd.pem证书内容" where key="etcd.pem";
    update manager_info set value="etcd-key.pem证书内容" where key="etcd-key.pem";

    注意!证书内容要全部复制到, 后面不要有多余的回车

例如:

file

file

七、确认证书替换成功,过期时间已经如期延长

更新过的证书验证方法

 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"

file


若有任何疑问, 请及时联系 星环科技售后技术支持

这篇文章对您有帮助吗?

平均评分 5 / 5. 次数: 1

尚无评价,您可以第一个评哦!

非常抱歉,这篇文章对您没有帮助.

烦请您告诉我们您的建议与意见,以便我们改进,谢谢您。