Kubernetes 证书更新与续订

Kubernetes 证书更新与续订

_

一、Kubernetes证书管理

1. Kubernetes证书介绍

Kubernetes各组件广泛采用TLS/SSL数字证书,实现组件间的通信加密与身份认证。集群内部组件交互基本基于HTTPS/TLS完成,一方面对传输报文进行加密,避免APIServer、kubelet、etcd、控制器等组件之间的数据以明文形式在网络中传输,抵御抓包窃听风险;另一方面证书充当组件的身份凭证,通信双方互相校验证书合法性,确认通信对象为集群合法组件,拦截非法客户端接入集群。

  • APIServer校验kubelet证书,确认接入节点的合法性;

  • kubelet校验APIServer证书,确认所连接的控制平面真实可信,防范中间人劫持攻击。

集群的安全能力高度依赖证书的生命周期管理。kubeadm生成的组件客户端证书默认有效期为1年,证书过期后会破坏组件间安全通信,干扰集群正常运行,带来安全风险,因此证书的及时更新是集群运维的关键工作。若在1年内执行集群版本升级,kubeadm会在升级过程中自动完成证书续期,保证证书持续有效。

2. 使用自定义的证书

kubeadm在初始化集群时,默认会自动生成集群需要的所有安全证书。同时Kubernetes支持自定义证书,用户可以不用系统自动生成的证书,而是使用自己准备的证书文件。

使用自定义证书文件时,需要将证书和私钥放置到指定目录下。目录可以通过“--cert-dir”目录参数或kubeadm配置文件中的“certificatesDir”字段修改。如果不手动设置,默认存放路径为“/etc/kubernetes/pki”。

在执行“kubeadm init”初始化集群前,如果证书目录里已存在证书和私钥文件,kubeadm不会覆盖替换它们,会直接沿用旧证书。最典型的用法是提前将根CA证书(ca.crt)和CA私钥(ca.key)放置到“/etc/kubernetes/pki”目录下,kubeadm会自动复用这套CA,并使用其签发集群其他所有组件证书。

3. 加密算法

kubeadm可以指定生成公钥和私钥的加密算法,通过配置文件中的“encryptionAlgorithm”字段进行设置。

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
encryptionAlgorithm: [RSA-2048(默认)、RSA-3072、RSA-4096、ECDSA-P256]

4. 选择证书有效期

使用kubeadm可以分别配置普通业务证书(leaf证书)与CA根证书的有效期,在kubeadm配置文件中,通过“certificateValidityPeriod”设置普通证书有效期,通过“caCertificateValidityPeriod”设置CA根证书的有效期。

配置字段取值遵循Go语言的“time.Duration”时间格式,支持的最大时间单位为h(小时)。示例配置如下:

apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
certificateValidityPeriod: 8760h        # 默认值:365天 x 24小时 = 1年
caCertificateValidityPeriod: 87600h     # 默认值:365天 x 24小时 x 10 = 10年

二、手动更新证书

1. 查看集群证书有效期

[Step1] 查看当前集群证书有效期,根据“EXPIRES”字段信息可以看到过期时间为2026-11-19。

root@k8s-master:~# kubeadm certs check-expiration

2. 执行kubeadm更新证书

[Step1] 手动更新集群全部证书,需要能够读取CA证书及其配套私钥文件,应保证用户对上述文件具备相应访问权限。

# 如果只需要更新指定证书:kubeadm certs renew apiserver
root@k8s-master:~# kubeadm certs renew all

[Step2] 运维Kubernetes集群时,通常会将“/etc/kubernetes/admin.conf”复制到家目录下的“$HOME/.kube/config”,以此作为集群管理凭证。执行证书更新操作后,“/etc/kubernetes/admin.conf”内部的证书信息会被刷新。因此证书更新完成后,需要重新将该文件拷贝至家目录下的kube配置文件,使本地管理凭证同步为最新证书。这里先查看当前root家目录下config文件的有效期,这一串加密后的值为客户端证书。

root@k8s-master:~# cat /root/.kube/config | grep users -A 3

[Step3] 将上述加密后的值存储到文件。

[Step4] 将加密值使用base64解密后输出到文件,然后使用openssl读取证书并解析。可以看到,证书有效期仍然是2026-11-19,也就是说证书更新过程中没有更新config文件。

root@k8s-master:~# base64 --decode k8s-cert.txt > k8s.crt
root@k8s-master:~# openssl x509 -in k8s.crt -text -noout  | grep Certificate -A 8

[Step5] 更新config文件。

root@k8s-master:~# rm -rf /root/.kube/config
root@k8s-master:~# cp /etc/kubernetes/admin.conf /root/.kube/config

[Step6] 更新文件后重新执行上述的步骤解密证书,查看证书当前有效期。可以看到证书有效期更新至2027-08-05。

3. 重启集群以应用新证书

[Step1] Kubernetes控制平面组件以静态Pod方式运行。若需要重启静态Pod,可将对应的清单文件移出“/etc/kubernetes/manifests”目录。等待kubelet检测到文件消失后,会终止该Pod,之后再将清单文件重新移回该目录,kubelet便会重新创建静态Pod。

