K8s集群维护必看:如何预防kubelet证书过期引发的服务中断(含自动续期方案)
·
K8s集群维护必看:如何预防kubelet证书过期引发的服务中断(含自动续期方案)
在Kubernetes集群的日常运维中,证书管理往往是最容易被忽视却又至关重要的一环。特别是kubelet证书过期问题,一旦发生,轻则导致节点不可用,重则引发整个集群服务中断。本文将深入探讨如何建立一套完整的预防机制,从证书监控到自动续期,帮助DevOps工程师实现"治未病"的运维理念。
1. 理解kubelet证书的生命周期与风险
Kubernetes集群中,kubelet作为每个节点上的核心代理,需要与API Server建立安全通信。这种通信依赖于TLS证书进行身份验证和加密,主要包括:
- bootstrap client certificate:初始引导证书,通常位于
/etc/kubernetes/kubelet.conf - 服务证书:用于kubelet服务身份验证
- 客户端证书:用于kubelet与API Server通信
这些证书默认有效期通常为1年,过期后将导致:
E0728 23:35:23.526561 12500 bootstrap.go:265] part of the existing bootstrap client certificate is expired
证书过期引发的连锁反应包括:
- 节点状态变为NotReady
- Pod调度失败
- 监控数据中断
- 服务流量丢失
提示:证书问题往往在深夜或节假日突然爆发,建立预防机制比事后修复更重要
2. 构建证书过期监控体系
2.1 定期检查证书有效期
使用kubeadm内置命令检查所有证书状态:
kubeadm certs check-expiration
输出示例:
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Oct 30, 2023 08:12 UTC 364d no
apiserver Oct 30, 2023 08:12 UTC 364d ca no
apiserver-kubelet-client Oct 30, 2023 08:12 UTC 364d ca no
2.2 实现自动化监控方案
方案一:Prometheus监控
配置kube-cert-exporter采集证书信息:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kube-cert-exporter
spec:
template:
spec:
containers:
- name: exporter
image: ghcr.io/joe-elliott/cert-exporter:latest
command: ["/cert-exporter"]
args: ["-include-cert-glob=/etc/kubernetes/pki/*.crt"]
方案二:CronJob定期检查
创建定期检查的CronJob:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cert-checker
spec:
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: checker
image: bitnami/kubectl
command: ["/bin/sh", "-c"]
args: ["kubeadm certs check-expiration | grep -E 'RESIDUAL TIME|EXPIRES'"]
restartPolicy: OnFailure
3. 自动续期方案设计与实现
3.1 手动续期流程
当检测到证书即将过期时,可执行:
# 备份原有证书
cp -r /etc/kubernetes/pki /etc/kubernetes/pki.bak$(date +%Y%m%d)
# 续期所有证书
kubeadm certs renew all
# 更新kubeconfig文件
kubeadm init phase kubeconfig all
# 重启kubelet
systemctl restart kubelet
# 更新用户配置
rm -rf $HOME/.kube
mkdir -p $HOME/.kube
cp /etc/kubernetes/admin.conf $HOME/.kube/config
3.2 自动化续期方案
使用Cert-Manager实现自动续期
- 安装Cert-Manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml
- 配置ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: ca-issuer
spec:
ca:
secretName: ca-key-pair
- 创建Certificate资源:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: kubelet-serving
spec:
secretName: kubelet-serving-cert
duration: 2160h # 90天
renewBefore: 360h # 15天前开始续期
issuerRef:
name: ca-issuer
kind: ClusterIssuer
usages:
- server auth
- client auth
dnsNames:
- "kubernetes"
- "kubernetes.default"
- "kubernetes.default.svc"
4. 长期维护策略与最佳实践
4.1 证书管理策略矩阵
| 策略 | 实施方法 | 优点 | 缺点 |
|---|---|---|---|
| 手动续期 | 定期执行kubeadm certs renew | 完全控制 | 容易遗漏 |
| 自动续期工具 | 使用cert-manager等工具 | 自动化程度高 | 需要额外组件 |
| 外部CA集成 | 对接企业PKI系统 | 符合企业规范 | 实施复杂 |
| 短期证书+自动轮换 | 证书有效期<30天 | 安全性最高 | 网络依赖强 |
4.2 关键注意事项
-
备份策略:在执行任何证书操作前,必须备份:
# 备份整个pki目录 cp -r /etc/kubernetes/pki /backup/pki_$(date +%Y%m%d) # 备份kubeconfig文件 cp /etc/kubernetes/admin.conf /backup/admin_$(date +%Y%m%d).conf -
多节点集群:在HA集群中,需要:
- 逐个节点执行续期
- 确保API Server负载均衡配置正确
- 检查etcd证书状态
-
证书轮换后的验证:
# 检查节点状态 kubectl get nodes # 检查组件健康状态 kubectl get cs # 测试API访问 kubectl cluster-info
在实际生产环境中,我们曾遇到过证书过期导致集群不可用的情况。后来建立了三层防御体系:90天预警、30天自动续期、7天人工确认,彻底解决了证书过期问题。特别提醒,.kube/config文件的更新容易被忽视,这是许多工程师踩过的坑。
更多推荐
所有评论(0)