cert-manager证书未按期续期:Kubernetes节点与本地时间差问题求助
解决方案:让cert-manager使用Kubernetes主机时间创建证书
cert-manager的证书签发、续期逻辑完全依赖其运行Pod的本地时间,而非执行kubectl命令的远程机器时间。出现时间不匹配问题,核心是cert-manager Pod的时区/时间与K8s主机不一致,或是主机时间未正确同步。以下是具体修复步骤:
1. 确保K8s主机时间与时区准确
先确认主机时间同步正常,时区设置正确:
- 设置目标时区(示例为
Asia/Shanghai,按需替换):sudo timedatectl set-timezone Asia/Shanghai - 开启自动时间同步:
sudo timedatectl set-ntp true - 验证主机时间状态:
timedatectl status
2. 让cert-manager Pod使用主机时区
cert-manager默认镜像可能使用UTC时区,需修改其Deployment,通过两种方式对齐主机时区:
方法一:挂载主机时区文件
编辑cert-manager的Deployment:
kubectl edit deployment cert-manager -n cert-manager
在容器配置中添加挂载规则:
spec: template: spec: containers: - name: cert-manager volumeMounts: - name: timezone mountPath: /etc/localtime readOnly: true volumes: - name: timezone hostPath: path: /etc/localtime type: File
方法二:设置TZ环境变量
同样编辑Deployment,在容器的环境变量中指定时区:
spec: template: spec: containers: - name: cert-manager env: - name: TZ value: "Asia/Shanghai" # 替换为你的目标时区
修改后保存,cert-manager Pod会自动重启,此时Pod时区将与主机完全一致。
3. 验证并重新生成证书
删除现有异常证书,触发cert-manager重新签发:
kubectl delete certificate <你的证书名称> -n <证书所在命名空间>
等待证书生成完成后,验证证书的生效时间:
kubectl get secret <证书对应Secret名称> -n <命名空间> -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -dates
输出的notBefore和notAfter时间应与K8s主机时间完全匹配。
补充说明
- 若使用外部CA(如Let's Encrypt),证书的时间范围由CA决定,但cert-manager的续期判断仍基于自身Pod时间,因此确保Pod时间准确仍是核心。
- 续期触发逻辑:cert-manager默认在证书过期前30天尝试续期,若自定义了
renewBefore字段,该时间窗口是基于Pod时间计算的。
内容的提问来源于stack exchange,提问作者Astin Gengo
相关产品推荐
相关产品推荐