root@k8s-master:~# mv /etc/kubernetes/manifests/ /tmp/

[Step2] 等待一段时间后将文件重新放回原位。

root@k8s-master:~# mv /tmp/manifests/ /etc/kubernetes/

[Step3] 验证:查看集群kube-system命名空间下Pod的状态,全部Pod处于Running状态。

root@k8s-master:~# kubectl get pod -n kube-system

三、升级集群版本完成证书续订

1. 查看当前集群证书的有效期

[Step1] 查看当前集群证书有效期,根据“EXPIRES”字段信息可以看到过期时间为2026-11-19。

2. 封锁控制平面节点

[Step1] 查看控制平面节点的kubeadm版本。

root@k8s-master:~# kubeadm version

[Step2] 更新当前APT源,然后列出当前软件源中所有可供安装的版本。

root@k8s-master:~# apt-get update
root@k8s-master:~# apt list kubeadm -a
  • kubeadm/unknown 1.34.10-1.1 amd64 [upgradable from: 1.34.2-1.1]:当前系统已安装版本1.34.2-1.1,存在更高版本可升级

  • kubeadm/unknown,now 1.34.2-1.1 amd64 [installed,upgradable to: 1.34.10-1.1]:软件源内最新可用版本为1.34.10-1.1,可从现有1.34.2直接升级。

[Step3] 这里我们将版本升级为1.34.10,将Master节点标记为不可调度。

root@k8s-master:~# kubectl cordon k8s-master
root@k8s-master:~# kubectl get nodes

[Step4] 封锁k8s-master节点,并驱逐该节点上所有工作负载Pod。忽略DaemonSet类型Pod不进行驱逐,同时允许移除挂载emptyDir临时存储的Pod。

root@k8s-master:~# kubectl drain k8s-master --ignore-daemonsets --delete-emptydir-data
  • kubectl drain:腾空节点,驱逐节点上所有Pod,同时自动执行cordon封锁节点,禁止新Pod调度进来。

  • --ignore-daemonsets:忽略DaemonSet控制器管理的Pod(如Filebeat、NodeExporter等)。DaemonSet Pod需要常驻各个节点,如果不添加该参数,drain命令会报错,无法执行。

  • --delete-emptydir-data:允许删除使用emptyDir类型临时存储的Pod,emptyDir数据跟随Pod生命周期,Pod删除后数据永久丢失。不加此参数,存在emptyDir的Pod会阻止drain执行。

3. 升级控制平面

[Step1] 执行apt命令升级kubeadm、kubelet、kubectl软件包,此步骤仅更新节点本地二进制程序,尚未完成Kubernetes控制平面升级。

root@k8s-master:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step2] 检查并输出控制平面升级方案,模拟升级规划,此时不会执行任何变更。

root@k8s-master:~# kubeadm upgrade plan

[Step3] 这里跳过etcd升级,避免出现数据风险,可以提前备份etcd中数据。

root@k8s-master:~# kubeadm upgrade apply 1.34.10 --etcd-upgrade=false
[upgrade] Are you sure you want to proceed? [y/N]: y

[Step4] 重启kubelet并解除cordon,恢复Master节点的调度能力。观察节点信息可见两台工作节点版本尚未更新。原因在于kubeadm upgrade apply仅负责升级控制平面相关组件,不会自动更新各节点本地的kubelet二进制程序,需要登录worker节点手动执行软件包安装命令,并重启kubelet服务完成版本升级。

root@k8s-master:~# systemctl restart kubelet.service
root@k8s-master:~# kubectl uncordon k8s-master
root@k8s-master:~# kubectl get nodes

4. 工作节点升级

[Caution]

按照Kubernetes升级规范,应该逐个升级worker节点,不建议同时操作所有工作节点,避免业务整体中断。

[Step1] 在工作节点k8s-worker1升级kubeadm、kubelet、kubectl至1.34.10版本。

root@k8s-worker1:~# apt-get update
root@k8s-worker1:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step2] 在工作节点k8s-worker2升级kubeadm、kubelet、kubectl至1.34.10版本。

root@k8s-worker2:~# apt-get update
root@k8s-worker2:~# apt-get install -y kubelet=1.34.10-1.1 kubeadm=1.34.10-1.1 kubectl=1.34.10-1.1

[Step3] 在工作节点k8s-worker1重启kubelet服务,加载新版本程序。

root@k8s-worker1:~# systemctl restart kubelet.service

[Step4] 在工作节点k8s-worker2重启kubelet服务,加载新版本程序。

root@k8s-worker2:~# systemctl restart kubelet.service

[Step5] 在控制平面查看节点详细信息,可以看kubelet版本升级成功。

root@k8s-master:~# kubectl get nodes

5. 查看集群证书有效期

[Step1] 查看当前集群证书有效期,根据“EXPIRES”字段信息可以看到证书自动续期至2027‑08‑05。

root@k8s-master:~# kubeadm certs check-expiration


Kubernetes 控制平面升级、HPA配置与etcd数据备份恢复 2026-10-30

评论区