通过kubeadm 部署的集群通过kubeadm命令查看所有核心组件的证书过期时间,https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/

[root@k8smaster ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'

CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
admin.conf                 Jul 29, 2027 09:13 UTC   330d            ca                      no      
apiserver                  Jul 29, 2027 09:13 UTC   330d            ca                      no      
apiserver-etcd-client      Jul 29, 2027 09:13 UTC   330d            etcd-ca                 no      
apiserver-kubelet-client   Jul 29, 2027 09:13 UTC   330d            ca                      no      
controller-manager.conf    Jul 29, 2027 09:13 UTC   330d            ca                      no      
etcd-healthcheck-client    Jul 29, 2027 09:13 UTC   330d            etcd-ca                 no      
etcd-peer                  Jul 29, 2027 09:13 UTC   330d            etcd-ca                 no      
etcd-server                Jul 29, 2027 09:13 UTC   330d            etcd-ca                 no      
front-proxy-client         Jul 29, 2027 09:13 UTC   330d            front-proxy-ca          no      
scheduler.conf             Jul 29, 2027 09:13 UTC   330d            ca                      no      

CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
ca                      Aug 03, 2035 10:40 UTC   8y              no      
etcd-ca                 Aug 03, 2035 10:40 UTC   8y              no      
front-proxy-ca          Aug 03, 2035 10:40 UTC   8y              no 

该命令显示 /etc/kubernetes/pki 文件夹中的客户端证书以及 kubeadm(admin.confcontroller-manager.confscheduler.conf) 使用的 kubeconfig 文件中嵌入的客户端证书的到期时间/剩余时间。

另外,kubeadm 会通知用户证书是否由外部管理; 在这种情况下,用户应该小心的手动/使用其他工具来管理证书更新。

上面的列表中没有包含 kubelet.conf 配置文件,因为 kubeadm 将 kubelet 配置为自动更新证书。 轮换的证书位于目录 /var/lib/kubelet/pki。 要修复过期的 kubelet 客户端证书,请参阅 kubelet 客户端证书轮换失败

[root@k8smaster ~]# kubectl -n kube-system get cm kubeadm-config -o yaml
apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      certSANs:
      - 10.168.1.125
      extraArgs:
        authorization-mode: Node,RBAC
      timeoutForControlPlane: 4m0s
    apiVersion: kubeadm.k8s.io/v1beta3
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    controlPlaneEndpoint: 10.168.1.125:6443
    controllerManager: {}
    dns: {}
    etcd:
      local:
        dataDir: /var/lib/etcd
    imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
    kind: ClusterConfiguration
    kubernetesVersion: v1.28.2
    networking:
      dnsDomain: cluster.local
      podSubnet: 172.16.0.0/16
      serviceSubnet: 10.96.0.0/16
    scheduler: {}
kind: ConfigMap
metadata:
  creationTimestamp: "2025-08-05T10:40:56Z"
  name: kubeadm-config
  namespace: kube-system
  resourceVersion: "198"
  uid: 2f6010c5-2fed-4de8-af0f-37cfe0294d70

查看单个证书文件

如果已知具体的证书文件路径(通常位于 /etc/kubernetes/pki/ 目录下),可以使用 openssl 命令查看其生效和过期时间:

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates

输出中的 notAfter 即为证书的过期时间。

查看 cert-manager 管理的证书

如果集群中使用了 cert-manager 插件来管理应用层的 TLS 证书,可以使用以下命令查看:

kubectl get certificate --all-namespaces

该命令会展示证书的命名空间、名称、就绪状态、关联的 Secret 以及过期时间。

二、 更新(续期)集群证书

更新证书前,务必备份所有证书和配置文件,以防操作失误导致集群无法恢复。

1. 备份关键文件

# 备份证书目录
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak
# 备份 kubeadm 配置文件
cp /etc/kubernetes/kubeadm-config.yaml /etc/kubernetes/kubeadm-config.yaml.bak
# 备份 kubectl 配置文件
cp ~/.kube/config ~/.kube/config.bak

2. 全量续期核心证书
使用 kubeadm 一键续期所有核心证书(推荐方式):

kubeadm certs renew all --config=/etc/kubernetes/kubeadm-config.yaml

续期完成后,可以再次运行 kubeadm certs check-expiration 确认新证书的有效期。

3. 重启核心组件
证书文件更新后,必须重启控制平面组件才能使其生效。由于这些组件通常以静态 Pod 形式运行,删除后会自动重建:

# 重启 apiserver、etcd、controller-manager、scheduler
kubectl delete pods -n kube-system kube-apiserver-[节点名]
kubectl delete pods -n kube-system etcd-[节点名]
kubectl delete pods -n kube-system kube-controller-manager-[节点名]
kubectl delete pods -n kube-system kube-scheduler-[节点名]

# 重启 kubelet 服务(所有节点均需执行)
systemctl restart kubelet

# 重启 kube-proxy
kubectl delete pods -n kube-system -l k8s-app=kube-proxy

4. 更新 kubectl 配置文件
为避免本地 kubectl 客户端因证书过期而无法访问集群,需重新生成并替换配置文件:

kubeadm kubeconfig user --client-name=admin --config=/etc/kubernetes/kubeadm-config.yaml > /etc/kubernetes/admin.conf
cp /etc/kubernetes/admin.conf ~/.kube/config
chmod 600 ~/.kube/config

5. 验证集群状态
执行以下命令,确保集群通信正常且无报错:

kubectl get nodes
kubectl get pods -n kube-system
kubectl get pods --all-namespaces