Traefik 是一款優異的反向代理工具,常被應用於 Kubernetes Ingress 的實踐中。它不僅整合簡單、運行迅速,還支援動態配置,且能夠自動整合 Let’s Encrypt 以進行憑證簽署。本文主要會著重於 Let’s Encrypt 憑證簽署的設定部分。
系統需求 🛠️
在我們開始之前,請確保系統已經滿足以下的前置條件:
- Kubernetes:用於管理、部署和擴展我們的應用。
- Helm:Helm 是 Kubernetes 的套件管理工具,使得安裝和管理 Kubernetes 應用變得更加簡單。
已經完成上述準備了嗎?太好了,現在讓我們開始吧!
安裝 Traefik
首先,我們要確認 values.yaml 的配置。這是一個關鍵的設定檔案,主要用於指定 Traefik 的特定參數。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| deployment: initContainers: - name: volume-permissions image: busybox:latest command: ["sh", "-c", "touch /data/acme.json; chmod -v 600 /data/acme.json"] securityContext: runAsNonRoot: true runAsGroup: 65532 runAsUser: 65532 volumeMounts: - name: data mountPath: /data
additionalArguments: - "--log.level=DEBUG"
persistence: enabled: true
certResolvers: letsencrypt: email: your-email@in.here tlsChallenge: true httpChallenge: entryPoint: "web" storage: /data/acme.json
|
以下是設定的重點說明:
certResolvers:
- 定義 SSL 憑證的取得方式。
- 請把
your-email@in.here
換成自己的 email
- 這裡我們選擇了
letsencrypt
作為證書提供者,並設定證書的存放路徑。(storage)
- 官方說明提到,這邊建議做持久化儲存,以避免每次 Traefik 重啟的時候憑證丟失,會一直重複請求打到 Let’s Encrypt 的 limit。
persistence.enabled
initContainers:
- 這部分確保 Traefik 可以順利存取我們的 SSL 憑證檔案。
- 透過
busybox
進行許可權設定,以確保 acme.json
這個檔案的權限。
接著,我們將使用 Helm 安裝 Traefik。你可以根據自己的需求調整下方指令中的名稱和 namespace:
1 2 3
| helm repo add traefik https://traefik.github.io/charts helm repo update helm install traefik traefik/traefik -n kube-system -f values.yaml
|
建立應用 - whoami
現在,我們將部署一個名稱為 whoami 的範例應用。該應用的設定內容如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: whoami labels: app: whoami
spec: replicas: 2 selector: matchLabels: app: whoami template: metadata: labels: app: whoami spec: containers: - name: whoami image: traefik/whoami ports: - name: web containerPort: 80
--- apiVersion: v1 kind: Service metadata: name: whoami
spec: ports: - protocol: TCP name: web port: 80 selector: app: whoami
--- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: simpleingressroute namespace: default spec: entryPoints: - web routes: - match: Host(`your.domain.name`) && PathPrefix(`/notls`) kind: Rule services: - name: whoami port: 80
--- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: ingressroutetls namespace: default spec: entryPoints: - websecure routes: - match: Host(`your.domain.name`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: certResolver: letsencrypt
|
這段配置的核心重點包括:
- Deployment:這裡我們定義了
whoami
應用,簡單地展示相關的資訊。
- Service:這確保了外部流量可以流向我們的
whoami
應用。
- IngressRoute:
- 這邊我們透過 IngressRoute ,定義了 Traefik 應該如何解析請求。特別注意,我們有兩種路徑設定,一個是基本的,另一個則是加密的。
- 我們定義了兩組,都是在請求符合
your.domain.name
這個域名的時候,將請求轉發到 whoami 這個 service
- 唯一的區別是,當網址路徑開頭是
/tls
的時候,我們會使用 letsencrypt
這個 certResolver 來加上 TLS 的支持
使用以下的命令,我們將進行應用部署:
1
| kubectl apply -f whoami.yaml
|
部署完成後,你可以通過以下網址進行驗證:
1 2
| open http://your.domain.name/notls open https://your.domain.name/tls
|
參考資料
- 持久化儲存可能會遭遇到的權限問題
- initContainers 的設定檔案