Traefik 是一款優異的反向代理工具,常被應用於 Kubernetes Ingress 的實踐中。它不僅整合簡單、運行迅速,還支援動態配置,且能夠自動整合 Let’s Encrypt 以進行憑證簽署。本文主要會著重於 Let’s Encrypt 憑證簽署的設定部分。

系統需求 🛠️

在我們開始之前,請確保系統已經滿足以下的前置條件:

  1. Kubernetes:用於管理、部署和擴展我們的應用。
  2. 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

以下是設定的重點說明:

  1. certResolvers:

    • 定義 SSL 憑證的取得方式。
    • 請把 your-email@in.here 換成自己的 email
    • 這裡我們選擇了 letsencrypt 作為證書提供者,並設定證書的存放路徑。(storage)
    • 官方說明提到,這邊建議做持久化儲存,以避免每次 Traefik 重啟的時候憑證丟失,會一直重複請求打到 Let’s Encrypt 的 limit。
  2. persistence.enabled

    • 設為 true 以啟用持久化儲存
  3. 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

這段配置的核心重點包括:

  1. Deployment:這裡我們定義了 whoami 應用,簡單地展示相關的資訊。
  2. Service:這確保了外部流量可以流向我們的 whoami 應用。
  3. 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

參考資料