今天在實作 Traefik + Let’s Encrypt 的自動簽發憑證功能,主要目的是讓流量能在 Traefik 層進行 HTTPS 加密。剛好專案的 ingress controller 本身就是用 Traefik,因此可以直接整合 Let’s Encrypt 來完成自動化憑證管理。
Let's Encrypt 憑證通常有效 90 天,當憑證剩下 30 天以內時,Traefik 會自動向 Let's Encrypt 重新申請新憑證,成功後自動更新 /data/acme.json,整個過程不中斷服務、不需重啟。
當服務部署後,Traefik 能夠做到以下幾點:
/data/acme.json
在 Traefik 的設定中,需要先定義一個 certresolver,例如 letsencrypt。當 Traefik 偵測到這個 resolver,就會自動發送申請給 Let's Encrypt。我們使用 DNS Challenge 方式驗證,提供 GoDaddy API Key / Secret 讓 Traefik 能夠自動在 DNS 上新增 TXT 紀錄。
這代表:
我們透過已被 Let's Encrypt 信任的 DNS 提供者(GoDaddy),完成自動化的網域驗證與憑證簽發。
traefik-config (ConfigMap)# ConfigMap: traefik-config (namespace: traefik-system)
certificatesResolvers:
letsencrypt:
acme:
email: aa@aa.aa
storage: /data/acme.json
dnsChallenge:
provider: godaddy # ← 指定使用 GoDaddy
delayBeforeCheck: 60 # ← 等待 60 秒讓 DNS 傳播
resolvers:
- "1.1.1.1:53"
- "8.8.8.8:53"
godaddy-credentials (Secret)# Secret: godaddy-credentials (namespace: traefik-system)
data:
GODADDY_API_KEY: # Base64 編碼
GODADDY_API_SECRET: # Base64 編碼
Traefik Deployment# Deployment: traefik (namespace: traefik-system)
containers:
- name: traefik
env:
- name: GODADDY_API_KEY
valueFrom:
secretKeyRef:
name: godaddy-credentials
key: GODADDY_API_KEY
- name: GODADDY_API_SECRET
valueFrom:
secretKeyRef:
name: godaddy-credentials
key: GODADDY_API_SECRET
provider: godaddy
/data/acme.json
acme.json 用來保存所有憑證資訊,必須嚴格控制權限:
chmod 600 acme.json
否則 Traefik 啟動時會出現:
open /data/acme.json: permission denied
原因是 Traefik 為了安全,會拒絕讀取權限過寬(如 660)的檔案。