概要描述
过期后,tos 服务不可用,本文介绍一种 CA 证书过期后的续签步骤。

需要注意的是,本手册仅建立在CA证书过期,但docker服务和ETCD服务还可以正常运行的环境中。
如果当前环境内部docker服务和ETCD服务不正常,请先恢复docker和ETCD服务,再进行CA证书的续签操作。
详细说明
- 准备工具
- 获取信息
- 唤醒tos,并执行续签
1 准备工作
1.1 获取更新脚本
根据 TOS MASTER 节点的 cpu 架构 获取对应的更新包,并将安装包放置于 环境的 TOS MASTER节点。
点击链接,根据 TOS Master 服务器架构,下载对应的CA证书更新工具 ca-renewal-v13.tar.gz
1.2 安装所需命令
解压更新包,获得 ca-renewal 目录。
在 ca-renewal 目录下,执行以下命令分别安装 sshpass / cfssl / cfssljson 这三个命令
# 解压更新包 进入目录
cd ca-renewal
# 安装 sshpass
rpm -ivh sshpass-1.06-2.el7.$(uname -p).rpm
# 安装 cfssl 相关命令
cp -pr cfssl* /usr/local/bin/.
1.3 确认前置服务可用
如果环境节点较多,以下服务确认 TOS master 的情况即可:
docker : systemctl status docker 确认 是否为 active (running)

kubelet :systemctl status kubelet 确认 是否为 active (running)

haproxy :systemctl status haproxy 确认 是否为 active (running)

etcd :TOS master 节点的 docker ps -a | grep etcd CREATED 时间相同的容器的 STATUS 为 Up 没有 Exited

如果 docker 和 etcd 不正常,需要修复 docker 和 etcd 后再执行后续续签操作。
如果 docker 服务不正常,无法进行CA证书的更新。
如果 etcd 服务不正常,会有数据丢失的情况出现。
2、获取相关信息
2.1 获取 相关信息
需要获取以下三个信息:
kubernete IP:集群节点的主机名和IP
TOS的主机名和IP:由于环境TOS已不可用,如果 manager 页面仍可登录,请去manager页面获取信息,获取方式如下:
- kubernete IP 从 TOS 组件的配置参数页面 查找 service.cluster.ip.range ,该参数为一个网段,请获取该网段的第一个IP,例如 10.10.10.0/16 ,那么 kubernete IP 即为 10.10.10.1
或者通过以下命令获取:
# 在 TOS master 节点
$ grep -r service-cluster-ip-range /opt/kubernetes/manifests-multi
tos-apiserver.manifest: --service-cluster-ip-range=10.10.10.0/24
# 可以看到 10.10.10.1 就是 kubernete IP

- 集群节点和 TOS MASTER的 主机名和IP,可以从节点页面获取
PS:如果 manager 页面不可用,但 manager 数据库仍可连接,请从数据库获取,链接数据库的方式:
mysql -h localhost -u transwarp -p$(cat /etc/transwarp-manager/master/db.properties | grep io.transwarp.manager.db.password | awk -F = '{print $2}') -S /var/run/mariadb/transwarp-manager-db.sock -D transwarp_manager
执行如下 SQL 查看节点 ip :
# 获取 service.cluster.ip.range
# kubernete IP 为该网段第一个IP
select * from service_config where name='service.cluster.ip.range';
# 获取所有节点主机名和IP
select * from node;
# 获取 TOS MASTER 主机名和IP
SELECT n.*
FROM node n
INNER JOIN role r ON n.id = r.nodeId
WHERE r.type='TOS_MASTER';
2.2 修改 host.txt
结合之前获取的信息,按照以下格式更新 host.txt 文件,注意 master 节点区分:
host.txt
# 主机名 IP 角色名 ssh端口 连接用户 用户密码
node01 192.168.0.115 master 22 test 123456
node02 192.168.0.113 master 22 test 123456
node03 192.168.0.114 master 22 test 123456
node04 192.168.0.112 worker 22 test 123456
2.3 更新脚本
更新 gencerts/gen-certs.sh ,在脚本的第16行,注释原有svc的取值,改为 svc=
gencerts/gen-certs.sh
# 以下为示例,请按照实际IP情况填写,该IP填写错误将导致TOS启动失败
#svc=$(sudo /usr/bin/kubectl --kubeconfig=/srv/kubernetes/kubeconfig get svc | grep -w kubernetes | awk '{print $2}')
svc=10.10.10.1
cat $basedir/../hosts.txt | grep master > $basedir/../hosts-master.txt
cat $basedir/../hosts.txt | grep worker > $basedir/../hosts-worker.txt
这里的 svc 一定要修改为第 2.1 步获取的 kubernete IP

