bigywater.tech
Kubernetes · 99

kubeadm 证书:控制平面的 PKI 与有效期

kubeadm 集群里有哪些证书、各自多久过期?apiserver 的证书里写了什么?admin.conf 和 super-admin.conf 差在哪?续期之后要不要重启 apiserver?这篇在控制面节点里用 openssl 逐张读证书,再真的续一次期并观察 apiserver 对外出示的证书。

364d / 9y
叶子证书与 CA 在 kubeadm 默认配置下的剩余有效期
O=system:masters
super-admin.conf 的证书组——绕过 RBAC;admin.conf 是 O=kubeadm:cluster-admins
0.1 秒
kubeadm certs renew apiserver 之后,不重启 apiserver 就对外出示新证书所用的时间

有哪些证书

实测 · 本机执行输出
  /etc/kubernetes/pki/:apiserver-etcd-client.crt apiserver-etcd-client.key apiserver-kubelet-client.crt apiserver-kubelet-client.key apiserver.crt apiserver.key ca.crt ca.key etcd front-proxy-ca.crt front-proxy-ca.key front-proxy-client.crt front-proxy-client.key sa.key sa.pub
  /etc/kubernetes/pki/etcd/:ca.crt ca.key healthcheck-client.crt healthcheck-client.key peer.crt peer.key server.crt server.key
  /etc/kubernetes/*.conf:admin.conf controller-manager.conf kubelet.conf scheduler.conf super-admin.conf
  kubeadm certs check-expiration:
    CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
    admin.conf                 Oct 10, 2027 08:03 UTC   364d            ca                      no
    apiserver                  Oct 10, 2027 18:01 UTC   364d            ca                      no
    apiserver-etcd-client      Oct 10, 2027 08:03 UTC   364d            etcd-ca                 no
    apiserver-kubelet-client   Oct 10, 2027 08:03 UTC   364d            ca                      no
    controller-manager.conf    Oct 10, 2027 08:03 UTC   364d            ca                      no
    etcd-healthcheck-client    Oct 10, 2027 08:03 UTC   364d            etcd-ca                 no
    etcd-peer                  Oct 10, 2027 08:03 UTC   364d            etcd-ca                 no
    etcd-server                Oct 10, 2027 08:03 UTC   364d            etcd-ca                 no
    front-proxy-client         Oct 10, 2027 08:03 UTC   364d            front-proxy-ca          no
    scheduler.conf             Oct 10, 2027 08:03 UTC   364d            ca                      no
    super-admin.conf           Oct 10, 2027 08:03 UTC   364d            ca                      no
    CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
    ca                      Oct 07, 2036 08:03 UTC   9y              no
    etcd-ca                 Oct 07, 2036 08:03 UTC   9y              no
    front-proxy-ca          Oct 07, 2036 08:03 UTC   9y              no

控制面节点 /etc/kubernetes/pki 下有 ca、etcd/ca、front-proxy-ca 三套 CA 和各组件证书;/etc/kubernetes/ 下的 admin.conf、super-admin.conf、controller-manager.conf、scheduler.conf、kubelet.conf 把客户端证书内嵌在里面。kubeadm certs check-expiration:11 张叶子证书都是 364 天后过期(Oct 10, 2027),3 个 CA 是 9 年(Oct 07, 2036),EXTERNALLY MANAGED 全是 no。

证书里写了什么

实测 · 本机执行输出
  subject=subject=CN=kube-apiserver;issuer=issuer=CN=kubernetes
  有效期:notBefore=Oct 10 17:56:11 2026 GMT;notAfter=Oct 10 18:01:11 2027 GMT(共 365 天)
  SAN:DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, DNS:kx-main-control-plane, DNS:localhost, IP Address:10.96.0.1, IP Address:172.18.0.3, IP Address:127.0.0.1
  用途:TLS Web Server Authentication;CA 证书 ca.crt 的有效期:notAfter=Oct  7 08:03:13 2036 GMT
  apiserver-kubelet-client:subject=subject=CN=kube-apiserver-kubelet-client;issuer=issuer=CN=kubernetes
  apiserver-etcd-client:subject=subject=CN=kube-apiserver-etcd-client;issuer=issuer=CN=etcd-ca
  etcd server:subject=subject=CN=kx-main-control-plane;issuer=issuer=CN=etcd-ca
  admin.conf 内嵌的客户端证书:subject=O=kubeadm:cluster-admins, CN=kubernetes-admin;super-admin.conf:subject=O=system:masters, CN=kubernetes-super-admin
  controller-manager.conf:subject=CN=system:kube-controller-manager;scheduler.conf:subject=CN=system:kube-scheduler

apiserver.crt:subject CN=kube-apiserver,issuer CN=kubernetes,有效期 365 天,SAN 有 kubernetes、kubernetes.default、kubernetes.default.svc、kubernetes.default.svc.cluster.local、kx-main-control-plane、localhost、10.96.0.1、172.18.0.3、127.0.0.1,用途是 TLS Web Server Authentication。客户端证书的 subject 就是身份:admin.conf 是 O=kubeadm:cluster-admins, CN=kubernetes-admin(靠 RBAC 绑定 cluster-admin),super-admin.conf 是 O=system:masters, CN=kubernetes-super-admin(system:masters 组绕过 RBAC),controller-manager、scheduler 分别是 CN=system:kube-controller-manager、CN=system:kube-scheduler。

kubelet 的证书

实测 · 本机执行输出
  /var/lib/kubelet/pki/:kubelet-client-2026-10-10-08-03-14.pem kubelet-client-current.pem kubelet.crt kubelet.key
  kubelet-client-current.pem 指向:/var/lib/kubelet/pki/kubelet-client-2026-10-10-08-03-14.pem;subject=subject=O=system:nodes, CN=system:node:kx-main-control-plane;notAfter=Oct 10 08:03:13 2027 GMT
  kubelet.crt(serving):issuer=issuer=CN=kx-main-control-plane-ca@1791619394(自签,不是集群 CA 签的);kubelet 配置 rotateCertificates=rotateCertificates: true;serverTLSBootstrap=未设置

/var/lib/kubelet/pki/ 下 kubelet-client-current.pem 是符号链接,指向带时间戳的 kubelet-client-2026-10-10-08-03-14.pem,subject 是 O=system:nodes, CN=system:node:kx-main-control-plane;配置里 rotateCertificates: true,到期前会自动轮转(靠 CSR,见 k21)。kubelet.crt(10250 端口的服务证书)是自签的,issuer 是 kx-main-control-plane-ca@…,不是集群 CA 签的;serverTLSBootstrap 没设置。

续期要重启吗

实测 · 本机执行输出
  renew 前:文件里 serial=3EA9911F6D50D107 notBefore=Oct 10 17:56:11 2026 GMT;apiserver 实际出示 serial=3EA9911F6D50D107 notBefore=Oct 10 17:56:11 2026 GMT;apiserver 容器启动时间 2026-10-10T18:01:12
  kubeadm certs renew apiserver:certificate for serving the Kubernetes API renewed
  renew 后马上读文件:serial=5A98A8B813D8C969 notBefore=Oct 10 17:56:32 2026 GMT
  不重启 apiserver,0.1 秒后它出示的证书就变成了新的:serial=5A98A8B813D8C969 notBefore=Oct 10 17:56:32 2026 GMT;容器没有重启(同一个容器 True,启动时间仍是 2026-10-10T18:01:12)
  kubeadm certs check-expiration 里 apiserver 一行:apiserver                  Oct 10, 2027 18:01 UTC   364d            ca                      no(它读的是磁盘上的文件)
  kubectl 访问正常:ok

kubeadm certs renew apiserver 后,磁盘上的 apiserver.crt 立刻变成新的(serial 从 3EA9911F6D50D107 变为 5A98A8B813D8C969;notBefore 比当前时间早 5 分钟,这是 kubeadm 为容忍时钟偏差回拨的)。不重启 apiserver,0.1 秒就发现它对外出示的证书已经是新的——容器没有重启(同一个容器,启动时间不变),说明 apiserver 会自动重新加载服务证书文件。kubeadm certs check-expiration 里 apiserver 一行随之变成 Oct 10, 2027 18:01 UTC;它读的是磁盘文件,不是进程里的状态。

分步演示

kubeadm 证书
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / kind(Docker 里的单节点或多节点真实集群,节点是 Docker Desktop 虚拟机里的容器)/ kubectl;用空的 kubeconfig 之外的独立 kubeconfig,不碰用户自己的集群;计时用 date +%s%N / kubectl 事件时间戳,数字每次运行会有小幅抖动。三节点 kind 集群 kx-main(Kubernetes v1.37.0,kubeadm 创建)的控制面节点,用 docker exec 运行 kubeadm certs check-expiration 与 openssl;apiserver 出示的证书用 openssl s_client 连 127.0.0.1:6443 取得;只续了 apiserver 这一张(其余证书保持原状);“0.1 秒”是第一次轮询时就已经一致,实际切换时间不会超过这个量级;每种情形各一次
    • 没有验证:apiserver-etcd-client / apiserver-kubelet-client 等客户端证书是否也能热加载;kubeadm certs renew all 后 controller-manager、scheduler 是否需要重启(它们的证书内嵌在 .conf 里);外部 CA 模式;过期后的恢复流程;kubeadm upgrade 自动续期;多控制面节点上逐个续期;证书到期前 kubelet 的告警;serverTLSBootstrap 开启后的 CSR 审批
    京ICP备2026067502号-1京公网安备11010502063487号