TOS etcd-ca 及相关证书续签

  其他常见问题
内容纲要

概要描述


星环科技TOS组件中的节点通信由证书控制, 其中一个控制服务端通信的证书会在2023-03-10日过期。
证书过期后将可能会影响集群的正常使用。

详细说明

续签主要有以下几个步骤:

  1. 确认证书是否需要续签
  2. 下载证书包
  3. 备份原证书
  4. 续签证书
  5. 复制证书至所有 etcd 节点以及 其他 节点
  6. 重启 etcd、apiserver 服务生效
  7. 修改 tos 模板文件,确保 Manager 可以将证书分发到其他所有节点
  8. 更新 Manager 数据库中的历史证书数据

证书续签过程有任何问题,都可以通过恢复第3步备份的原证书,然后从第4步重新开始,不会对集群有破坏性影响。


1、确认受影响的版本

如下版本将会受到影响:

  • 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)

为了保证集群的健康运行,请在证书过期前(2023-03-10)更新证书。

您可以进入到集群 Manager /srv/kubernetes/ 目录下,使用下面两个命令查看过期时间:

# openssl x509 -text -in /srv/kubernetes/etcd-ca.pem | grep "Not"
            Not Before: Mar 11 10:30:00 2018 GMT
            Not After : Mar 10 10:30:00 2023 GMT

# kubectl version
Client Version: version.Info{Major:"2", Minor:"1+", GitVersion:"v2.1.0-tos-final-build-20220805-tdh", GitCommit:"c413e8244dbf13e8726be0751fdc3f870d7888cd", GitTreeState:"clean", BuildDate:"2022-08-05T13:37:59Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"2", Minor:"1+", GitVersion:"v2.1.0-tos-final-build-20220805-tdh", GitCommit:"c413e8244dbf13e8726be0751fdc3f870d7888cd", GitTreeState:"clean", BuildDate:"2022-08-05T13:37:59Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}

本文主要介绍通过纯手工方式续签证书

若您的环境可以使用脚本的方式,您可以参考 TOS etcd-ca 及相关证书脚本化续签 使用脚本方式更新证书。

本文测试使用节点:

172.22.25.10 jiujiu-tdh-10
172.22.25.11 jiujiu-tdh-11
172.22.25.12 jiujiu-tdh-12

2、下载证书包及manager数据库更新脚本

默认环境部署完成 etcd-ca.key会不存在,需要从安装包拷贝或者从本文下载

X86 环境证书包下载:
点击下载gencerts目录文件

arm-64环境证书包下载:
点击下载arm64 环境gencerts目录

manager数据库更新脚本下载:
点击下载 更新manager数据库脚本

将下载的 gencerts 上传到第一台 tos master/etcd 节点上,然后直接解压即可(tar -zxvf gencerts.tar.gz)。

将下载的update_manager_info.sh(数据库更新脚本) 放到manager节点

后续续签及生成证书的操作默认都在第一台 tos master/etcd 节点。

3、备份节点上原有证书目录

所有 tos-master 节点执行

# cp -r /srv/kubernetes /srv/kubernetes-bak

4、续签证书

4.1 依赖于原 etcd-ca.pem 和 etcd-ca-key.pem 生成 etcd-ca-new.pem
[root@jiujiu-tdh-11 ~]# cd gencerts
[root@jiujiu-tdh-11 gencerts]# openssl x509 -in etcd-ca.pem -days 36500 -out etcd-ca-new.pem -signkey etcd-ca-key.pem 

Getting Private key
4.2 查看新 etcd-ca 证书过期时间
[root@jiujiu-tdh-11 gencerts]# openssl x509 -text -in etcd-ca-new.pem | grep "Not"
            Not Before: Jan 10 10:01:32 2023 GMT
            Not After : Dec 17 10:01:32 2122 GMT
4.3 使用任一个依赖于 etcd-ca.pem 生成的证书进行证书比对,这边使用的是 etcd.pem
[root@jiujiu-tdh-11 gencerts]# openssl verify -CAfile etcd-ca-new.pem /srv/kubernetes/etcd.pem
/srv/kubernetes/etcd.pem: OK

到此 etcd-ca.pem 证书续期完毕

4.4 获取etcd节点和scv的ip

以下etcd节点ip为172.22.25.10,172.22.25.11,172.22.25.12,
hostname为jiujiu-tdh-10,jiujiu-tdh-11,jiujiu-tdh-12

对于已经过期的集群的节点获取方式:
[root@jiujiu-tdh-10 ~]# openssl x509 -in /srv/kubernetes/etcd.pem -noout -text |grep -i dns
                DNS:jiujiu-tdh-10, DNS:jiujiu-tdh-11, DNS:jiujiu-tdh-12, IP Address:127.0.0.1, IP Address:10.10.10.1, IP Address:172.22.25.10, IP Address:172.22.25.11, IP Address:172.22.25.12