新增 ex-wakeup.sh: 点击下载 ex-wakeup.sh
该脚本实现两个内容, 一是使用新的ca证书重启docker, 二是逐个重启etcd:
3、CA更新唤醒TOS
在执行脚本时,可能会有部分异常情况,请参照文档最后部分进行处理。
bash gencerts/gen-certs-for-manager5.sh

bash ex-wakeup.sh

bash 03-distribute-new-certs.sh
以上三个脚本执行完成后,手动去 每个 TOS MASTER 重启 haproxy 服务,重启完成后,kubectl get no 命令应该可以执行了。
# 重启 每个 TOS MASTER 的haproxy
systemctl restart haproxy
# 确认 haproxy 服务启动
systemctl status haproxy
# 确认kubectl 命令恢复
kubectl get no

回到 ca-renewal 目录下,继续执行以下脚本:
bash 02-check-secrets-ca.sh
bash 04-recreate-secrets-manager5.sh
bash 05-restart-sa-pods-manager5.sh
bash 07-restore-config-with-newca-manager5.sh
bash 08-update-ca-trust.sh



2.5 后续操作
以上步骤操作完成后,请确认K8S服务是否恢复正常,可以通过以下命令确认:
# 查看 k8s pod
kubectl get po -nkube-system
4.手动修改tos的metainfo文件内容
- 确认tos 版本
docker images |grep etcd

- 找到tos的metainfo文件:
比如上图中,对应的 tos 版本为 transwarp-5.2.2-final
2、拷贝更新过的ca.crt 及 kubecfg 相关文件到 第一步 metainfo 路径下的 templates 目录下:
cp /srv/kubernetes/ca.crt /var/lib/transwarp-manager/master/content/meta/services/TOS/transwarp-5.2.2-final/templates
cp /srv/kubernetes/kubecfg.* /var/lib/transwarp-manager/master/content/meta/services/TOS/transwarp-5.2.2-final/templates
cp /srv/kubernetes/server.* /var/lib/transwarp-manager/master/content/meta/services/TOS/transwarp-5.2.2-final/templates

- 修改metainfo.yaml
PS:一定要注意yaml 文件的格式和内容,复制粘贴修改 metainfo 时,一定要确认修改后的内容和缩进必须符合 yaml 要求。
如果修改后出现,未使用 TOS,需要安装一个TOS服务,则需要检查一下 metainfo.yaml 内容和格式。
vi metainfo.yaml
找到 TOS_SLAVE 下的 type: Scaleout,在最后面加上以下内容,注意跟其他的directive并列,注意缩进保持一致
3、修改metainfo.yaml,找到 TOS_SLAVE 下的 type: Scaleout,在最后面加上以下内容,注意跟其他的directive并列,注意缩进保持一致
判断扩容节点是什么操作系统。
如果在这个列表里:["BCLINUX4EULER21", "EULER20", "EULER22", "KYLIN10", "NEOKYLIN7", "RHEL7", "RHEL8", "ROCKY8", "ROCKY9", "UOS1050A", "UOS1050E", "UOS1060E"],用以下的脚本:
- directive: !
templateType: FreeMarker
templatePath: "ca.crt"
targetPath: "/srv/kubernetes/ca.crt"
mode: "600"
- directive: !
templateType: FreeMarker
templatePath: "kubecfg.crt"
targetPath: "/srv/kubernetes/kubecfg.crt"
mode: "600"
- directive: !
templateType: FreeMarker
templatePath: "kubecfg.key"
targetPath: "/srv/kubernetes/kubecfg.key"
mode: "600"
- directive: !
templateType: FreeMarker
templatePath: "kubecfg.pem"
targetPath: "/srv/kubernetes/kubecfg.pem"
mode: "600"
- directive: !
templateType: FreeMarker
templatePath: "server.pem"
targetPath: "/srv/kubernetes/server.pem"
mode: "600"
- directive: !
templateType: FreeMarker
templatePath: "kubeconfig"
targetPath: "/srv/kubernetes/kubeconfig"
mode: "600"
- directive: !
script: |
systemctl daemon-reload && systemctl restart haproxy && systemctl restart kubelet
- directive: !
script: |
(/bin/cp -f /srv/kubernetes/ca.crt /etc/pki/ca-trust/source/anchors/) && update-ca-trust

如果是其他操作系统,将以下脚本最后一行中的 /etc/pki/ca-trust/source/anchors/ 替换成
/usr/local/share/ca-certificates/

3、最后执行:/etc/init.d/transwarp-manager restart 生效;
6. 检查
0、检查当前集群TOS证书过期时间,登录集群任意节点,执行下面的命令
openssl x509 -text -in /srv/kubernetes/ca.crt |grep Not
如果显示是 2120 年过期,则表示续签成功。
