找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2393

积分

0

好友

317

主题
发表于 1 小时前 | 查看: 1| 回复: 0

在 Kubernetes 集群的日常维护中,证书管理是一个不容忽视的关键环节。尤其是对于使用 kubeadm 工具部署的集群,其内置的证书机制有着明确的有效期限制。一旦证书过期,整个集群的通信与管控将陷入瘫痪。本文将深入解析 Kubernetes 的证书体系,手把手教你如何查看、续期证书,并探讨如何从源头设置“长期有效”的证书,避免未来可能出现的运维故障。

Kubernetes证书机制概览

默认情况下,kubeadm 部署的集群证书通常存放在 /etc/kubernetes/pki/ 路径下。这些证书主要分为两大类:服务器证书和客户端证书,共同构成了集群内部安全通信的基石。

参考官方文档:https://kubernetes.io/zh-cn/docs/setup/best-practices/certificates/

Kubernetes CA证书体系结构图

服务器证书

  • API 服务器端点的证书

    [root@k8s-master01 ~]# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text|head
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 3723707841031249294 (0x33ad448d68011d8e)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = kubernetes
        Validity
            Not Before: Mar 17 12:11:04 2026 GMT
            Not After : Mar 17 12:16:04 2027 GMT
        Subject: CN = kube-apiserver
  • etcd 服务器的服务器证书

    [root@k8s-master01 ~]# openssl x509 -in /etc/kubernetes/pki/etcd/ca.crt -text|head
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 3081390123443469926 (0x2ac34bfdca3ebe66)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = etcd-ca
        Validity
            Not Before: Sep 27 07:35:28 2025 GMT
            Not After : Sep 25 07:40:28 2035 GMT
        Subject: CN = etcd-ca
  • 每个 kubelet 的服务器证书(每个节点运行一个 kubelet)

    [root@k8s-master01 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -text |head
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 112909339695175473 (0x19122723c5ad731)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = k8s-master01.dinginx.org-ca@1758958833
        Validity
            Not Before: Sep 27 06:40:33 2025 GMT
            Not After : Sep 27 06:40:33 2026 GMT
        Subject: CN = k8s-master01.dinginx.org@1758958833
  • 可选的前端代理的服务器证书

    [root@k8s-master01 ~]# openssl x509 -in /etc/kubernetes/pki/front-proxy-ca.crt -text|head
    Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 6133933849525219158 (0x55201c5650b1ef56)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = front-proxy-ca
        Validity
            Not Before: Sep 27 07:35:28 2025 GMT
            Not After : Sep 25 07:40:28 2035 GMT
        Subject: CN = front-proxy-ca

客户端证书

  • 针对每个 kubelet 的客户端证书,用于 API 服务器作为 Kubernetes API 的客户端进行身份验证
  • 每个 API 服务器的客户端证书,用于向 etcd 进行身份验证
  • 控制器管理器与 API 服务器进行安全通信的客户端证书
  • 调度程序与 API 服务器进行安全通信的客户端证书
  • 客户端证书(每个节点一个),用于 kube-proxy 向 API 服务器进行身份验证
  • 集群管理员向 API 服务器进行身份验证的可选客户端证书
  • 前端代理的可选客户端证书

举例说明

如果你是kubeadm部署的集群,证书会自动生成。以下是根CA的路径和信息示例:

# 存放路径
[root@k8s-master01 ~]# cat /etc/kubernetes/pki/
apiserver-etcd-client.crt     apiserver-kubelet-client.key  ca.crt                        front-proxy-ca.crt            front-proxy-client.key
apiserver-etcd-client.key     apiserver.crt                 ca.key                        front-proxy-ca.key            sa.key
apiserver-kubelet-client.crt  apiserver.key                 etcd/                         front-proxy-client.crt        sa.pub
[root@k8s-master01 ~]# ls /etc/kubernetes/pki/ca.crt

# 查看详细信息,默认有效期十年
[root@k8s-master01 ~]# openssl x509 -in /etc/kubernetes/pki/ca.crt -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 7010362768650409617 (0x6149cfcbac081691)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = kubernetes
        Validity
            Not Before: Sep 27 07:35:28 2025 GMT
            Not After : Sep 25 07:40:28 2035 GMT
        Subject: CN = kubernetes
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:e2:62:6d:e6:9b:a4:9a:dd:fa:c2:1e:87:ab:6c:
                    ad:da:2c:b2:ad:c4:ea:8b:f4:6c:0c:47:13:ce:7e:
                    14:a7:3c:12:d5:b6:ef:38:61:60:66:28:b2:8e:a8:
                    95:15:cb:77:a9:83:48:fb:cc:64:67:87:3a:41:a4:
                    3d:cb:3a:e2:7b:f2:98:7f:3b:f1:b8:3a:20:24:56:
                    3c:9f:9f:21:26:04:b5:b0:48:f2:2a:2d:2c:41:b6:
                    41:c9:4d:0c:90:c3:4a:8b:40:82:26:03:50:de:55:
                    35:fe:a2:f2:0c:27:df:e9:5e:dd:37:aa:33:1c:4c:
                    87:d1:89:1e:b3:86:3e:97:7c:20:de:ef:5e:fb:78:
                    93:79:37:80:ea:bf:c7:f6:ad:da:19:bc:c2:58:3c:
                    ea:44:bf:97:c1:15:85:8b:e0:2c:56:0c:55:92:f4:
                    40:97:67:02:04:7a:02:76:29:d0:3b:70:30:cb:68:
                    99:57:1b:05:d6:b1:2a:de:0a:1e:b6:51:f2:90:f1:
                    0a:e5:0e:f1:0d:a0:61:5c:52:7f:04:dc:4d:c4:78:
                    42:1e:74:7a:b1:1e:92:58:5a:80:11:2c:90:d2:61:
                    c5:cd:83:df:88:a8:4d:27:f1:86:39:9c:7f:4c:f6:
                    5c:98:fa:14:0b:70:00:0e:31:99:3c:bf:2e:59:5c:
                    12:6b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Certificate Sign
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Key Identifier:
                01:AD:FF:24:AA:29:29:D8:66:DE:95:6D:31:6B:0D:CD:34:FC:49:D1
            X509v3 Subject Alternative Name:
                DNS:kubernetes
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        7d:1b:15:45:c5:2e:08:e2:50:e4:19:de:ff:af:e2:53:21:d3:
        4b:12:79:f9:1a:0d:88:a9:e9:fc:bf:56:74:29:26:06:46:0b:
        4b:3a:74:ce:9e:8f:2f:2c:d3:5e:eb:11:84:e0:ab:c5:70:be:
        82:1d:56:7a:ec:ae:16:1f:71:d6:47:a5:30:c9:49:59:a4:c5:
        ab:37:bc:04:7b:31:43:b9:b2:65:ee:d9:b4:f7:d4:59:c0:c1:
        be:81:fb:c3:9f:c2:de:58:27:b0:37:fb:fa:5e:44:b0:bb:2e:
        ee:76:c2:70:b5:30:f6:5e:09:46:22:b6:8a:0c:a1:98:23:0e:
        6f:bb:91:23:18:0c:fb:56:a4:9f:af:bd:12:96:ad:82:d9:19:
        e2:62:71:db:9e:4b:89:93:43:c3:a1:6c:e6:c0:24:c3:3a:73:
        4f:aa:e3:5d:57:13:98:07:e4:2b:aa:05:5c:01:22:3c:6d:4f:
        1a:54:ad:ec:99:2d:cd:9e:04:bf:b4:41:ed:fe:51:a6:64:14:
        11:f8:9e:62:34:22:72:fa:07:20:74:5e:12:b9:31:6f:31:a7:
        12:a2:19:5a:a5:94:ce:4c:ec:80:53:37:8d:eb:85:38:9b:be:
        d1:96:6b:c1:5c:b9:b1:65:2e:54:39:d5:0f:cb:94:e7:2b:4a:
        6a:c2:10:6d
-----BEGIN CERTIFICATE-----
MIIDBTCCAe2gAwIBAgIIYUnPy6wIFpEwDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE
AxMKa3ViZXJuZXRlczAeFw0yNTA5MjcwNzM1MjhaFw0zNTA5MjUwNzQwMjhaMBUx
EzARBgNVBAMTCmt1YmVybmV0ZXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
AoIBAQDiYm3mm6Sa3frCHoerbK3aLLKtxOqL9GwMRxPOfhSnPBLVtu84YWBmKLKO
qJUVy3epg0j7zGRnhzpBpD3LOuJ78ph/O/G4OiAkVjyfnyEmBLWwSPIqLSxBtkHJ
TQyQw0qLQIImA1DeVTX+ovIMJ9/pXt03qjMcTIfRiR6zhj6XfCDe7177eJN5N4Dq
v8f2rdoZvMJYPOpEv5fBFYWL4CxWDFWS9ECXZwIEegJ2KdA7cDDLaJlXGwXWsSre
Ch62UfKQ8QrlDvENoGFcUn8E3E3EeEIedHqxHpJYWoARLJDSYcXNg9+IqE0n8YY5
nH9M9lyY+hQLcAAOMZk8vy5ZXBJrAgMBAAGjWTBXMA4GA1UdDwEB/wQEAwICpDAP
BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQBrf8kqikp2GbelW0xaw3NNPxJ0TAV
BgNVHREEDjAMggprdWJlcm5ldGVzMA0GCSqGSIb3DQEBCwUAA4IBAQB9GxVFxS4I
4lDkGd7/r+JTIdNLEnn5Gg2Iqen8v1Z0KSYGRgtLOnTOno8vLNNe6xGE4KvFcL6C
HVZ67K4WH3HWR6UwyUlZpMWrN7wEezFDubJl7tm099RZwMG+gfvDn8LeWCewN/v6
XkSwuy7udsJwtTD2XglGIraKDKGYIw5vu5EjGAz7VqSfr70Slq2C2RniYnHbnkuJ
k0PDoWzmwCTDOnNPquNdVxOYB+QrqcVcASI8bU8aVK3smS3NngS/tEHt/lGmZBQR
+J5iNCJy+gcgdF4SuTFvMacSohlapZTOTOyAUzeN64U4m77RlmvBXLmxZS5UOdUP
y5TnK0pqwhBt
-----END CERTIFICATE-----

Kubernetes证书续期实战

基于kubeadm安装的k8s集群,默认的根CA有效期为10年,而各个核心组件使用的证书有效期仅为1年。因此,定期检查并续期证书是保障集群稳定运行的必要操作。

查看证书有效期

第一步永远是确认证书状态。使用 kubeadm certs check-expiration 命令可以清晰列出所有证书的过期时间。

# 查看证书有效期
[root@k8s-master01 ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file' to re-upload it.

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Mar 17, 2027 12:16 UTC   363d            ca                      no
apiserver                  Mar 17, 2027 12:16 UTC   363d            ca                      no
apiserver-etcd-client      Mar 17, 2027 12:16 UTC   363d            etcd-ca                 no
apiserver-kubelet-client   Mar 17, 2027 12:16 UTC   363d            ca                      no
controller-manager.conf    Mar 17, 2027 12:16 UTC   363d            ca                      no
etcd-healthcheck-client    Mar 17, 2027 12:16 UTC   363d            etcd-ca                 no
etcd-peer                  Mar 17, 2027 12:16 UTC   363d            etcd-ca                 no
etcd-server                Mar 17, 2027 12:16 UTC   363d            etcd-ca                 no
front-proxy-client         Mar 17, 2027 12:16 UTC   363d            front-proxy-ca          no
scheduler.conf             Mar 17, 2027 12:16 UTC   363d            ca                      no
super-admin.conf           Mar 17, 2027 12:16 UTC   363d            ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Sep 25, 2035 07:40 UTC   9y              no
etcd-ca                 Sep 25, 2035 07:40 UTC   9y              no
front-proxy-ca          Sep 25, 2035 07:40 UTC   9y              no

## 这里因集群是25年创建的,故根ca至2035年到期;

集群证书即将过期时的续约操作

当发现证书剩余时间不足时(例如少于90天),应及时进行续期。kubeadm certs renew 命令是专门用于此任务的工具。

# 采用kubeadm certs renew自定续期一年
[root@k8s-master01 ~]# kubeadm certs renew -h
Renew certificates for a Kubernetes cluster

Usage:
  kubeadm certs renew [flags]
  kubeadm certs renew [command]

Available Commands:
  admin.conf               Renew the certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself
  all                      Renew all available certificates
  apiserver                Renew the certificate for serving the Kubernetes API
  apiserver-etcd-client    Renew the certificate the apiserver uses to access etcd
  apiserver-kubelet-client Renew the certificate for the API server to connect to kubelet
  controller-manager.conf  Renew the certificate embedded in the kubeconfig file for the controller manager to use
  etcd-healthcheck-client  Renew the certificate for liveness probes to healthcheck etcd
  etcd-peer                Renew the certificate for etcd nodes to communicate with each other
  etcd-server              Renew the certificate for serving etcd
  front-proxy-client       Renew the certificate for the front proxy client
  scheduler.conf           Renew the certificate embedded in the kubeconfig file for the scheduler manager to use
  super-admin.conf         Renew the certificate embedded in the kubeconfig file for the super-admin

Flags:
  -h, --help   help for renew

Global Flags:
      --rootfs string        The path to the 'real' host root filesystem. This will cause kubeadm to chroot into the provided path.
  -v, --v Level              number for the log level verbosity
      --vmodule moduleSpec   comma-separated list of pattern=N settings for file-filtered logging

Use "kubeadm certs renew [command] --help" for more information about a command.
error:
error: subcommand is required
To see the stack trace of this error execute with --v=5 or higher

## 这里可以指定要更新的证书,我们这里直接选择all

更新证书并生效

续期操作完成后,必须重启相关组件才能让新证书生效。

# 执行更新指令,签发所有文件的证书
## 如果是多节点高可用集群需在所有的控制平面执行
[root@k8s-master01 ~]# kubeadm certs renew all
[renew] Reading configuration from the “kubeadm-config” ConfigMap in namespace “kube-system”...
[renew] Use 'kubeadm init phase upload-config kubeadm --config your-config-file’ to re-upload it.

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
certificate embedded in the kubeconfig file for the super-admin renewed

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

## 这里显示证书自动更新完成,需要重启kube-apiserver, kube-controller-manager, kube-scheduler, etcd的pod资源才会生效。
## 上述操作不会续签kubelet证书,一般也无需手动续签,在到期前30-120内会自动出发续签的机制自动续签;
## 如果kubelet需要手动更新,
[root@k8s-master01 ~]# kubeadm init --kubernetes-version=v1.35.0 phase kubeconfig all

# 检查证书有效期
[root@k8s-master01 ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the “kubeadm-config” ConfigMap in namespace “kube-system”...
[check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file’ to re-upload it.

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Mar 19, 2027 11:58 UTC   364d            ca                      no
apiserver                  Mar 19, 2027 11:58 UTC   364d            ca                      no
apiserver-etcd-client      Mar 19, 2027 11:58 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Mar 19, 2027 11:58 UTC   364d            ca                      no
controller-manager.conf    Mar 19, 2027 11:58 UTC   364d            ca                      no
etcd-healthcheck-client    Mar 19, 2027 11:58 UTC   364d            etcd-ca                 no
etcd-peer                  Mar 19, 2027 11:58 UTC   364d            etcd-ca                 no
etcd-server                Mar 19, 2027 11:58 UTC   364d            etcd-ca                 no
front-proxy-client         Mar 19, 2027 11:58 UTC   364d            front-proxy-ca          no
scheduler.conf             Mar 19, 2027 11:58 UTC   364d            ca                      no
super-admin.conf           Mar 19, 2027 11:58 UTC   364d            ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Sep 25, 2035 07:40 UTC   9y              no
etcd-ca                 Sep 25, 2035 07:40 UTC   9y              no
front-proxy-ca          Sep 25, 2035 07:40 UTC   9y              no

# 重启资源,实质就是删除资源等待自动创建即可;生产环境建议选择空闲时段进行更新,
[root@k8s-master01 ~]# kubectl delete pods  -n kube-system -l ‘component in (kube-apiserver,kube-controller-manager,kube-scheduler,etcd)’ --grace-period=0
pod “etcd-k8s-master01.dinginx.org” deleted from kube-system namespace
pod “kube-apiserver-k8s-master01.dinginx.org” deleted from kube-system namespace
pod “kube-controller-manager-k8s-master01.dinginx.org” deleted from kube-system namespace
pod “kube-scheduler-k8s-master01.dinginx.org” deleted from kube-system namespace
# 查看组件状态
[root@k8s-master01 ~]#  kubectl get pods -n kube-system -l ‘component in (kube-apiserver,kube-controller-manager,kube-scheduler,etcd)’
NAME                                             READY   STATUS    RESTARTS         AGE
etcd-k8s-master01.dinginx.org                    1/1     Running   12 (6d13h ago)   53s
kube-apiserver-k8s-master01.dinginx.org          1/1     Running   6 (6d13h ago)    53s
kube-controller-manager-k8s-master01.dinginx.org 1/1     Running   1 (2d18h ago)    53s
kube-scheduler-k8s-master01.dinginx.org          1/1     Running   69 (4d11h ago)   53s

# 更新授权.kube/config文件
[root@k8s-master01 ~]# ll /etc/kubernetes/admin.conf
-rw------- 1 root root 5647 Mar 22 11:28 /etc/kubernetes/admin.conf
[root@k8s-master01 ~]# ls .kube/config -hl
-rw------- 1 root root 5.6K Mar 17 23:43 .kube/config
## 更新证书
[root@k8s-master01 ~]# cp /etc/kubernetes/admin.conf .kube/config
## 验证
[root@k8s-master01 ~]# ls .kube/config -hl
-rw------- 1 root root 5.6K Mar 22 11:29 .kube/config

集群证书已过期时的紧急续约

如果因为疏忽导致证书已经过期,集群将无法访问。这时需要一套略有不同的恢复流程。

模拟故障

首先,我们通过修改系统时间来模拟证书过期的场景。

# 步骤和续约类似,但是证书kubeadm certs renew之后只会更新证书,kubelet客户端证书不会更新
# 修改系统时间模拟故障
[root@k8s-master01 ~]# date -s '2027-4-29 12:59:20'
Thu Apr 29 12:59:20 CST 2027
[root@k8s-master01 ~]# date
Thu Apr 29 12:59:22 CST 2027
## 验证无法访问资源
[root@k8s-master01 ~]# kubectl get pods
E0429 12:59:45.948061  802272 memcache.go:265] "Unhandled Error" err="couldn’t get current server API group list: Get \"https://kubeapi.dinginx.org:6443/api?timeout=32s\": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38Z"
E0429 12:59:45.951098  802272 memcache.go:265] "Unhandled Error" err="couldn’t get current server API group list: Get \"https://kubeapi.dinginx.org:6443/api?timeout=32s\": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38Z"
E0429 12:59:45.954372  802272 memcache.go:265] "Unhandled Error" err="couldn’t get current server API group list: Get \"https://kubeapi.dinginx.org:6443/api?timeout=32s\": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38Z"
E0429 12:59:45.958004  802272 memcache.go:265] "Unhandled Error" err="couldn’t get current server API group list: Get \"https://kubeapi.dinginx.org:6443/api?timeout=32s\": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38Z"
E0429 12:59:45.960758  802272 memcache.go:265] "Unhandled Error" err="couldn’t get current server API group list: Get \"https://kubeapi.dinginx.org:6443/api?timeout=32s\": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38Z"
Unable to connect to the server: tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2027-04-29T12:59:45+08:00 is after 2027-03-22T03:28:38
查看证书信息

