【Traefik】4 - Let's Encrypt证书 + DNSPOD + 自动续签
背景
我的Deployment绑定了很多子域名,但每次在腾讯云中申请证书只有90天,还需要手动更换大量证书,所以我想使用Traefik自动续签证书,而且使用腾讯云的DNS验证方式,这样就不用每次都手动更换证书了。
环境
traefik: v2.9.10
kubernetes: v1.24.6+k3s1
准备工作
域名绑定
在腾讯云中,我们需要将泛域名(*.yourdomain.com)解析到我们的服务器IP上,这样Traefik才能通过DNS验证方式自动续签证书,其中:
- 主机记录:
*
- 记录类型:
A
- 记录值:
你的服务器IP
泛域名绑定成功后,后面我们任何子域名都可以通过这个泛域名来验证并访问,例如:(test1.yourdomain.com、test2.yourdomain.com)。
申请DNSPOD API密钥
因为我的域名在腾讯的DNSPOD中,因此我们需要申请API密钥,用于Traefik自动续签证书,申请地址如下:
1 | https://console.dnspod.cn/account/token/token |
Traefik配置
创建pv
接下来我们需要将/data/acme.json
持久化,如果不持久化,重启后,acme.json会被删除,导致每次重启都需要申请一个新的证书,168小时内申请证书过多,会导致1天的封禁,因此我们需要持久化 acme.json 文件。
新建目录 /home/k3s/data/traefik
,并授予读写权限:
1 | mkdir -p /home/k3s/data/traefik |
创建pv文件 /var/lib/rancher/k3s/server/manifests/traefik-pv.yaml
1 | touch /var/lib/rancher/k3s/server/manifests/traefik-pv.yaml |
内容如下:
1 | apiVersion: v1 |
创建pv持久化卷:
1 | kubectl apply -f /var/lib/rancher/k3s/server/manifests/traefik-pv.yaml |
配置自动证书
接下来我们需要修改K3s中,Traefik的配置文件,添加证书自动续签的配置,这里我们使用HelmChartConfig
的方式修改Traefik的配置。
在路径/var/lib/rancher/k3s/server/manifests/traefik-config.yaml
中,添加如下配置:
1 | apiVersion: helm.cattle.io/v1 |
首先,我们更改 traefik-config.yaml
而不是更改 traefik.yaml
的原因是,K3S会周期性的执行 /var/lib/rancher/k3s/server/manifests
目录下的所有yaml,而如果我们修改了默认的traefik.yaml
,K3S会自动恢复默认文件,所以我们这里需要新建一个yaml文件,用HelmChartConfig
的方式修改traefik安装的配置即可。
将 yourdomain.com
更改为你的域名,<YOUR DNSPOD ID>
为刚刚创建的API ID,<YOUR DNSPOD TOKEN>
为刚刚创建的API TOKEN,youremail@example.com
为你的邮箱地址。
DNSPod 有以下两个问题:
- 我们从管理界面生成的 ID 和 TOKEN 需要以 DNSPOD_API_KEY=
, 的格式使用。 - 由于解析生效时间比较慢,因此建议延长 Timeout 时间。
上述内容都配置完毕后,会自动执行一个helm job,用于安装traefik,安装完成后,我们通过kubectl get pods -n kube-system
命令查看是否安装成功。
P.S. 请注意,由于acme的缘故,replicas
似乎不支持修改,关于更多helm chart配置,可以参考官方文档:https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml
测试
接下来我们尝试创建一个应用来看看是否生效
1 | cat << EOF > whoami.yml |
创建应用:
1 | kubectl apply -f whoami.yml |
接下来我们创建一个ingress,用于访问这个Deployment:
1 | cat << EOF > ingress-whoami.yml |
1 | kubectl apply -f ingress-whoami.yml |
访问通过https
访问这个域名:https://test.yourdomain.com
,如果你看到了默认页面,证明证书已经生效,此时你可以点击浏览器的锁图标查看证书信息,你会看到证书的有效期是90天,服务商为Let's Encrypt
,证明证书已经创建成功。
强制HTTPS
如果你想强制所有的请求都使用HTTPS,可以在Traefik的配置文件中添加如下配置:
1 | cat << EOF > redirect.yml |
1 | kubectl apply -f redirect.yml |
然后在 ingress-whoami.yml
中,添加Middle Ware
即可:
1 | apiVersion: networking.k8s.io/v1 |
此时流量会先经过defalut
命名空间下的redirect-https
中间件,将所有的请求重定向到https
。
结语
很早就知道Traefik支持自动证书的申请,奈何初学时先自己配置的证书,现在证书由一年改为了90天,更改的成本就增加了,今天抽空学习了一下,网上资料比较少,所以写了这篇文章,希朝对大家有所帮助。
参考资料: