背景
我的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配置
接下来我们需要修改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 时间。
保存后,K3s会自动执行/var/lib/rancher/k3s/server/manifests
目录下的内容,你会看到K3s将通过另一个容器 helm-install-traefik 调用 Helm 的更新命令,随后,Traefik自动重启。
测试
接下来我们尝试创建一个应用来看看是否生效
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天,更改的成本就增加了,今天抽空学习了一下,网上资料比较少,所以写了这篇文章,希朝对大家有所帮助。