Files
k8s-docs/k8s/xiongxiao.me/docs/06-traefik-ssl.md
2025-11-26 15:44:15 +08:00

4.3 KiB

tags, description, title, createdAt
tags description title createdAt
traefik, ssl, https, let's encrypt, acme, ingress, kubernetes, 证书 Traefik 配置 Let's Encrypt 自动 SSL 证书的完整指南,解决浏览器显示不安全的问题 Traefik SSL 证书配置指南 2025-11-26

Traefik SSL 证书配置指南

问题描述

Traefik 默认使用自签名证书,导致浏览器显示"不安全"警告。

解决方案

使用 Let's Encrypt 提供的免费 SSL 证书,通过 ACME 协议自动获取和续期。

配置步骤

1. 更新 Traefik 配置

已在 traefik-complete.yaml 中添加:

  • PersistentVolume/PVC: 存储 ACME 证书数据
  • ACME 配置参数:
    • 证书解析器 letsencrypt
    • HTTP Challenge 验证
    • 自动 HTTP → HTTPS 重定向

2. 关键配置说明

# Let's Encrypt 配置
- --certificatesresolvers.letsencrypt.acme.email=your-email@example.com  # 修改为你的邮箱
- --certificatesresolvers.letsencrypt.acme.storage=/acme/acme.json
- --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web

3. 修改邮箱地址

重要: 在应用配置前,修改 traefik-complete.yaml 中的邮箱:

# 编辑文件,将 your-email@example.com 改为你的真实邮箱
vi k8s/xiongxiao.me/traefik/traefik-complete.yaml

4. 应用配置

# 创建存储目录(在 k8s master 节点上)
sudo mkdir -p /data/traefik-acme
sudo chmod 600 /data/traefik-acme

# 应用配置
kubectl apply -f k8s/xiongxiao.me/traefik/traefik-complete.yaml

# 检查 PV/PVC 状态
kubectl get pv,pvc -n traefik

# 检查 Traefik Pod 状态
kubectl get pods -n traefik
kubectl logs -f deployment/traefik -n traefik

5. Ingress 使用示例

创建带 SSL 的 Ingress 资源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
  annotations:
    # 指定使用 letsencrypt 证书解析器
    traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
spec:
  ingressClassName: traefik
  rules:
  - host: example.xiongxiao.me
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80
  tls:
  - hosts:
    - example.xiongxiao.me
    # Let's Encrypt 会自动生成证书,无需手动指定 secretName

验证 SSL 证书

检查证书状态

# 查看 Traefik 日志中的 ACME 证书获取过程
kubectl logs -f deployment/traefik -n traefik | grep -i acme

# 进入 Pod 检查证书文件
kubectl exec -it deployment/traefik -n traefik -- ls -la /acme/
kubectl exec -it deployment/traefik -n traefik -- cat /acme/acme.json

浏览器验证

  1. 访问你的域名: https://example.xiongxiao.me
  2. 点击浏览器地址栏的锁图标
  3. 查看证书详情,应显示由 "Let's Encrypt" 签发

常见问题

1. 证书获取失败

原因:

  • 域名未正确解析到 Traefik 的公网 IP
  • 80 端口未开放(HTTP Challenge 需要)
  • 邮箱地址无效

解决:

# 检查域名解析
nslookup example.xiongxiao.me

# 检查 Traefik Service 的 NodePort
kubectl get svc traefik -n traefik

# 确保防火墙开放 80 和 443 端口

2. 测试环境配置

如果需要测试,使用 Let's Encrypt Staging 环境(避免达到速率限制):

# 在 traefik args 中添加:
- --certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory

注意: Staging 证书不被浏览器信任,仅用于测试。

3. 证书续期

Let's Encrypt 证书有效期 90 天,Traefik 会自动在到期前 30 天续期。

4. 多域名支持

可以为不同的域名自动获取证书:

tls:
- hosts:
  - app1.xiongxiao.me
  - app2.xiongxiao.me

生产环境检查清单

  • 修改邮箱地址为真实邮箱
  • 确认域名 DNS 解析正确
  • 确认 NodePort 30080 (HTTP) 可访问
  • 确认 NodePort 30443 (HTTPS) 可访问
  • 移除或注释 staging 环境配置
  • 备份 /data/traefik-acme/acme.json 文件

参考资料