TDC 5.x 及以上版本的 TOS CA 证书续签方案(适用于TDC版本>5.x)

  其他常见问题
内容纲要

概要描述

旧版本 CA 证书于 2025/12/7 日过期,需要及时进行证书的更新防止 TOS 集群不可用

对于 TDC 5.X 来说,只要环境内部有 manager 集群(或者说 TOS 2.x),不管是on manager架构,还是纳管的 manager 集群,都需要进行续签。

需要注意的是,续签动作是针对 TOS 集群,所以可以去具体的 TOS 集群中确认 ca 证书的时间。


详细说明

  1. 续签注意事项
  2. 获取更新脚本
  3. 续签集群(先主集群,后子集群)
    4. (可选)续签集群 guardian 证书
  4. 执行 TDC FED rejoin

1. 续签注意事项

  1. 准备工作,明确TDC架构,按集群维度进行 CA 证书续签。
    TDC5 属于多集群架构,在续签前,需要明确续签的 TOS 集群属于 TDC 的主集群,还是子集群。

  2. 如果涉及到主集群续签,操作过程中会重启 TDC 的 pod,会影响 TDC 的登录功能。请合理安排停机时间。

  3. 如果是子集群续签,不影响集群运维和使用。

  4. 如果续签内容中包含主集群续签,请先续签主集群;

  5. 如果有多个子集群需要续签,可以先续签子集群(子集群之间互不影响,可以同时续签多个子集群)。

  6. 最后再进行 TDC FED rejoin 操作(每次只能操作一个子集群,不能并行操作)。

无论是主集群还是子集群续签,本质都是集群证书续签(主集群、子集群都需要操作) + TDC FED rejoin(只在主集群操作) 。


2 获取更新脚本

点击下载X86架构CA证书更新工具 ca-renewal-v12.tar.gz

点击下载ARM64架构CA证书更新工具 ca-renewal-v12-arm64.tar.gz

点击下载 tosfedctl rejoin X86 工具

点击下载 tosfedctl rejoin ARM64 工具

点击下载 TOS-Base-2.1.x.tar.gz

根据即将执行脚本的 TOS Master 节点的架构,选择对应的脚本工具。

tos maste 节点是 X86 架构,就上传 ca-renewal-v12.tar.gz

tos maste 节点是 ARM 架构,就上传 ca-renewal-v12-arm64.tar.gz

在 ca-renewal 目录下,执行以下命令分别安装 sshpass / cfssl / cfssljson 这三个命令

# 解压更新包 进入目录
$ tar -zxvf ca-renewal-v12.tar.gz
$ cd ca-renewal

# 安装 sshpass
$ rpm -ivh sshpass-1.06-2.el7.$(uname -p).rpm

# 安装 cfssl 相关命令
$ cp -pr cfssl* /usr/local/bin/.

3 续签集群ca证书

3.1 填写集群节点信息

3.1.1、生成集群节点信息

$ bash gen-hosts.sh
# 执行此脚本会在 ca-renewal 目录下生成 hosts.txt,里面仅包含集群节点的 hostname、ip 及 tos角色

执行上述脚本后,需要手动检查 hosts.txt

  • 第 4 列补充节点的 ssh 端口,
  • 第 5 列对应 ssh 的用户名,
  • 第 6 列对应 ssh 密码

如果节点间使用 root 免密的话 ,hosts.txt 中的 用户名、密码 无需填写。

标准的hosts文件参考

$ cat ca-renewal/hosts.txt
node01 172.18.120.115 master 22 test Warp@1234
node02 172.18.120.113 master 22 test Warp@1234
node03 172.18.120.114 master 22 test Warp@1234
node04 172.18.120.112 worker 22 test Warp@1234

注意:
如果使用非 root 用户执行脚本,在执行 tos 续签脚本前,需要给该用户在对应节点上添加 sudo 权限,比如用 visudo 命令编辑 sudo 文件

$ visudo
# 在文件最后一行添加对应用户的sudo权限并保存修改
_test-name245 ALL=(ALL) NOPASSWD: ALL

3.1.2 续签集群CA证书
修改 ca-renewal-manager.sh 脚本,注释如下2行

$ vi ca-renewal-manager.sh