[root@jiujiu-tdh-10 ~]# kubectl get po -owide -n kube-system |grep etcd
tos-etcd-tos-jiujiu-tdh-10         1/1       Running   0          1d        172.22.25.10   jiujiu-tdh-10
tos-etcd-tos-jiujiu-tdh-11         1/1       Running   0          1d        172.22.25.11   jiujiu-tdh-11
tos-etcd-tos-jiujiu-tdh-12         1/1       Running   0          1d        172.22.25.12   jiujiu-tdh-12

以下 svc的ip为10.10.10.1

[root@jiujiu-tdh-10 ~]# kubectl get svc
NAME                                          TYPE
kubernetes                                    ClusterIP   10.10.10.1             443/TCP     1y
4.5 重新生成 etcd 相关证书:etcd.csr、etcd-key.pem、etcd.pem

需要将命令中-hostname后面hostname和ip改成当前操作集群的etcd节点的(获取方法如4.4,hostname以命令获取的为准),并且加上svc的ip和127.0.0.1

127.0.0.1为必写固定的,10.10.10.1为上面步骤2.1获取的svc的ip,cfssl和cfssljson均在gencerts目录下
如下:

[root@jiujiu-tdh-11 gencerts]# ./cfssl gencert -ca=etcd-ca.pem -ca-key=etcd-ca-key.pem -config=config.json -profile=etcd -hostname=jiujiu-tdh-10,jiujiu-tdh-11,jiujiu-tdh-12,127.0.0.1,10.10.10.1,172.22.25.10,172.22.25.11,172.22.25.12 kubernetes-csr.json | ./cfssljson -bare etcd
2023/01/10 18:37:52 [INFO] generate received request
2023/01/10 18:37:52 [INFO] received CSR
2023/01/10 18:37:52 [INFO] generating key: rsa-2048
2023/01/10 18:37:53 [INFO] encoded CSR
2023/01/10 18:37:53 [INFO] signed certificate with serial number 504984216244594401143007257940375015952788161142

5、 拷贝新证书到本节点的/srv/kubernetes/和其他master节点以及Manager节点

5.1. 复制到本节点的/srv/kubenetes下
[root@jiujiu-tdh-11 gencerts]# cp etcd-ca-new.pem /srv/kubernetes/etcd-ca.pem
[root@jiujiu-tdh-11 gencerts]#
[root@jiujiu-tdh-11 gencerts]# cp etcd.pem etcd-key.pem /srv/kubernetes/
cp:是否覆盖"/srv/kubernetes/etcd.pem"? y
cp:是否覆盖"/srv/kubernetes/etcd-key.pem"? y
5.2. scp到集群中的其他所有节点(tos-master 以及 Manager节点)
[root@jiujiu-tdh-11 gencerts]# cd /srv/kubernetes
[root@jiujiu-tdh-11 kubernetes]# scp etcd-ca.pem etcd.pem etcd-key.pem root@172.22.25.10:/srv/kubernetes/
root@172.22.25.10's password:
etcd-ca.pem                                                           100% 2082   745.5KB/s   00:00
etcd.pem                                                              100% 1870     3.3MB/s   00:00
etcd-key.pem                                                          100% 1675     2.8MB/s   00:00
[root@jiujiu-tdh-11 kubernetes]# scp etcd-ca.pem etcd.pem etcd-key.pem root@172.22.25.12:/srv/kubernetes/
root@172.22.25.12's password:
etcd-ca.pem                                                          100% 2082   904.1KB/s   00:00
etcd.pem                                                             100% 1870    41.7KB/s   00:00
etcd-key.pem                                                         100% 1675     3.5MB/s   00:00
5.3. scp到集群中的flannel服务的所有安装节点上(TDC不影响,未安装flannel的节点不影响,不影响的集群可不操作)