此时,kubeadm certs check-expiration 命令会显示证书已失效。

[check-expiration] Error reading configuration from the Cluster. Falling back to default configuration

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Mar 22, 2027 03:28 UTC   <invalid>       ca                      no
apiserver                  Mar 22, 2027 03:28 UTC   <invalid>       ca                      no
apiserver-etcd-client      Mar 22, 2027 03:28 UTC   <invalid>       etcd-ca                 no
apiserver-kubelet-client   Mar 22, 2027 03:28 UTC   <invalid>       ca                      no
controller-manager.conf    Mar 22, 2027 03:28 UTC   <invalid>       ca                      no
etcd-healthcheck-client    Mar 22, 2027 03:28 UTC   <invalid>       etcd-ca                 no
etcd-peer                  Mar 22, 2027 03:28 UTC   <invalid>       etcd-ca                 no
etcd-server                Mar 22, 2027 03:28 UTC   <invalid>       etcd-ca                 no
front-proxy-client         Mar 22, 2027 03:28 UTC   <invalid>       front-proxy-ca          no
scheduler.conf             Mar 22, 2027 03:28 UTC   <invalid>       ca                      no
super-admin.conf           Mar 22, 2027 03:28 UTC   <invalid>       ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Sep 25, 2035 07:40 UTC   8y              no
etcd-ca                 Sep 25, 2035 07:40 UTC   8y              no
front-proxy-ca          Sep 25, 2035 07:40 UTC   8y              no
续签证书