echo "INFO: Start Update Manager db with new ca"
#bash $basedir/09-update-manager-db.sh || exit 1   #注释掉
echo "INFO: Update Manager db with new ca Succeeded"

echo "INFO: Start Update Manager metainfo with new ca"
#bash $basedir/09-update-manager-metainfo.sh || exit 1  #注释掉
echo "INFO: Update Manager metainfo with new ca Succeeded"

执行 ca-renewal-manager.sh 脚本进行证书续签。

$ bash ca-renewal-manager.sh

以下两种结果输出都属于正常输出。
正常执行结果1:

file

正常执行结果2:
file

3.1.3、更新集群 bootstrap.kubeconfig 

$ bash 13-update-bootstrap.sh

正常执行结果:

file

4. (可选)续签集群 guardian 证书

跳过,无需执行!

5、TDC FED rejoin

点击下载 tosfedctl rejoin ARM64 工具

点击下载 tosfedctl rejoin ARM64 工具

5.0 rejoin 说明
  1. 如果集群是manager 6系列,以下方案可能不能覆盖,rejoin的具体操作内容请咨询tdc团队进行处理。

  2. 在 集群完成 续签后,还需要在 TDC FED 上进行rejoin 操作,用来激活和更新 FED 和 续签集群 之前的控制关系。

  3. 执行节点为 TDC 主集群(即 fed 集群)的任一 master 节点。

注意:执行 rejoin 操作,必须在 集群CA证书更新完毕 之后执行。

5.1 执行 rejoin 操作

1、将 完成 CA 证书续签的集群 的 kubeconfig 配置文件 copy 至 TDC master 节点上

2、修改 续签集群 kubeconfig的 api IP 为 续签集群 TOS master IP

  • 修改续签集群 kubeconfig 的 api IP 为 续签集群 TOS master IP,不能是 127.0.0.1

file

3、使用 tosfedctl 工具,执行以下命令

$ tosfedctl rejoin CLUSTER_NAME --cluster-kubeconfig=  --enable-network=true

# CLUSTER_NAME 是需要已经续签完成的集群。

# KUBECONFIG 是已经续签完成的集群的 kubeconfig,(是从已经续签完成的集群的 kubeconfig 文件 copy 至主集群工具所在目录)

file

操作示例:

TDC master (FED 集群)任意节点之一 作为 TDC IP

续签集群的 TOS master 任意节点之一作为 TOS MASTER IP ,续签集群名称为 TOS CLUSTERNAME

# 获取 cluster name  用于 rejoin 命令
$ tosfedctl get cluster

# 在 TDC master 节点上准备好rejoin 目录,这里使用 /opt/transwarp
$ cd /opt/transwarp

# 创建以续签集群为名的目录
$ mkdir -p /opt/transwarp/rejoin-cluster/

# 将续签集群的配置文件copy至该目录,如果是本集群copy 请使用 cp -pr 命令(TDC on manager续签主集群场景)
$ scp -r :/srv/kubernetes/ /opt/transwarp/rejoin-cluster//.

检查续签集群的kubeconfig文件,确保cluster server 的 IP 不为127.0.0.1 ,应该为 续签集群的 TOS master IP

# 实际操作中请替换为 TOS MASTER的实际名称和IP
$ cat /opt/transwarp/rejoin-cluster//kubernetes/kubeconfig

# 执行rejoin 并等待命令返回 successful

$ tosfedctl rejoin  --cluster-kubeconfig=/opt/transwarp/rejoin-cluster//kubernetes/kubeconfig  --enable-network=true
5.2 更新数据库

请先上传 TOS BASE 的最新包不区分服务器架构 TOS-Base-2.1.x.tar.gz,确保 TDC 环境内部的TOS metainfo 已经更新。

点击下载 TOS-Base-2.1.x.tar.gz

这一步非常重要,否则可能会导致后续在TOS 配置服务场景中 CA证书刷回旧版本。请务必上传最新 TOS BASE 产品包。


更新TDC数据库,步骤如下:

  1. 执行备份脚本,备份 cluster_config 表内容
  2. 使用脚本更新 TDC 数据库中 cluster_config 表中的相关证书记录

1、执行备份脚本,备份 cluster_config 表内容