若安装了flannel服务,需要将其复制到flannel的所有安装节点上

  1. 获取flannel所在节点,如下显示flannel节点为jiujiu-tdh-10, jiujiu-tdh-11, jiujiu-tdh-12,与etcd节点重合, 故不需要做额外的复制操作
    [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节点 则需要将更新了的证书复制到这些节点

    # scp /srv/kubernetes/etcd* root@《非etcd节点的ip》:/srv/kubernetes/

6、 重启相关服务

6.1 检查etcd服务状态(若不正常请联系星环售后技术支持)

将下面命令中的jiujiu-tdh-10,jiujiu-tdh-11,jiujiu-tdh-12修改成步骤 4.4 获取的 etcd 的 hostname

[root@jiujiu-tdh-11 ~]# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://jiujiu-tdh-10:4001,https://jiujiu-tdh-11:4001,https://jiujiu-tdh-12: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
# etcd 是一主两备,有一个 true 和 2个 false 是正常状态

[root@jiujiu-tdh-11 ~]# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://jiujiu-tdh-10:4001,https://jiujiu-tdh-11:4001,https://jiujiu-tdh-12:4001 endpoint health
2023-02-15 16:40:05.373542 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2023-02-15 16:40:05.374429 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2023-02-15 16:40:05.375645 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
https://jiujiu-tdh-11:4001 is healthy: successfully committed proposal: took = 2.288165ms
https://jiujiu-tdh-12:4001 is healthy: successfully committed proposal: took = 9.113096ms
https://jiujiu-tdh-10:4001 is healthy: successfully committed proposal: took = 16.162234ms
6.2 所有etcd节点上依次重启etcd和apiserver

在其他 etcd 节点也要顺序执行以下同样的操作

1.停止 etcd 和 apiserver

[root@jiujiu-tdh-11 gencerts]# mv /opt/kubernetes/manifests-multi/tos-etcd.manifest  /opt/kubernetes/
[root@jiujiu-tdh-11 gencerts]# mv /opt/kubernetes/manifests-multi/tos-apiserver.manifest /opt/kubernetes/

2.确认 container 不存在后,等待30s,继续后面步骤

[root@jiujiu-tdh-11 gencerts]# docker ps |grep tos-etcd
[root@jiujiu-tdh-11 gencerts]# 
[root@jiujiu-tdh-11 gencerts]# docker ps |grep apiserver
[root@jiujiu-tdh-11 gencerts]#

3.启动 etcd 和 apiserver

[root@jiujiu-tdh-11 gencerts]# mv /opt/kubernetes/tos-etcd.manifest /opt/kubernetes/manifests-multi/
[root@jiujiu-tdh-11 gencerts]# mv /opt/kubernetes/tos-apiserver.manifest /opt/kubernetes/manifests-multi/

在其他 etcd 节点也按照顺序执行以上操作之后

  1. 检查 etcd 节点状态是否正常
[root@jiujiu-tdh-11 ~]# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://jiujiu-tdh-10:4001,https://jiujiu-tdh-11:4001,https://jiujiu-tdh-12: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
# etcd 是一主两备,有一个 true 和 2个 false 是正常状态

[root@jiujiu-tdh-11 ~]# ETCDCTL_API=3 etcdctl --cacert /srv/kubernetes/etcd-ca.pem --cert /srv/kubernetes/etcd.pem --key /srv/kubernetes/etcd-key.pem --endpoints https://jiujiu-tdh-10:4001,https://jiujiu-tdh-11:4001,https://jiujiu-tdh-12:4001 endpoint health
2023-02-15 16:40:05.373542 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2023-02-15 16:40:05.374429 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
2023-02-15 16:40:05.375645 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
https://jiujiu-tdh-11:4001 is healthy: successfully committed proposal: took = 2.288165ms
https://jiujiu-tdh-12:4001 is healthy: successfully committed proposal: took = 9.113096ms
https://jiujiu-tdh-10:4001 is healthy: successfully committed proposal: took = 16.162234ms
  1. 确保 apiserver 的container 正常运行
[root@jiujiu-tdh-11 gencerts]# docker ps -a |grep apiserver
38ca327d181e        46ad5fa4c35f                                "hyperkube apiserver…"    3 seconds ago       Up 1 second                                      k8s_tos-apiserver-tos_tos-apiserver-tos-jiujiu-tdh-11_kube-system_e6a3c26e60fad7c80fea893016c4a9e8_0
70a3ada56731        transwarp/pause:manager-7.0.1910a-final     "/pause"                  3 seconds ago       Up 2 seconds                                     k8s_POD_tos-apiserver-tos-jiujiu-tdh-11_kube-system_e6a3c26e60fad7c80fea893016c4a9e8_0
[root@jiujiu-tdh-11 gencerts]#
6.3 重启flannel服务
kubectl delete po $(kubectl get po -owide -n kube-system |grep flannel|awk '{print $1}') -n kube-system

7. 更新metainfo目录下的证书和manager数据库

manager-6.0.1811a之后的版本会存储tos证书到数据库中分发到各个节点,同时生成其他证书相关的逻辑会使用metainfo中的etcd-ca.pem,所以需要更新相关文件和数据库数据,防止后续角色重启变更分发证书导致证书再次失效

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

8 更新Manager 中历史证书数据(脚本和手动的方式二选一)

8.1 脚本操作

使用 上面 步骤2 下载的更新manager数据库的脚本更新

  1. 将update_manager_info.sh 脚本放到manager节点上
  2. 赋权并执行脚本
    chmod +x update_manager_info.sh
    ./update_manager_info.sh
8.2 手动操作
8.2.1. 备份原表

根据 各个版本查看Manager后台数据的方法 进入Manager数据库

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

file

8.2.2. 更新证书数据

1.在manager节点执行下面命令获取刚刚更新的证书内容

cat /srv/kubernetes/etcd-ca.pem
cat /srv/kubernetes/etcd-key.pem
cat /srv/kubernetes/etcd.pem

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

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

更新过的证书验证方法

 openssl x509 -text -in /srv/kubernetes/etcd-ca.pem | grep "Not"
 openssl x509 -text -in /srv/kubernetes/etcd.pem | grep "Not"
 ## tos版本在步骤4.1获取
 openssl x509 -text -in /var/lib/transwarp-manager/master/content/meta/services/TOS/tos版本/templates/gencerts/etcd-ca.pem | grep "Not"

file


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

这篇文章对您有帮助吗?

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

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

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

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