证书虽过期,但只要根CA未过期,我们仍然可以使用 kubeadm certs renew 命令强制续签。

# 更新所有证书
[root@k8s-master01 ~]# kubeadm certs renew all
[renew] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[renew] Use 'kubeadm init phase upload-config kubeadm --config your-config-file' to re-upload it.
[renew] Error reading configuration from the Cluster. Falling back to default configuration

certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
certificate for serving the Kubernetes API renewed
certificate the apiserver uses to access etcd renewed
certificate for the API server to connect to kubelet renewed
certificate embedded in the kubeconfig file for the controller manager to use renewed
certificate for liveness probes to healthcheck etcd renewed
certificate for etcd nodes to communicate with each other renewed
certificate for serving etcd renewed
certificate for the front proxy client renewed
certificate embedded in the kubeconfig file for the scheduler manager to use renewed
certificate embedded in the kubeconfig file for the super-admin renewed

Done renewing certificates. You must restart the kube-apiserver, kube-controller-manager, kube-scheduler and etcd, so that they can use the new certificates.

# 验证证书已更新
[root@k8s-master01 ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the "kubeadm-config" ConfigMap in namespace "kube-system"...
[check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file' to re-upload it.

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Apr 28, 2028 05:04 UTC   364d            ca                      no
apiserver                  Apr 28, 2028 05:04 UTC   364d            ca                      no
apiserver-etcd-client      Apr 28, 2028 05:04 UTC   364d            etcd-ca                 no
apiserver-kubelet-client   Apr 28, 2028 05:04 UTC   364d            ca                      no
controller-manager.conf    Apr 28, 2028 05:04 UTC   364d            ca                      no
etcd-healthcheck-client    Apr 28, 2028 05:04 UTC   364d            etcd-ca                 no
etcd-peer                  Apr 28, 2028 05:04 UTC   364d            etcd-ca                 no
etcd-server                Apr 28, 2028 05:04 UTC   364d            etcd-ca                 no
front-proxy-client         Apr 28, 2028 05:04 UTC   364d            front-proxy-ca          no
scheduler.conf             Apr 28, 2028 05:04 UTC   364d            ca                      no
super-admin.conf           Apr 28, 2028 05:04 UTC   364d            ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Sep 25, 2035 07:40 UTC   8y              no
etcd-ca                 Sep 25, 2035 07:40 UTC   8y              no
front-proxy-ca          Sep 25, 2035 07:40 UTC   8y              no

#此操作不会更新 kubelet 证书,会导致集群状态 NotReady ,节点 kubelet.services 状态异常,需手动更新
[root@k8s-master01 ~]# kubectl get nodes
NAME                       STATUS     ROLES           AGE    VERSION
k8s-master01.dinginx.org   Ready      control-plane   578d   v1.35.0
k8s-node01.dinginx.org     NotReady   <none>          578d   v1.35.0
k8s-node02.dinginx.org     NotReady   <none>          578d   v1.35.0
k8s-node03.dinginx.org     NotReady   <none>          415d   v1.35.0
手动更新kubelet证书(关键步骤)

如输出所示,kubeadm certs renew 不会自动更新各个节点上的kubelet客户端证书,这会导致工作节点状态变为 NotReady。这是一项典型的运维故障处理任务,需要手动介入。

# 查看kubelet证书
[root@k8s-master01 ~]# ls /etc/kubernetes/kubelet.conf -hl
-rw------- 1 root root 2.0K Sep 27  2025 /etc/kubernetes/kubelet.conf
[root@k8s-master01 ~]# cat /etc/kubernetes/kubelet.conf
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWVVuUHk2d0lGcEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBNU1qY3dOek0xTWpoYUZ3MHpOVEE1TWpVd056UXdNamhhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURpWW0zbW02U2EzZnJDSG9lcmJLM2FMTEt0eE9xTDlHd01SeFBPZmhTblBCTFZ0dTg0WVdCbUtMS08KcUpVVnkzZXBnMGo3ekdSbmh6cEJwRDNMT3VKNzhwaC9PL0c0T2lBa1ZqeWZueUVtQkxXd1NQSXFMU3hCdGtISgpUUXlRdzBxTFFJSW1BMURlVlRYK292SU1KOS9wWHQwM3FqTWNUSWZSaVI2emhqNlhmQ0RlNzE3N2VKTjVONERxCnY4ZjJyZG9adk1KWVBPcEV2NWZCRllXTDRDeFdERldTOUVDWFp3SUVlZ0oyS2RBN2NERExhSmxYR3dYV3NTcmUKQ2g2MlVmS1E4UXJsRHZFTm9HRmNVbjhFM0UzRWVFSWVkSHF4SHBKWVdvQVJMSkRTWWNYTmc5K0lxRTBuOFlZNQpuSDlNOWx5WStoUUxjQUFPTVprOHZ5NVpYQkpyQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRQnJmOGtxaWtwMkdiZWxXMHhhdzNOTlB4SjBUQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQjlHeFZGeFM0SQo0bERrR2Q3L3IrSlRJZE5MRW5uNUdnMklxZW44djFaMEtTWUdSZ3RMT25UT25vOHZMTk5lNhhHRTRLdkZjTDZDCkhWWjY3SzRXSDNIV1I2VXd5VWxacE1Xck43d0VlekZEdWJKbDd0bTA5OVJad01HK2dmdkRuOExlV0Nld04vdjYKWGtTd3V5N3Vkc0p3dFREMlhnbEdJcmFLREtHWUl3NXZ1NUVqR0F6N1ZxU2ZyNzBTbHEyQzJSbmlZbkhibmt1SgprMFBEb1d6bXdDVERPbk5QcXVOZFZ4T1lCK1FycWdWY0FTSThiVThhVkszc21TM05uZ1MvdEVIdC9sR21aQlFSCitKNWlOQ0p5K2djZ2RGNFN1VEZ2TWFjU29obGFwWlRPVE95QVV6ZU42NFU0bTc3UmxtdkJYTG14WlM1VU9kVVAKeTVUbkswcHF3aEJ0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
    server: https://11.0.1.10:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: system:node:k8s-master01.dinginx.org
  name: system:node:k8s-master01.dinginx.org@kubernetes
current-context: system:node:k8s-master01.dinginx.org@kubernetes
kind: Config
users:
- name: system:node:k8s-master01.dinginx.org
  user:
    client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
    client-key: /var/lib/kubelet/pki/kubelet-client-current.pem

# 查看证书认证信息,是有kubernetes CA颁发的证书
[root@k8s-master01 ~]# echo LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCVENDQWUyZ0F3SUJBZ0lJWVVuUHk2d0lGcEV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TlRBNU1qY3dOek0xTWpoYUZ3MHpOVEE1TWpVd056UXdNamhhTUJVeApFekFSQmdOVkJBTVRDbXQxWW1WeWJtVjBaWE13Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLCkFvSUJBUURpWW0zbW02U2EzZnJDSG9lcmJLM2FMTEt0eE9xTDlHd01SeFBPZmhTblBCTFZ0dTg0WVdCbUtMS08KcUpVVnkzZXBnMGo3ekdSbmh6cEJwRDNMT3VKNzhwaC9PL0c4T2lBa1ZqeWZueUVtQkxXd1NQSXFMU3hCdGtISgpUUXlRdzBxTFFJSW1BMURlVlRYK292SU1KOS9wWHQwM3FqTWNUSWZSaVI2emhqNlhmQ0RlNzE3N2VKTjVONERxCnY4ZjJyZG9adk1KWVBPcEV2NWZCRllXTDRDeFdERldTOUVDWFp3SUVlZ0oyS2RBN2NERExhSmxYR3dYV3NTcmUKQ2g2MlVmS1E4UXJsRHZFTm9HRmNVbjhFM0UzRWVFSWVkSHF4SHBKWVdvQVJMSkRTWWNYTmc5K0lxRTBuOFlZNQpuSDlNOWx5WStoUUxjQUFPTVprOHZ5NVpYQkpyQWdNQkFBR2pXVEJYTUE0R0ExVWREd0VCL3dRRUF3SUNwREFQCkJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRQnJmOGtxaWtwMkdiZWxXMHhhdzNOTlB4SjBUQVYKQmdOVkhSRUVEakFNZ2dwcmRXSmxjbTVsZEdWek1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQjlHeFZGeFM0SQo0bERrR2Q3L3IrSlRJZE5MRW5uNUdnMklxZW44djFaMEtTWUdSZ3RMT25UT25vOHZMTk5lNnhHRTRLdkZjTDZDCkhWWjY3SzRXSDNIV1I2VXd5VWxacE1Xck43d0VlekZEdWJKbDd0bTA5OVJad01HK2dmdkRuOExlV0Nld04vdjYKWGtTd3V5N3Vkc0p3dFREMlhnbEdJcmFLREtHWUl3NXZ1NUVqR0F6N1ZxU2ZyNzBTbHEyQzJSbmlZbkhibmt1SgprMFBEb1d6bXdDVERPbk5QcXVOZFZ4T1lCK1FycWdWY0FTSThiVThhVkszc21TM05uZ1MvdEVIdC9sR21aQlFSCitKNWlOQ0p5K2djZ2RGNFN1VEZ2TWFjU29obGFwWlRPVE95QVV6ZU42NFU0bTc3UmxtdkJYTG14WlM1VU9kVVAKeTVUbkswcHF3aEJ0Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K |base64 -d|openssl x509 -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 7010362768650409617 (0x6149cfcbac081691)
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: CN = kubernetes
        Validity
            Not Before: Sep 27 07:35:28 2025 GMT
            Not After : Sep 25 07:40:28 2035 GMT
        Subject: CN = kubernetes
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:e2:62:6d:e6:9b:a4:9a:dd:fa:c2:1e:87:ab:6c:
                    ad:da:2c:b2:ad:c4:ea:8b:f4:6c:0c:47:13:ce:7e:
                    14:a7:3c:12:d5:b6:ef:38:61:60:66:28:b2:8e:a8:
                    95:15:cb:77:a9:83:48:fb:cc:64:67:87:3a:41:a4:
                    3d:cb:3a:e2:7b:f2:98:7f:3b:f1:b8:3a:20:24:56:
                    3c:9f:9f:21:26:04:b5:b0:48:f2:2a:2d:2c:41:b6:
                    41:c9:4d:0c:90:c3:4a:8b:40:82:26:03:50:de:55:
                    35:fe:a2:f2:0c:27:df:e9:5e:dd:37:aa:33:1c:4c:
                    87:d1:89:1e:b3:86:3e:97:7c:20:de:ef:5e:fb:78:
                    93:79:37:80:ea:bf:c7:f6:ad:da:19:bc:c2:58:3c:
                    ea:44:bf:97:c1:15:85:8b:e0:2c:56:0c:55:92:f4:
                    40:97:67:02:04:7a:02:76:29:d0:3b:70:30:cb:68:
                    99:57:1b:05:d6:b1:2a:de:0a:1e:b6:51:f2:90:f1:
                    0a:e5:0e:f1:0d:a0:61:5c:52:7f:04:dc:4d:c4:78:
                    42:1e:74:7a:b1:1e:92:58:5a:80:11:2c:90:d2:61:
                    c5:cd:83:df:88:a8:4d:27:f1:86:39:9c:7f:4c:f6:
                    5c:98:fa:14:0b:70:00:0e:31:99:3c:bf:2e:59:5c:
                    12:6b
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Key Usage: critical
                Digital Signature, Key Encipherment, Certificate Sign
            X509v3 Basic Constraints: critical
                CA:TRUE
            X509v3 Subject Key Identifier:
                01:AD:FF:24:AA:29:29:D8:66:DE:95:6D:31:6B:0D:CD:34:FC:49:D1
            X509v3 Subject Alternative Name:
                DNS:kubernetes
    Signature Algorithm: sha256WithRSAEncryption
    Signature Value:
        7d:1b:15:45:c5:2e:08:e2:50:e4:19:de:ff:af:e2:53:21:d3:
        4b:12:79:f9:1a:0d:88:a9:e9:fc:bf:56:74:29:26:06:46:0b:
        4b:3a:74:ce:9e:8f:2f:2c:d3:5e:eb:11:84:e0:ab:c5:70:be:
        82:1d:56:7a:ec:ae:16:1f:71:d6:47:a5:30:c9:49:59:a4:c5:
        ab:37:bc:04:7b:31:43:b9:b2:65:ee:d9:b4:f7:d4:59:c0:c1:
        be:81:fb:c3:9f:c2:de:58:27:b0:37:fb:fa:5e:44:b0:bb:2e:
        ee:76:c2:70:b5:30:f6:5e:09:46:22:b6:8a:0c:a1:98:23:0e:
        6f:bb:91:23:18:0c:fb:56:a4:9f:af:bd:12:96:ad:82:d9:19:
        e2:62:71:db:9e:4b:89:93:43:c3:a1:6c:e6:c0:24:c3:3a:73:
        4f:aa:e3:5d:57:13:98:07:e4:2b:aa:05:5c:01:22:3c:6d:4f:
        1a:54:ad:ec:99:2d:cd:9e:04:bf:b4:41:ed:fe:51:a6:64:14:
        11:f8:9e:62:34:22:72:fa:07:20:74:5e:12:b9:31:6f:31:a7:
        12:a2:19:5a:a5:94:ce:4c:ec:80:53:37:8d:eb:85:38:9b:be:
        d1:96:6b:c1:5c:b9:b1:65:2e:54:39:d5:0f:cb:94:e7:2b:4a:
        6a:c2:10:6d

# 客户端证书文件及路径,此处创建了软链接
[root@k8s-master01 ~]# ll /var/lib/kubelet/pki/kubelet-client-current.pem
lrwxrwxrwx 1 root root 59 Sep 27  2025 /var/lib/kubelet/pki/kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2025-09-27-15-40-33.pem

# 查看软链接文件
[root@k8s-master01 ~]# cat /var/lib/kubelet/pki/kubelet-client-current.pem
-----BEGIN CERTIFICATE-----
MIIDMzCCAhugAwIBAgIIenB0IC4Ql88wDQYJKoZIhvcNAQELBQAwFTETMBEGA1UE
AxMKa3ViZXJuZXRlczAeFw0yNTA5MjcwNzM1MjhaFw0yNjA5MjcwNzQwMjhaMEYx
FTATBgNVBAoTDHN5c3RlbTpub2RlczEtMCsGA1UEAxMkc3lzdGVtOm5vZGU6azhz
LW1hc3RlcjAxLmRpbmdpbngub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
CgKCAQEAt0Xr1TV2HT2XUhD/nOlpUFVi0U+88jr/bvr8kUJ9/bOGEYyIFnjhtKq0
YcRH+FYJFUAgYR5OVOjq4jaY7LdcGYdImQQQZSIce/Ay8CA/wTjpM3LOJBG/57iD
JSg/AaTr6A1VhthNE+qnOtqEE07E0v7hakXjF41EpKHwneQEf/auKoNaFob1pTjp
inR4qOE5ocXCb8LDvmrnfJY88SKxguubQETtMii7oR2LsNyNHSC+9JUlrGtnPBnA
PBNR0B2W5BWb8B0QYFZy/fuN8ILczBs50DK3cqLIceEfQFcEipUuXzOoH+J6uFR3
S4Yz5qiMdZH/yhwJRxKZm2Xg1liiIQIDAQABo1YwVDAOBgNVHQ8BAf8EBAMCBaAw
EwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYDVR0TAQH/BAIwADAfBgNVHSMEGDAWgBQB
rf8kqikp2GbelW0xaw3NNPxJ0TANBgkqhkiG9w0BAQsFAAOCAQEARjLIR1MCydEx
DidG7GjI1o+oDachcNMWeZDwDOH7ZlJ1lrB3QWBvYnunNPRndSWgkZqHg4m4+Adr
KA89FL/8xDU98VvdYQWMKsEAHbIX2oIHnS+vZldH7a2UE9rjKaPXNp1IPqJEu4b3
G2JH3RwBZOQrgtu+ntZO+V/3YoCPhYZBTmsgum0WyYz92VatwLdb3cXRZ+G/oEJv
QkredmvxUipU8H6CApo2MVHGk9GCt9wfYBixXVrODEK9FuRFzUwYBUi94Y0NGikY
44Ao+Hhf0nN9DfPyb38iJ9W/xL4XpLOFYyr5hLnrbxTckGUEOXOIHrCgqInTR4V6
LWUvG2tZEA==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAt0Xr1TV2HT2XUhD/nOlpUFVi0U+88jr/bvr8kUJ9/bOGEYyI
FnjhtKq0YcRH+FYJFUAgYR5OVOjq4jaY7LdcGYdImQQQZSIce/Ay8CA/wTjpM3LO
JBG/57iDJSg/AaTr6A1VhthNE+qnOtqEE07E0v7hakXjF41EpKHwneQEf/auKoNa
Fob1pTjpinR4qOE5ocXCb8LDvmrnfJY88SKxguubQETtMii7oR2LsNyNHSC+9JUl
rGtnPBnAPBNR0B2W5BWb8B0QYFZy/fuN8ILczBs50DK3cqLIceEfQFcEipUuXzOo
H+J6uFR3S4Yz5qiMdZH/yhwJRxKZm2Xg1liiIQIDAQABAoIBAAkbitJLMdXW9bbr
7IfzrkdO6iluRcl6PRXBMapWT5FUyb83G89iFA7r9lxvA9SURSdIZIa7zTcfzAX2
ojenqDmfvqMIz94p78uiiCV+tMX5YHCTrlxq6JdI7nUUpuzoZGcuInRTbQeMWOGH
2M0zOny+kp0hYMOodYmcGPgy5WmM1ybswyH9ZAP+rxmjX/KNfMBvw8crE7lNsumM
iQYMv4wruiYCaBuQq2cCxIRVfTyFKYM/pNN3RXzRxBS48SClRbWXn3GzJHsUpJE5
v5Fk93I17yIG0goOjPPZj6QF6nd0nxfb8ajJBmWknv1thjho5wLFXzAs6lxZY6OG
zzv04bECgYEA05zPmp/Z4WvkZLZvWvmLSFGQm2pE1iNF995RYPAsP/49zxvB3ocH
BfrrG2NyhFPKny88Vf38PH/WXaqrLESawZcM/6nX3/DYbtkVSj4GD4UVOUcreYxY
i8RtxoJ9YogerLDoPdoRL8CYRNvfrgW3R8BZlMzd3XCS34o1ntEyxXcCgYEA3bdW
hKO4/rwKw6/LAy9hUP88TeeWGYgq1IL1PCN47XPyKJIzV8XsBmrKNuWv1nJ+diQV
tVcUulraHBF7z0T0l/PirETPLGzDR2ihyNOl7Lib39a5kzoRV5d+xMb4wNc1KJl+
KzSw2J+2TI99/ZVMnwjjfx2+4jowfoHPQz+/GycCgYALF13+QcCewxPuf21ovEmj
mbrVmoVPH/wr2Lg1N4FqPT4qG89WhYdFtfgasGSxMN8e5s/nxe8xkJXAxRBBurrN
yMgConlRIIOHk9M81/FjYNtS7DsIHOYLNVl3nSFLR80ryf3yN/rMoPCaM1gO+/e2
SAup8+7xC1R3aPwUfeyGUwKBgBzPagqqS6uuO6fZ/ANZ8MdZozhsU3DV5NrgeYVr
Bpe0bU8gUFOjgFwFHGmtxv+SuSQY5ElAG41rqNPk4bW5PB9Sra288z7Ok0GAMyWp
evIbuwWHHW4oKYC8Sti/EivcyyePanmqyyAbANFKBBEjiWVQ/l7SOq+i6BJIQ+p1
KhwZAoGALZ3dvjtJj9g/U2swvJskBhcEfGl/LFG8oQ+9oWbbjezKPZrb0HxqVU7h
pL5ENC0l+uH04LH8d1W2Zrp4bIGTrisyU0l2XTD2fSY8duPk8k8pSRyOHHp9jX7j
CiNHS2as6PWIIis+UfuZ3L2vdT2PKM1tLbpE835cdglb7oJX1cY=
-----END RSA PRIVATE KEY-----

# 升级kubelet的客户端证书
# 修改kubelet.config文件,这里将admin.conf有效的证书信息和私钥信息直接复制使用
# 首先备份原文件
[root@k8s-master01 ~]# cp /etc/kubernetes/kubelet.conf{,.bak}
[root@k8s-master01 ~]# tail -n2 /etc/kubernetes/admin.conf >> /etc/kubernetes/kubelet.conf
## 删除其中多余的两行信息
[root@k8s-master01 ~]# vim /etc/kubernetes/kubelet.conf
#...
    client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
    client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
#...

# 复制文件到其他节点
[root@k8s-master01 ~]# scp /etc/kubernetes/kubelet.conf 11.0.1.1{1..3}:/etc/kubernetes/

# 更新kubeconfig文件
[root@k8s-master01 ~]# cp /etc/kubernetes/admin.conf ~/.kube/config

# 验证集群信息
[root@k8s-master01 ~]# kubectl get nodes
NAME                       STATUS   ROLES           AGE    VERSION
k8s-master01.dinginx.org   Ready    control-plane   579d   v1.35.0
k8s-node01.dinginx.org     Ready    <none>          579d   v1.35.0
k8s-node02.dinginx.org     Ready    <none>          579d   v1.35.0
k8s-node03.dinginx.org     Ready    <none>          415d   v1.35.0

注意:也可选择创建新的 kubelet-client-20xx-xx-xx-xx-xx-xx.pem 文件并更新软链接。

[root@k8s-master01 ~]# ls /var/lib/kubelet/pki/ -hl
total 20K
-rw------- 1 root root 2.8K Sep 27  2025 kubelet-client-2025-09-27-15-40-33.pem
lrwxrwxrwx 1 root root   59 Sep 27  2025 kubelet-client-current.pem -> /var/lib/kubelet/pki/kubelet-client-2025-09-27-15-40-33.pem

Kubernetes证书实现“长期有效”

虽然定期续期是标准的运维流程,但对于某些测试环境或希望极大减少维护频率的场景,我们可以在集群初始化时,通过修改kubeadm源码来生成有效期极长的证书,实现所谓的“永久生效”。注意:此操作建议仅在创建新集群时执行,生产环境请谨慎评估安全风险。

安装必要的工具

首先需要在编译机器上安装编译所需的工具。

# 安装工具包
[root@k8s-node03 ~]# apt install -y make git

# 查看kubeadm版本,这里是v1.35.0
[root@k8s-node03 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"35", EmulationMajor:"", EmulationMinor:"", MinCompatibilityMajor:"", MinCompatibilityMinor:"", GitVersion:"v1.35.0", GitCommit:"66452049f3d692768c39c797b21b793dce80314e", GitTreeState:"clean", BuildDate:"2025-12-17T12:39:26Z", GoVersion:"go1.25.5", Compiler:"gc", Platform:"linux/amd64"}

下载源码

下载与集群版本一致的Kubernetes源码。

[root@k8s-node03 /data]# git clone --depth 1  --branch v1.35.0 https://github.com/kubernetes/kubernetes.git
[root@k8s-node03 /data]# cd kubernetes/
[root@k8s-node03 /data/kubernetes]# du -sh ../kubernetes/
380M    ../kubernetes/
# 验证信息
[root@k8s-node03 /data/kubernetes]# git log
commit 66452049f3d692768c39c797b21b793dce80314e (grafted, HEAD, tag: v1.35.0)
Author: Kubernetes Release Robot <k8s-release-robot@users.noreply.github.com>
Date:   Wed Dec 17 12:32:06 2025 +0000

    Release commit for Kubernetes v1.35.0

修改源码证书有效期

找到并修改控制证书有效期的常量。

# 修改源码信息
[root@k8s-node03 /data/kubernetes]# vim cmd/kubeadm/app/constants/constants.go
#...
        // CertificateValidityPeriod defines the validity period for all the signed certificates generated by kubeadm
        //CertificateValidityPeriod = time.Hour * 24 * 365
        CertificateValidityPeriod = time.Hour * 24 * 365 * 100  # 组件证书设置100年
        // CACertificateValidityPeriod defines the validity period for all the signed CA certificates generated by kubeadm
        //CACertificateValidityPeriod = time.Hour * 24 * 365 * 10
        CACertificateValidityPeriod = time.Hour * 24 * 365 * 1000 # CA根证书设置1000年
#...

# 编译
make all WHAT=cmd/kubeadm GOFLAGS=-v

# 等待编译完成,复制二进制包
[root@ubuntu1804 /usr/local/kubernetes]# ls _output/bin/kubeadm -hl
-rwxr-xr-x 1 root root 70M Mar 22 09:53 _output/bin/kubeadm
# 复制到集群节点
[root@ubuntu1804 /usr/local/kubernetes]# scp  _output/bin/kubeadm 11.0.1.10:/usr/bin/kubeadm

拆除集群并重新创建

使用修改后的kubeadm二进制文件,重新初始化集群以生成长期有效的证书。

## 拆除整个集群,生产慎用!!!每个节点都需执行
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock &&  rm -rf /etc/kubernetes/ /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni /etc/cni/net.d /var/lib/etcd /run/flannel/

## 初始化master节点
kubeadm init   --control-plane-endpoint="kubeapi.dinginx.org"   --kubernetes-version=v1.35.0   --pod-network-cidr=10.244.0.0/16   --service-cidr=10.96.0.0/12   --token-ttl=0   --cri-socket unix:///var/run/cri-dockerd.sock   --image-repository=registry.aliyuncs.com/google_containers

# worker节点加入集群
kubeadm join kubeapi.dinginx.org:6443 --token 3s16nk.tjm7fzie4glhrzxs \
 --discovery-token-ca-cert-hash sha256:2be22e9b136994e593f4a8b33b1f426f568410fbf3d1e4c2814981d3e91412c2 \
    --cri-socket unix:///var/run/cri-dockerd.sock

检查集群证书信息

集群创建完成后,验证证书的有效期已被极大地延长。

[root@k8s-master01 ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the “kubeadm-config” ConfigMap in namespace “kube-system”...
[check-expiration] Use 'kubeadm init phase upload-config kubeadm --config your-config-file’ to re-upload it.

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Mar 19, 2036 10:03 UTC   9y              ca                      no
apiserver                  Mar 19, 2036 10:03 UTC   9y              ca                      no
apiserver-etcd-client      Mar 19, 2036 10:03 UTC   9y              etcd-ca                 no
apiserver-kubelet-client   Mar 19, 2036 10:03 UTC   9y              ca                      no
controller-manager.conf    Mar 19, 2036 10:03 UTC   9y              ca                      no
etcd-healthcheck-client    Mar 19, 2036 10:03 UTC   9y              etcd-ca                 no
etcd-peer                  Mar 19, 2036 10:03 UTC   9y              etcd-ca                 no
etcd-server                Mar 19, 2036 10:03 UTC   9y              etcd-ca                 no
front-proxy-client         Mar 19, 2036 10:03 UTC   9y              front-proxy-ca          no
scheduler.conf             Mar 19, 2036 10:03 UTC   9y              ca                      no
super-admin.conf           Mar 19, 2036 10:03 UTC   9y              ca                      no

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Feb 26, 2126 10:03 UTC   99y             no
etcd-ca                 Feb 26, 2126 10:03 UTC   99y             no
front-proxy-ca          Feb 26, 2126 10:03 UTC   99y             no

从输出可以看到,组件证书有效期延长至约9年,而根CA证书的有效期更是达到了99年,这极大减少了未来证书管理的负担。希望这篇关于Kubernetes证书管理、续签与长期有效设置的详细指南,能帮助你更好地维护集群的安全与稳定。




上一篇:Python机器学习:4种数值特征缩放方法对比与应用场景解析
下一篇:OpenClaw微信官方插件发布,终端一条命令实现微信直连
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-3-23 05:59 , Processed in 0.688448 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表