You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 20:24:32