K3s 默认自签 CA 到期前如何用 rotate-default-ca-certs.sh 轮换集群 CA 证书

发布时间:2026/9/12 17:20:55

K3s 默认自签 CA 到期前如何用 rotate-default-ca-certs.sh 轮换集群 CA 证书 K3s 默认自签 CA 到期前如何用 rotate-default-ca-certs.sh 轮换集群 CA 证书【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3sK3s 在集群首次启动时会自动生成一套自签 CA——Server CA、Client CA、Request Header CA、etcd Peer CA、etcd Client CA外加 ServiceAccount Token 签名密钥。这些 CA 证书有效期为 3650 天约 10 年且不会自动续期一旦任何一张 CA 过期由它签发的证书都会失效导致集群大范围故障。这篇文章给出在默认自签 CA 到期前完成轮换的完整路径用仓库提供的示例脚本 rotate-default-ca-certs.sh 生成新的交叉签名 CA 证书再用k3s certificate rotate-ca写入集群数据。需要说明的前提这是针对首次启动时自动生成自签 CA的集群的轮换流程。按 ca-cert-rotation ADR 的定义它属于“disruptive有中断”的更新——必须在重启服务前修改节点的 CLI flag、配置文件或环境变量主要是 token且配置应用到所有节点的过程中集群节点可能因暂时不共享同一信任根而出现短暂不可用。轮换前确认 CA 证书的到期状态先运行证书检查命令确认当前 CA 还剩多久到期k3s certificate check该命令输出每个证书文件的文件名、Subject、用途、过期时间和状态状态取值为OK、WARNING、EXPIRED或NOT YET VALID也可以用-o table、-o json、-o yaml切换输出格式。对比轮换前后的 CA 到期时间、以及轮换后各证书状态回到OK是本文验证步骤的核心手段。作为对照叶子证书客户端/服务端证书有效期为 365 天会在 K3s 启动时若距过期不足 90 天自动续期不需要手动处理需要人工介入的只有 CA。准备条件在运行 k3s server 的节点上操作。脚本默认数据目录DATA_DIR/var/lib/rancher/k3s如果你的 k3s 使用了-data-dir指定其他目录运行时通过环境变量DATA_DIR覆盖。节点上需要有带椭圆曲线ecparam支持的 openssl。脚本启动时会自检缺失时报错openssl not found or missing Elliptic Curve (ecparam) support.并退出如果系统里有openssl-3命令会优先使用它。脚本会检查数据目录下 5 个 CA 证书文件是否存在client-ca.crt、server-ca.crt、request-header-ca.crt、etcd/peer-ca.crt、etcd/server-ca.crt位于${DATA_DIR}/server/tls/。任何一个缺失都会输出Current type CA cert does not exist; cannot continue并退出。脚本的副作用范围在${DATA_DIR}/server/rotate-ca下创建新的证书和密钥文件以及一个脚本退出时自动清理的临时.ca工作目录。它不会修改数据目录中已有的证书是否生效取决于后续rotate-ca步骤。把脚本从 k3s 源码树中取出放到 server 节点上仓库内路径为 contrib/util/rotate-default-ca-certs.sh例如放到节点上的/tmp与 e2e 测试中的用法一致。步骤一生成新的交叉签名 CA执行脚本使用默认数据目录时直接运行即可数据目录不同则加DATA_DIRbash /tmp/rotate-default-ca-certs.sh# 数据目录不是 /var/lib/rancher/k3s 时 DATA_DIR/你的k3s数据目录 bash /tmp/rotate-default-ca-certs.sh脚本对每种 CA 类型执行三步生成新的自签根 CA有效期 7300 天、用当前旧根 CA 对新根做交叉签名、再由新根签发新的叶子 CA。最终生成的 CA bundle 会依次包含新叶子 CA、新自签根、交叉签名根、旧根。保留旧根意味着已签发的现有证书在原始根 CA 过期之前仍然被信任这是交叉签名流程的核心目的。脚本还会生成新的 ServiceAccount 签名密钥一个新的 RSA 2048 密钥加上旧service.key的内容。服务端写入时会校验新密钥 bundle 中仍包含当前生效的签名密钥旧 token 的验签不受影响。脚本正常结束后会打印类似如下内容文档示例具体哈希值以你的集群为准Cross-signed CA certs and keys now available in /var/lib/rancher/k3s/server/rotate-ca Updated server token: K10新server-ca哈希::原token第二部分 Updated agent token: K10新server-ca哈希::原token第二部分 To update certificates, you may now run: k3s certificate rotate-ca --path/var/lib/rancher/k3s/server/rotate-ca这里的更新 token 必须记下来完整K10格式的 token 中包含 Server CA 文件的 SHA256 哈希CA 更换后哈希随之变化旧 token 将不再通过节点加入时的 CA 哈希校验见 ca-cert-rotation ADR 中 “Server CA Pinning” 一节。步骤二把新 CA 写入集群数据按脚本提示执行k3s certificate rotate-ca --path/var/lib/rancher/k3s/server/rotate-ca参数说明--path为必填项指向步骤一生成的目录。命令使用数据目录下的 server token 向 API server 的/v1-k3s/cert/cacerts端点 PUT 新证书--server默认为https://127.0.0.1:6443。服务端写入前会做一致性校验新的叶子 CA 必须能用旧 CA 链验证即共享同一信任根新的 ServiceAccount 签名密钥 bundle 必须包含当前生效密钥。校验失败时命令报错failed to validate new CA certificates and keys并提示see server log for details。如果确实需要在一致性检查失败时强行写入可加--force用法说明为 “Force certificate replacement, even if consistency checks fail”仅在明确理解后果时使用。成功时命令输出certificates saved to datastore同时 server 日志会记录certificate: Cluster Certificate Authority data has been updated, k3s must be restarted.——即证书已落库但节点必须重启才会加载。步骤三更新 agent token 并重启节点把每个 agent 节点使用的 token通过配置文件、环境变量或 CLI flag 提供的那份更新为脚本输出的 “Updated agent token”。这是 disruptive 更新要求的配置变更必须在重启服务之前完成。重启所有 k3s server 节点再重启 agent 节点。集成测试与 e2e 测试均采用“先停 server、再启动、随后重启其余节点”的顺序见 cacertrotation 集成测试 和 rotateca e2e 测试。重启窗口内集群可能出现短暂不可用属于该流程的预期现象不是故障。验证轮换结果检查 CA 到期时间是否更新。在 server 节点上运行k3s certificate check确认 CA 证书条目显示新的过期时间、状态为OK。确认 CA 文件确实被替换。集成测试的做法是轮换前后各取一次哈希并比较md5sum /var/lib/rancher/k3s/server/tls/client-ca.crt md5sum /var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt测试断言轮换并重启 server 后client-ca.crtCA 被替换和serving-kube-apiserver.crt用新 CA 链重新签发的哈希都与轮换前不同。确认集群功能恢复各节点进入 Ready 状态、kube-system命名空间中的 Pod 全部 running。这是 e2e 测试在重启 server 和 agent 之后的验证方式。限制与注意该流程只适用于默认自签 CA 的集群。如果集群启动时使用了外部 CA 签发的用户自定义证书非中断式更新只需重启服务、无需改节点配置即可仓库另提供了 generate-custom-ca-certs.sh 作为对应工具。步骤一脚本要求 5 张 CA 证书齐全任何一张缺失都会直接终止不会做部分轮换。新 CA bundle 中包含旧根现有证书的可信状态延续到旧根过期为止不要手动编辑server/rotate-ca目录下的文件后再执行rotate-ca否则可能触发一致性校验失败。更多背景hash 钉扎、bootstrap 数据不可重写等问题可参考 docs/adrs/ca-cert-rotation.md证书到期检查机制参考 docs/adrs/cert-expiry-checks.md。【免费下载链接】k3sLightweight Kubernetes项目地址: https://gitcode.com/GitHub_Trending/k3/k3s创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/12 17:20:55

