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

证书过期引发的连锁反应包括:

  1. 节点状态变为NotReady
  2. Pod调度失败
  3. 监控数据中断
  4. 服务流量丢失

提示:证书问题往往在深夜或节假日突然爆发,建立预防机制比事后修复更重要

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实现自动续期

  1. 安装Cert-Manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml
  1. 配置ClusterIssuer:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: ca-issuer
spec:
  ca:
    secretName: ca-key-pair
  1. 创建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集群中,需要:

    1. 逐个节点执行续期
    2. 确保API Server负载均衡配置正确
    3. 检查etcd证书状态
  • 证书轮换后的验证

    # 检查节点状态
    kubectl get nodes
    
    # 检查组件健康状态
    kubectl get cs
    
    # 测试API访问
    kubectl cluster-info
    

在实际生产环境中,我们曾遇到过证书过期导致集群不可用的情况。后来建立了三层防御体系:90天预警、30天自动续期、7天人工确认,彻底解决了证书过期问题。特别提醒,.kube/config文件的更新容易被忽视,这是许多工程师踩过的坑。

更多推荐