Kubernetes集群证书过期应急处理:从检测到自动续签方案

K8s集群证书过期的症状识别

Kubernetes集群证书过期是运维中高发且影响严重的故障类型。典型症状包括:kubectl get nodes返回connection refused或x509 certificate expired错误、API Server日志出现certificate has expired or is not yet valid、kubelet无法向API Server注册节点状态。

证书过期的影响范围取决于过期的证书类型——如果是API Server的Serving Certificate过期,整个集群的API请求都会失败;如果是kubelet的客户端证书过期,单个节点会变为NotReady状态。

证书过期检测与预警配置

通过kubeadm管理的集群,检查证书有效期:

# 查看所有证书的过期时间
kubeadm certs check-expiration

# 输出示例:
# CERTIFICATE                EXPIRES
# api-server                  Aug 06, 2027 08:30 UTC
# api-server-kubelet-client   Aug 06, 2027 08:30 UTC
# front-proxy-client          Aug 06, 2027 08:30 UTC

也可以用OpenSSL直接检查证书文件:

openssl x509 -in /etc/kubernetes/pki/apiserver.crt -checkend 0 -noout
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -enddate -noout

配置Prometheus + Alertmanager实现自动预警:

- alert: K8sCertificateExpiringSoon
  expr: (x509_cert_not_after - time()) / 86400 < 30
  for: 1h
  labels:
    severity: warning
  annotations:
    summary: "Certificate expires in less than 30 days"

kubeadm集群的证书续签操作

kubeadm管理的集群证书续签流程相对标准化。控制平面证书续签:

# 1. 备份现有证书
cp -r /etc/kubernetes/pki /etc/kubernetes/pki-backup

# 2. 续签所有控制平面证书
kubeadm certs renew all

# 3. 重启控制平面组件(静态Pod方式)
crictl pods | grep kube-apiserver | awk '{print $1}' | xargs -I{} crictl stopp {}
crictl pods | grep kube-controller | awk '{print $1}' | xargs -I{} crictl stopp {}
crictl pods | grep kube-scheduler | awk '{print $1}' | xargs -I{} crictl stopp {}

kubelet证书续签:

# 确认kubelet证书自动续签配置
# /var/lib/kubelet/config.yaml中应该有:
# rotateCertificates: true

# 手动续签kubelet证书
systemctl stop kubelet
rm /var/lib/kubelet/pki/kubelet-client-current.pem
systemctl start kubelet

# 验证新证书
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -enddate -noout

非kubeadm集群的证书更新

使用Ansible或Terraform部署的集群,证书路径和管理方式可能不同。通用操作流程:

# 1. 用openssl生成新证书
openssl genrsa -out apiserver.key 2048
openssl req -new -key apiserver.key -out apiserver.csr \
  -subj "/CN=kube-apiserver" -config openssl.cnf
openssl x509 -req -in apiserver.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out apiserver.crt -days 365 \
  -extensions v3_req -extfile openssl.cnf

# 2. 替换证书文件
scp apiserver.crt root@control-plane:/etc/kubernetes/pki/apiserver.crt
scp apiserver.key root@control-plane:/etc/kubernetes/pki/apiserver.key

# 3. 重启API Server
ssh root@control-plane "systemctl restart kube-apiserver"

证书自动轮换方案

从Kubernetes 1.8开始,kubelet支持证书自动轮换。集群管理员需要确保:

1. API Server启动参数包含--kubelet-certificate-authority

2. kubelet配置中rotateCertificates: true已启用。

3. 集群中存在ClusterRoleBinding允许kubelet申请证书签名:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubelet-certificate-auto-approve
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:certificates.k8s.io:certificatesigningrequests:nodeclient
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:nodes

控制平面证书的自动续签需要额外部署cert-manager配合ACME协议或企业内部CA。cert-manager的Certificate资源可以声明式管理证书生命周期,实现全自动化。

证书过期后的集群恢复

如果证书已经过期导致集群不可用,恢复流程的关键在于保持etcd数据完整:

# 1. 停止所有控制平面组件
systemctl stop kube-apiserver kube-controller-manager kube-scheduler

# 2. 确认etcd正常运行
ETCDCTL_API=3 etcdctl endpoint health \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 3. 续签证书并重启
kubeadm certs renew all
systemctl start kube-apiserver kube-controller-manager kube-scheduler

# 4. 更新kubeconfig
cp /etc/kubernetes/admin.conf ~/.kube/config

整个恢复过程通常在15分钟内完成,前提是etcd数据完好。如果etcd证书也过期,恢复难度会显著增加,需要从etcd备份恢复。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-ji-qun-zheng-shu-guo-qi-ying-ji-chu-li-cong-jian/

(0)
小编小编
上一篇 16小时前
下一篇 16小时前

相关推荐