@mantine/dates 日期组件样式错乱怎么解决

mantine/dates 日期组件样式错乱怎么解决 【免费下载链接】mantine A fully featured React components library 项目地址: https://gitcode.com/GitHub_Trending/ma/mantine 在 Mantine 项目里使用 mantine/dates 的日历和日期选择器时,如果组件看起来"…

2026/9/12 18:10:57

STM32学习(五)—— 时钟体系

一、什么是晶振晶振的全称叫做晶体振荡器,是晶体(石英)和电子元件组成,晶振有一个非常重要的特性:机电效应(压电效应),一般晶振会提供高度稳定的频率(振荡频率是固定的&a…

2026/9/12 18:10:57

ABAQUS随机颗粒生成器:Python脚本实现二维非重叠颗粒建模

简介:这是一套基于ABAQUS的二维随机颗粒生成插件,面向从事颗粒材料有限元模拟的工程师与科研人员。核心功能通过Python脚本调用ABAQUS内建函数,自动完成颗粒尺寸、形状、材料属性及分布区域的参数化设置,并借助随机数算法生成位置…

2026/9/12 18:10:57

SpringBoot+JSP网络订餐系统:工程构建与并发事务处理

简介:这是一份基于 Spring Boot 与 JSP 技术栈的 Java 网络订餐系统设计源码,面向 Java Web 开发者、毕业设计及课程设计人群,能够帮助读者快速掌握 Spring Boot 框架与 JSP 动态页面、数据库集成的完整项目开发流程。压缩包共 169 个文件、约…

2026/9/12 18:10:57

国资:高管退休潮背后的深层逻辑与组织进化

《央企换帅,看名单的人都看错了》 ——升迁只改座位,退休才改规则一天之内,十七家中央企业、二十三名高管变动,其中十六人的结局是同一个词:退休。名单一出,大家下意识找“谁上去了”。可这份公告真正完成的…

2026/9/12 18:10:57

Python属性装饰器:数据封装与访问控制实战

1. 为什么需要属性装饰器:从数据失控到优雅封装在Python面向对象编程中,我们经常遇到一个经典矛盾:直接暴露实例属性虽然简单方便,但无法对赋值进行有效控制。想象你正在开发学生成绩管理系统,如果允许直接修改score属…

2026/9/12 18:05:57

牡丹芍药春季养护:抹芽疏蕾技巧与时机把握

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/12 2:05:33

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/12 3:55:12

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/12 10:09:03

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/12 0:04:17

MATLAB仿生优化框架:长鼻浣熊算法多策略融合实现

简介:本资源是一份面向智能优化算法研究者与MATLAB初学者的仿生智能算法实践代码包,聚焦于长鼻浣熊优化算法(COA)的多策略改进与性能验证。针对传统COA易陷局部最优、收敛精度不足等问题,作者融合Circle映射初始化提升…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 JavaWeb 的校园一卡通管理系统的设计与实现 基于 JavaWeb 的校园卡业务管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 0:04:17

【JAVA毕设源码分享】基于 Java 的图书馆借阅管理平台的搭建与实现 基于 Java 的图书馆综合管理系统(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/12 6:37:43

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码