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/