#!/bin/bash
# 获取当前时间戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BACKUP_TABLE="cluster_config_$TIMESTAMP"

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 数据库查询函数
db_query() {
    local query="$1"
    kubectl --kubeconfig=/srv/kubernetes/kubeconfig -ntdcsys exec  kundb-kundb-0 --  mysql -hkundb-kundb.tdcsys.svc -ptranswarp -uvt_app -P3306 -D tdc_fed -NB -e "$query" 2>/dev/null
}

check_success() {
    if [ $? -eq 0 ]; then
        log "执行命令成功"
    else
        echo "执行命令失败"
        exit 1
    fi
}

# 主函数
main() {
    # 备份整个 cluster_config 表
    log "备份 cluster_config 表到 $BACKUP_TABLE..."
    db_query "CREATE TABLE $BACKUP_TABLE AS SELECT * FROM cluster_config;"
    check_success
    backup_count=$(db_query "SELECT COUNT(*) FROM $BACKUP_TABLE;")
    log "备份完成,共备份 $backup_count 条记录"
}

# 执行主函数
log "开始备份数据库表 cluster_config ..."
main
log "$BACKUP_TABLE备份完成,请进行表更新操作"

2、执行更新脚本,更新 TDC 数据库中 cluster_config 表中的相关证书记录

#!/bin/bash

if [ $# -ne 1 ];then
    echo "usage: please enter cluster name"
    exit 1
else
    clustername=$1
    echo "cluster name is $clustername"
fi

# 获取当前时间戳
TIMESTAMP=$(date +%Y%m%d%H%M%S)
BACKUP_TABLE="cluster_config_$TIMESTAMP"
CURRENT_PATH=/opt/transwarp/rejoin-cluster

# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

# 数据库查询函数
db_query() {
    local query="$1"
    kubectl --kubeconfig=/srv/kubernetes/kubeconfig -ntdcsys exec  kundb-kundb-0 --  mysql -hkundb-kundb.tdcsys.svc -ptranswarp -uvt_app -P3306 -D tdc_fed -NB -e "$query" 2>/dev/null
}

check_success() {
    if [ $? -eq 0 ]; then
        log "执行命令成功"
    else
        echo "执行命令失败"
        exit 1
    fi
}

# 主函数
main() {
    # 查询cluster_id
    cluster_id=$(db_query "SELECT id FROM cluster WHERE name = '$clustername';")
    check_success

    if [[ -z "$cluster_id" ]]; then
        log "警告: 没有找到IP $ip 对应的clusterId"
        exit 1
    fi

    local conf_dir="$CURRENT_PATH/$clustername/kubernetes"
    if [[ ! -d "$conf_dir" ]]; then
        log "错误: 配置目录 $conf_dir 不存在"
        exit 1
    fi

    # 更新 cluster_config 表:将 .pem 类型配置的 value 替换为 $conf_dir 下同名文件的内容
    local pem_keys_and_ids
    # 查询 key 和 config id,确保能精准更新
    pem_keys_and_ids=$(db_query "
        SELECT \key\, id
        FROM cluster_config
        WHERE clusterId = '$cluster_id'
          AND \key\ LIKE '%.pem';
    ")
    check_success

    # 如果没有匹配的记录,跳过
    if [[ -z "$pem_keys_and_ids" ]]; then
        log "错误: 没有找到需要更新的 .pem 配置项"
        exit 1
    fi

    # 逐行处理查询结果
    while IFS=$'\t' read -r key config_id; do
        local file_path="$conf_dir/$key"
        if [[ ! -f "$file_path" ]]; then
            log "错误: 配置文件不存在,失败文件: $file_path"
            exit 1
        fi

        # 读取文件内容(保留换行符等)
        local file_content
        file_content=$(cat "$file_path")
        if [[ $? -ne 0 ]]; then
            log "错误: 无法读取文件 $file_path"
            exit 1
        fi

        # 执行更新(使用 config.id 定位)
        db_query "
            UPDATE cluster_config
            SET value = '$file_content'
            WHERE id = '$config_id';
        "
        check_success
        log "已更新配置项: $key"

    done <<< "$(echo -e "$pem_keys_and_ids")"

}

# 执行主函数
log "开始更新集群 $clustername的 cluster_config 表的证书记录..."
main
log "集群 $clustername的表证书记录处理完成"

这篇文章对您有帮助吗?

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

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

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

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