资讯详情

K3s/RKE2证书检查盲区:controller-manager与scheduler证书过期风险

📅 2026/10/22 5:08:40 | 华诺云谱 👁 阅读
K3s/RKE2证书检查盲区:controller-manager与scheduler证书过期风险
在K3s和RKE2的生产运维中证书管理一直是大家最关心的问题之一。最近我在梳理集群证书检查机制的时候发现了一个容易被人忽略的细节在2025年5月之前发布的版本中k3s certificate check和rke2 certificate check这条命令并不会检查kube-controller-manager和kube-scheduler这两个静态Pod的证书。这个坑如果不留意可能会让你的集群在证书续期后出现控制面组件静默失联的情况。今天我就把这个问题掰开揉碎了讲清楚包括它的来龙去脉、影响范围以及现阶段你能怎么做。1. 问题定位证书检查命令到底检查了什么1.1 命令的完整行为链路先看看这两个命令在正常情况下会做什么。K3s和RKE2作为轻量级发行版内置了证书生命周期管理certificate check命令本质上就是用来快速列出当前集群里各个证书的过期时间、签发时间和签发者方便你判断是否需要人工介入续期。命令本身结构很简单但底层逻辑涉及到了证书存储、静态Pod清单解析、以及内部agent的控制面组件配置。有意思的是kube-controller-manager和kube-scheduler在K3s/RKE2中是作为静态Pod运行的。这意味着它们的证书不通过集群内的cert-manager或helm chart管理而是直接由发行版启动时生成并挂载到Pod里。理论上证书检查命令既然已经覆盖了诸如kube-apiserver、kubelet等核心服务理应包含这两个静态Pod。但实际行为并非如此。在2025年5月之前发布的版本中证书检查逻辑的枚举列表里没有包括这两个控制面组件。也就是说执行k3s certificate check或sudo rke2 certificate check的时候输出结果里不会出现关于controller-manager和scheduler的任何条目。如果这两个证书悄悄接近过期时间仅依赖命令输出排查你会毫无察觉。1.2 为什么它不检查controller-manager和scheduler要理解这个行为得先明白K3s和RKE2的证书生成策略。在这两个发行版中v1.26开始具体细节根据版本会略有差异kube-controller-manager和kube-scheduler在部署时需要独立的客户端证书来连接kube-apiserver。这些证书同样有默认的一年有效期除非显式设置--rotate-certificates或手动脚本接管。开发者之所以没有一开始就把这两个组件纳入检查范围核心原因在于这两个组件在早期版本中的证书是共用kubeconfig的没有独立拆分。后续版本为了增强安全和组件隔离官方才把它们拆成了独立证书。但证书检查命令的枚举列表更新却滞后了直到后续打了补丁才补齐。这种版本迭代中的遗漏在实际场景里并不罕见但对于依赖自动化巡检的运维团队来说影响是实打实的。1.3 影响范围与潜在风险如果这两个组件的证书过期会发生什么最直接的表现就是kube-controller-manager和kube-scheduler反复重启日志里不断出现Unauthorized或Forbidden错误。因为证书无法通过kube-apiserver的认证组件无法正常list/watch资源。结果就是节点控制器、端点控制器、调度逻辑全面瘫痪影响包括但不限于新Pod无法被调度Service对应的Endpoints不更新节点状态在控制面中变成Unknown各类工作负载控制器如Deployment无法完成副本伸缩最坑的是由于kube-apiserver本身还活着集群的API还是通的很多基础监控比如节点存活看着一切正常但实际控制面已经半残。如果你只依赖certificate check作为唯一巡检手段这个问题就不会暴露在你的视野里。2. 证书机制与版本差异详析2.1 K3s和RKE2的证书存储结构两兄弟在这方面几乎一致。默认情况下证书存放在/var/lib/rancher/k3s/server/tlsK3s或者/var/lib/rancher/rke2/server/tlsRKE2。你可以在这个目录下看到以下关键文件kube-controller-manager.crt和kube-controller-manager.keykube-scheduler.crt和kube-scheduler.keyclient-kube-controller-manager.crt和client-kube-scheduler.crt部分版本文件名会稍有差异这些文件就是静态Pod中卷挂载的来源。对应的静态Pod清单在/var/lib/rancher/{k3s,rke2}/server/manifests/目录下比如kube-controller-manager.yaml通过Pod spec中的hostPath方式把证书文件挂载进容器。2.2 版本时间线与行为差异官方对证书检查命令的完善经历了三个阶段早期阶段只检查kube-apiserver和kubelet等核心组件controller-manager与scheduler共用kubeconfig证书检查没有单列条目。中期阶段组件开始启用独立证书但检查命令列表未同步更新这就是当前用户遇到的缺口期。修复阶段2025年5月左右官方补丁将这两个组件纳入证书检查范围命令输出开始包含对应条目。所以如果你在生产环境使用的K3s/RKE2版本发布时间早于2025年5月那么无论你执行多少次certificate check都看不到controller-manager和scheduler的证书状态。这不是你操作问题而是工具本身的功能覆盖范围局限。2.3 证书续期逻辑与检查命令的关系K3s和RKE2的证书续期一般通过删除tls目录下的相关证书文件然后重启服务触发重新生成。也有动态轮转机制比如kubelet证书可以通过--rotate-certificates自动续期。但controller-manager和scheduler的证书基本是静态生成、静态使用不参与动态轮转。这也意味着如果证书过期除非你重启服务并触发重新生成官方流程会检测证书剩余时间少于90天会自动轮转否则不会自动恢复。但这里有个关键点如果server进程一直持续运行且没有检测到需要轮转因为证书尚未过期或剩余时间大于触发阈值它不会主动去更新这两个证书。所以巡检命令不覆盖这两个组件带来的潜在风险不是“看不了”而是“压根不会在正常工作流里主动提醒你”。这也是我在实际运维中最头疼的一点。3. 实操现场验证与手动巡检方案3.1 确认当前版本是否受影响的步骤在了解完理论之后落地实操分两步走。第一步确认你的版本是否存在这个缺口。直接跑一下命令sudo k3s certificate check # 或者 sudo rke2 certificate check观察输出中是否有kube-controller-manager和kube-scheduler相关的行。如果输出列表里压根没出现这两个条目基本可以判定你用的是受影响版本。当然也可以直接查看发行版的版本号再对比修复补丁的发布时间2025年5月。3.2 手动检查controller-manager和scheduler证书过期的两条路径既然工具不帮忙那就自己动手。这里有两条路径一条是直接看证书文件的有效期sudo openssl x509 -enddate -noout -in /var/lib/rancher/k3s/server/tls/kube-controller-manager.crt sudo openssl x509 -enddate -noout -in /var/lib/rancher/k3s/server/tls/client-kube-controller-manager.crt sudo openssl x509 -enddate -noout -in /var/lib/rancher/k3s/server/tls/kube-scheduler.crt sudo openssl x509 -enddate -noout -in /var/lib/rancher/k3s/server/tls/client-kube-scheduler.crt注意不同版本的K3s/RKE2文件名可能不是完全一致的。比如有的版本中client证书为client-kube-controller-manager.crt有的则是kube-controller-manager-client.crt。一个更稳妥的办法是直接列出目录下所有与controller或scheduler相关的crt文件然后逐个用openssl去解析ls /var/lib/rancher/k3s/server/tls/ | grep -E (controller|scheduler)如果服务器是二进制安装方式路径基本一致如果是容器方式运行极少见你需要进入容器再查看。建议先用find /var/lib/rancher -name *controller* -o -name *scheduler*扫一遍。3.3 检查静态Pod里实际挂载的证书配置一个容易被忽视的方向是Pod实际使用的证书可能和tls目录下的静态文件并不一一对应。因为K3s/RKE2在生成静态Pod清单时可能会根据当前配置动态决定使用哪个证书文件。所以更可靠的方式是查看静态Pod清单里的实际挂载sudo cat /var/lib/rancher/k3s/server/manifests/kube-controller-manager.yaml在volumeMounts和volumes部分确认挂载的具体证书路径然后对那个路径执行openssl解析。这比直接扫目录更精准也更容易发现配置层面的坑比如你手动替换过证书但Pod清单没有更新。另外也可以通过kubectl直接进入Pod内部查看实际生效的证书有效期kubectl -n kube-system get pod -o wide | grep controller-manager kubectl -n kube-system exec -it kube-controller-manager-xxx -- sh openssl x509 -enddate -noout -in /etc/kubernetes/controller-manager.crt这种方式的优势在于它反映的是Pod内部真实挂载的内容而不是服务器目录里的静态文件。两者在正常情况下一致但如果你曾有手动改动或迁移过tls目录就可能出现不一致。3.4 证书续期的正确处理姿势如果检查发现controller-manager或scheduler证书剩余时间不足我个人建议小于90天就要开始关注处理思路和其他K3s/RKE2证书一致删除对应证书文件后重启服务让启动流程重新生成。sudo systemctl stop k3s sudo rm -f /var/lib/rancher/k3s/server/tls/kube-controller-manager.crt sudo rm -f /var/lib/rancher/k3s/server/tls/kube-controller-manager.key sudo rm -f /var/lib/rancher/k3s/server/tls/client-kube-controller-manager.crt sudo rm -f /var/lib/rancher/k3s/server/tls/client-kube-controller-manager.key sudo systemctl start k3sscheduler同理。操作完成后第一时间检查Pod状态kubectl -n kube-system get pod | grep -E (controller-manager|scheduler)如果看到CrashLoopBackOff或Error状态先看日志确认是不是证书问题。这里有个经验之谈只删除crt而不删除key可能不会触发重新生成因为K3s/RKE2在证书生成逻辑中如果发现key存在可能直接复用旧的key生成新证书。实践中最稳的方法是crt和key一起删不要偷懒。4. 常见问题与排查技巧实录4.1 证书检查命令输出为空是不是集群出问题了经常有人一执行certificate check发现没有输出或输出很少就开始慌张。其实在受影响的版本里这个命令的输出本来就不包含controller-manager和scheduler的条目。你要先确认自己用的命令是大写C的certificate还是其他别名然后看输出内容中缺失的到底是哪些组件字段。同时有一种情况是我踩过的在RKE2中如果你没有用root身份或sudo执行部分证书文件由于权限限制命令会静默跳过或直接报错。所以务必用sudo执行。如果输出中连apiserver都没有那就是命令执行方式有问题优先检查权限。4.2 证书文件显示过期了但集群似乎一切正常这是最迷惑人的情况。我在一次演练中发现controller-manager证书已经过期但集群照常工作。原因在于静态Pod容器中的进程可能是在证书过期前就已经建立了与kube-apiserver的连接并且连接一直保持活跃。只要连接不中断进程就还能继续工作。但如果网络抖动导致连接重建或者Pod因为内存压力被kill重启问题就会立刻爆发。所以证书过期并不等于立即宕机它更像一颗定时炸弹。这也是为什么我强烈建议即使集群看着正常也要按周期比如每周巡检一次检查证书状态。我就见过有集群带着过期证书跑了快一个月然后在一次滚动重启后起不来了。4.3 升级版本后是否需要手动处理证书如果你的集群是从受影响版本升级到修复版本证书检查命令的行为会发生变化但它不会自动帮你检查现有证书的过期状态更不会强制轮转过期证书。升级后的第一次巡检发现controller-manager证书已经过期请按照第3.4节的方式手动删证书重建不要指望升级动作本身会修复已过期的证书。另外升级前先备份证书目录sudo cp -r /var/lib/rancher/k3s/server/tls /var/lib/rancher/k3s/server/tls.bak.$(date %F)这条命令在排查证书相关问题时几乎是保命级别的操作。出现任何意外直接恢复目录再重启服务即可。4.4 证书检查命令脚本化自己的巡检脚本怎么写既然官方命令覆盖不全我写了一个简单的巡检脚本思路大家可以直接拓展开使用#!/bin/bash CERT_DIR/var/lib/rancher/k3s/server/tls for cert_file in $CERT_DIR/*controller*.crt $CERT_DIR/*scheduler*.crt; do if [ -f $cert_file ]; then end_date$(openssl x509 -enddate -noout -in $cert_file | cut -d -f2) echo $cert_file 过期时间: $end_date fi done这个脚本只做一件事把所有可能的controller和scheduler证书全部列出来逐一解析过期时间。如果你用的不是K3s标准路径把CERT_DIR换成实际路径即可。想更进一步的话可以加上剩余天数判断和告警逻辑。用openssl x509 -checkend可以检测证书是否在指定天数内过期if openssl x509 -checkend 86400 -noout -in $cert_file; then echo OK: $cert_file 剩余时间大于24小时 else echo WARN: $cert_file 将在24小时内过期或已经过期 fi把这段逻辑放到cron里每天跑一次输出到日志再配合监控告警就能填补官方命令的检查盲区。4.5 常见问题速查表问题现象可能原因处理动作certificate check输出无controller-manager条目版本早于2025年5月命令尚未覆盖用openssl手动核验并升级版本证书已过期但集群正常长期连接未重建主动重启组件或等待滚动重启前介入处理删除证书后重启Pod还是CrashLoopBackOffkey文件未删除导致证书未重新生成同时删除crt和key再重启服务证书剩余时间未知命令无提醒默认检查命令不包含动态轮转信息编写自定义巡检脚本或集成外部证书监控5. 最后的经验总结与个人建议在我日常处理过的集群问题里证书类问题虽然占比不算最高但一旦发生往往是牵一发动全身的。这次发现的certificate check覆盖盲区本质上是个工具滞后于架构演进的问题。K3s和RKE2把controller-manager、scheduler的证书独立出来初衷是为了安全和模块化但巡检命令没跟上导致运维侧少了一双眼睛。我个人的建议是不要只依赖发行版自带的检查命令作为唯一巡检手段。无论你用的是K3s还是RKE2都把第4.4节里的脚本集成到你的日常巡检流程里花不了几分钟但能在关键时刻救你一把。另外关注上游版本的更新日志如果修复补丁发布了尽早评估升级毕竟命令行功能完善之后巡检路径会短很多。最后再分享一个小技巧做证书巡检时多留一个心眼不光看过期时间还要看签发者。如果发现证书的签发者突然变成未知CA那比过期更值得警惕因为可能是证书被异常替换。运维的功夫往往就在这些细节里。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