
K3s 如何用 k3s token rotate 轮换服务器集群 token 并让其他 server 节点重新加入【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3s在多 server 节点的 k3s 集群里server token 是节点加入集群的凭证同时它还被用作加密集群 bootstrap 数据的口令因此集群启动之后不能直接更换 token 值——各 server 节点必须使用同一个 token。当 token 需要按安全规范定期轮换、或被怀疑泄露时正确做法是通过k3s token rotate子命令用旧 token 解密 bootstrap 数据、再用新 token 重新加密然后让其余 server 节点带新 token 重新加入。本文基于仓库内的 server-token-rotation ADR 和 token 子命令实现给出可逐步执行的轮换与重新加入流程。轮换前的准备执行k3s token rotate前需要确认三点集群是已启动的多 server 节点集群你至少持有第一个 server 节点的操作权限你手里有当前正在使用的旧 token 值用于命令参数-t轮换成功后其余 server 节点会短暂处于带旧 token 无法加入的状态直到完成后续重启步骤。执行k3s token rotate时客户端会先输出一条警告见 pkg/cli/token/token.go 第 152 行WARNING: Recommended to keep a record of the old token. If restoring from a snapshot, you must use the token associated with that snapshot.也就是说轮换后旧 token 不要丢弃。从某个 etcd 快照恢复集群时必须使用与该快照关联的那个 token因此旧 token 需要记录并妥善保存。在第一个 server 上执行 k3s token rotatek3s token rotate支持两种用法-t传旧 token# 1a) 不指定新 token由系统生成一个 16 字符的随机 token k3s token rotate -t OLD_TOKEN或# 1b) 指定新 token 值 k3s token rotate -t OLD_TOKEN --new-token NEW_TOKEN其中OLD_TOKEN是集群当前正在使用的 server token--new-token是可选的自定义新 token不传时服务端调用util.Random(16)生成 16 字符随机值见 pkg/server/handlers/token.go 第 78-83 行。该命令并不是本地改文件而是向 server 发起一次 API 请求PUT /v1-program/token由服务端完成用旧 token 解密 bootstrap 数据、用新 token 重新加密、更新数据目录下的token文件与 passwd 文件。成功后命令输出Token rotated, restart k3s nodes with new token这条输出与 docker token 测试 中断言的Token rotated, restart k3s nodes with new token一致说明轮换请求已被服务端接受但集群里其他节点还带着旧 token必须执行下一步。走 1a) 分支时到执行轮换的那个 server 上读取新生成的 tokencat /var/lib/rancher/k3s/server/tokenADR 中给出的是vi /var/lib/rancher/k3s/server/token用编辑器打开该文件同样可以。该文件内容即后续各节点重新加入要使用的新 token 值。让其他 server 节点用新 token 重新加入拿到新 token 后在其余每个 server 节点上依次执行会短暂停止并重启该节点的 k3s 服务请逐个节点操作systemctl stop k3s # 编辑 /etc/rancher/k3s/config.yaml把其中的 token 值更新为新 token systemctl start k3s注意systemctl stop k3s会停止该节点上的控制面进程操作期间该节点上的 API 副本不可用多 server 集群中逐台滚动执行避免同时停掉所有 server。验证所有节点回到 Ready全部 server 节点重启完成后用 kubeconfig 检查节点状态kubectl get nodes判断标准集群原有的所有 server 节点都出现在列表中且处于 Ready 状态说明它们已用新 token 成功读取了重新加密后的 bootstrap 数据并重新加入集群。tests/docker/token/token_test.go 中的“Rotate server bootstrap token”用例正是按这条路径验证的执行k3s token rotate -t 旧token --new-token 新token给全部 server 写入新 token 后systemctl restart k3s最终断言节点数不变且所有节点 Ready。限制与边界快照恢复必须用对应快照的 tokenk3s token rotate自带的警告已说明这一点轮换后保留旧 token 记录是必做事项。token 已泄露且怀疑节点被入侵时rotate 不够ADR 明确指出若按 token 泄露的最坏情况处理唯一能保证集群安全状态的方式是彻底重新安装集群clean reinstall因为恶意程序可能已植入后门。k3s token rotate适用于主动的定期轮换或泄露被及时发现、尚未被恶意利用的场景。agent token 与 server token 相同时会被一并修改服务端处理逻辑中若 passwd 文件中 agentnode的 token 与旧 server token 相同且未单独配置 agent token则 agent token 也会随之更新为server:前缀的新值见 pkg/server/handlers/token.go 第 94-98 行。此时已加入的 agent 节点需要用新 token 重新加入处理方式与上面的 server 节点相同更新其/etc/rancher/k3s/config.yaml中的token值后systemctl restart k3s-agent。集群启动后各 server 必须使用同一个 token--new-token指定自定义值时可自行选择长度与字符服务端会按内部逻辑做规范化处理。相关文档Support Rotating Server Tokens、token 子命令定义、rotate 客户端实现、服务端轮换处理、bootstrap 数据重新加密逻辑。【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3s创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考