k8s使用traefik ACME自动配置证书

k8s使用traefik ACME自动配置证书

背景与核心痛点:在 Kubernetes(K8s)生产级集群中,为各个业务 Ingress 域名申请和维护 HTTPS 证书往往流程繁琐。传统方式常因证书到期忘记续签导致服务中断。通过 Helm 部署 Traefik Ingress Controller 并开启原生 ACME 证书解析器,配合 Cloudflare DNS Challenge 校验与 Let's Encrypt 证书中心,可实现泛域名与各级子域名 SSL 证书的零人工干预全自动签发与无感平滑续期。

目录

架构设计与准备工作

  • 集群包管理器:添加官方 Traefik Helm 仓库:
    helm repo add traefik https://helm.traefik.io/traefik
    helm repo update
    
  • DNS Challenge 优势:相比 HTTP-01 验证必须开放 80 端口且无法签发泛域名,DNS-01 验证借助 Cloudflare 域名 API 可直接签发 *.yourdomain.com 泛域名证书,且无需暴露集群内网环境。

配置 Cloudflare API 凭证 Secret

  1. 登录 Cloudflare 控制台,进入 My Profile -> API Tokens -> 查看 Global API Key(或创建具备 DNS 编辑权限的专用 Token)。
  2. 在 K8s 集群中创建凭证 Secret:
    kubectl create secret generic cloudflare-credentials \
      --from-literal=globalApiKey="你的Cloudflare全局APIKey" \
      -n kube-system
    

定制 Traefik Helm values.yaml

下载官方默认 values.yaml 并针对 ACME 证书自动申请进行关键字段配置:

# 开启 ACME 证书解析器参数
additionalArguments:
  - "--certificatesresolvers.letsencrypt.acme.email=admin@yourdomain.com"
  - "--certificatesresolvers.letsencrypt.acme.storage=/data/acme.json"
  - "--certificatesresolvers.letsencrypt.acme.caserver=https://acme-v02.api.letsencrypt.org/directory"
  - "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
  - "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare"

# 注入 Cloudflare 鉴权环境变量
env:
  - name: CF_API_EMAIL
    value: "your-email@gmail.com"
  - name: CF_API_KEY
    valueFrom:
      secretKeyRef:
        name: cloudflare-credentials
        key: globalApiKey

# 挂载持久化存储用于存储 acme.json
persistence:
  enabled: true
  name: data
  size: 1Gi
  path: /data

# 暴露 Dashboard 并开启 TLS 默认解析器
ingressRoute:
  dashboard:
    enabled: true

💡 防踩坑提示:若容器报 acme.json file has invalid permissions 错误,需确保 Pod 安全上下文配置了正确的存储权限(如 securityContext.fsGroup: 65532)。

Helm 部署 Traefik Ingress Controller

执行 Helm 安装或升级命令:

helm upgrade --install traefik traefik/traefik -f values.yaml -n kube-system

检查 Pod 运行状态:

kubectl get pods -n kube-system -l app.kubernetes.io/name=traefik

部署 WordPress 容器服务验证 HTTPS

使用 Bitnami Helm 仓库部署示例应用验证自动签发链路:

1. 添加 Bitnami 仓库

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

2. 定制 Ingress 配置并部署

在 WordPress 的 values.yaml 中启用 Ingress 并指定 Traefik TLS 解析器:

ingress:
  enabled: true
  ingressClassName: traefik
  hostname: blog.yourdomain.com
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls: "true"
    traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
  tls: true

安装实例:

helm install wordpress bitnami/wordpress -f values.yaml

证书签发结果验证与运维要点

  1. 查看 Traefik 实时日志:
    kubectl logs -n kube-system -l app.kubernetes.io/name=traefik -f
    
    日志中显示 Legocert: [INFO] [blog.yourdomain.com] acme: Validations succeeded 即代表 Cloudflare DNS 验证成功。
  2. 浏览器访问校验:浏览器打开 https://blog.yourdomain.com,地址栏显现权威 Let's Encrypt 绿色有效安全锁,证书期限自动维持在 90 天内动态续期。