Traefik 2.0 實現自動化 HTTPS

上一篇文章我們實現了 ,我們瞭解到 Traefik 中使用 TCP 路由配置需要 SNI,而 SNI 又是依賴 TLS 的,所以需要配置證書才能正常訪問 TCP 服務,其實 Traefik 除了支持我們手動配置 TLS 證書之外,還支持自動生成 TLS 證書,本文就來為大家介紹如何在 Traefik 2.0 中配置自動化 HTTPS 服務。

Traefik 2.0 實現自動化 HTTPS

同樣的,前提條件還是需要提前在 Kubernetes 集群中安裝好 Traefik 2.0 服務,可以參考之前我們提供的安裝資源清單 https://github.com/cnych/kubeapp。裡面包含4個文件:IngressRoute.yaml、crd.yaml、rbac.yaml、traefik.yaml,部分文件我們需要做一些變更。

我們這裡就以 Traefik 的 WebUI 為例,之前我們開啟了 KubernetesCRD 這個 Provider,通過創建一個 IngressRoute 對象來開啟對 WebUI 的訪問,資源清單如下所示:(IngressRoute.yaml)

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-webui
namespace: kube-system
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.qikqiak.com`)
kind: Rule
services:
- name: traefik
port: 8080

要使用 Let’s Encrypt 來進行自動化 HTTPS,就需要首先開啟 ACME,開啟 ACME 需要通過靜態配置的方式,也就是說可以通過環境變量、啟動參數等方式來提供,我們這裡還是直接使用啟動參數的形式來開啟,在 Traefik 的部署文件中添加如下命令行參數:

args:
- --entrypoints.web.Address=:80
- --entrypoints.websecure.Address=:443
- --api.insecure=true # 開啟 webui 需要該參數
- --providers.kubernetescrd

- --api
- --api.dashboard=true
- --accesslog
# 使用 tls 驗證這種方式
- --certificatesresolvers.default.acme.tlsChallenge=true
# 郵箱配置
- --certificatesResolvers.default.acme.email="[email protected]"
# 保存 ACME 證書的位置
- --certificatesResolvers.default.acme.storage="acme.json"
# 下面是用於測試的ca服務,如果https證書生成成功了,則移除下面參數
- --certificatesresolvers.default.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory

這裡我們使用的是 tlsChallenge 這種 ACME 驗證方式,需要注意的是當使用這種驗證時,Let’s Encrypt 到 Traefik 443 端口必須是可達的,除了這種驗證方式外,還有 httpChallenge 和 dnsChallenge 兩種驗證方式,更常用的是 http 這種驗證方式,關於這幾種驗證方式的使用可以查看文檔:https://www.qikqiak.com/traefik-book/https/acme/ 瞭解他們之間的區別。

上面我們相當於指定了一個名為 default 的證書解析器,然後要注意的是,一定要將這裡的 WebUI 的域名traefik.qikqiak.com 解析到 Traefik 的所在節點,解析完成後,重新部署 Traefik:

$ kubectl apply -f traefik.yaml

部署完成後,我們需要讓 WebUI 的域名去監聽 443 端口,因為我們這裡使用的是 tlsChallenge 這種驗證方式,在上面的 IngressRoute.yaml 文件中新建一個對象,用來監聽 443 端口,如下所示:

apiVersion: traefik.containo.us/v1alpha1 

kind: IngressRoute
metadata:
name: traefik-webui-tls
namespace: kube-system
spec:
entryPoints:
- websecure # 注意這裡是websecure這個entryPoint,監控443端口
routes:
- match: Host(`traefik.youdianzhishi.com`)
kind: Rule
services:
- name: traefik
port: 8080
tls:
certResolver: default # 使用我們配置的 default 這個解析器

然後更新對象:

$ kubectl apply -f IngressRoute.yaml
# 現在有兩個 IngressRoute 對象
$ kubectl get ingressroutes -n kube-system
NAME AGE
traefik-webui 28d
traefik-webui-tls 5h15m

這個時候如果一切正常的話我們已經可以通過 HTTPS 去訪問我們的服務了:

Traefik 2.0 實現自動化 HTTPS

traefik2 webui https

Traefik 會自動跟蹤其生成的 ACME 證書的到期日期。如果證書過期之前還不到 30 天了,Traefik 會嘗試進行自動續訂。

同樣的,我們通過 HTTP 協議也是可以訪問到的,但是如果需要將 HTTP 請求強制跳轉到 HTTPS 的話,就需要藉助 Traefik 2.0 的提供的中間件來完成了。

Traefik 2.0 實現自動化 HTTPS

traefik2 中間件

同樣,在上面的 IngressRoute.yaml 文件中添加一個 Middleware 的 CRD 對象,內容如下所示:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: kube-system
spec:
redirectScheme:
scheme: https

這裡我們就聲明瞭一個名為 redirectSchemea 的中間件,該中間件可以將我們的請求跳轉到另外的 scheme 請求,然後將該中間件配置到 HTTP 請求的服務上面:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
name: traefik-webui
namespace: kube-system
spec:
entryPoints:
- web
routes:
- match: Host(`traefik.youdianzhishi.com`)
kind: Rule
services:
- name: traefik
port: 8080
middlewares: # 使用上面新建的中間件
- name: redirect-https

然後更新對象:

$ kubectl apply -f IngressRoute.yaml

這樣當我們通過 HTTP 去訪問 WebUI 服務時,也會自動跳轉到 HTTPS 上面去,同樣可以查看 中間件文件 瞭解更多關於中間件的信息。

本文中用到的資源清單文件可以從這裡獲取:https://github.com/cnych/kubeapp/tree/master/traefik2/https。

關於 Traefik 2.0 的更多使用,可以關注 https://www.qikqiak.com/traefik-book 文檔。


分享到:


相關文章: