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

177 lines
4.3 KiB
Markdown

---
tags: traefik, ssl, https, let's encrypt, acme, ingress, kubernetes, 证书
description: Traefik 配置 Let's Encrypt 自动 SSL 证书的完整指南,解决浏览器显示不安全的问题
title: Traefik SSL 证书配置指南
createdAt: 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. 关键配置说明
```yaml
# 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` 中的邮箱:
```bash
# 编辑文件,将 your-email@example.com 改为你的真实邮箱
vi k8s/xiongxiao.me/traefik/traefik-complete.yaml
```
### 4. 应用配置
```bash
# 创建存储目录(在 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 资源:
```yaml
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 证书
### 检查证书状态
```bash
# 查看 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 需要)
- 邮箱地址无效
**解决**:
```bash
# 检查域名解析
nslookup example.xiongxiao.me
# 检查 Traefik Service 的 NodePort
kubectl get svc traefik -n traefik
# 确保防火墙开放 80 和 443 端口
```
### 2. 测试环境配置
如果需要测试,使用 Let's Encrypt Staging 环境(避免达到速率限制):
```yaml
# 在 traefik args 中添加:
- --certificatesresolvers.letsencrypt.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
```
**注意**: Staging 证书不被浏览器信任,仅用于测试。
### 3. 证书续期
Let's Encrypt 证书有效期 90 天,Traefik 会自动在到期前 30 天续期。
### 4. 多域名支持
可以为不同的域名自动获取证书:
```yaml
tls:
- hosts:
- app1.xiongxiao.me
- app2.xiongxiao.me
```
## 生产环境检查清单
- [ ] 修改邮箱地址为真实邮箱
- [ ] 确认域名 DNS 解析正确
- [ ] 确认 NodePort 30080 (HTTP) 可访问
- [ ] 确认 NodePort 30443 (HTTPS) 可访问
- [ ] 移除或注释 staging 环境配置
- [ ] 备份 `/data/traefik-acme/acme.json` 文件
## 参考资料
- [Traefik 官方文档 - Let's Encrypt](https://doc.traefik.io/traefik/https/acme/)
- [Let's Encrypt 速率限制](https://letsencrypt.org/docs/rate-limits/)
- [ACME HTTP Challenge](https://letsencrypt.org/docs/challenge-types/#http-01-challenge)