使用cert-manager 管理Let’s Encrypt TLS 證書並且允許多個Traefik v2副本。
Traefik 文件推薦使用 cert-manager 作為證書管理器,但是會有一些限制:
當使用Traefik Kubernetes CRD 時,Cert-Manager 還不能直接與CRD 互動,不過現在團隊正解決這個問題。一種解決方法是使Kubernetes Ingress提供程式能夠允許Cert-Manager建立入口物件來完成挑戰。請注意,這仍然需要手動干預才能通過Cert-Manager建立證書,但是一旦建立,Cert-Manager將保持證書的續訂。
這篇文章介紹了如何解決此限制並在Kubernetes上以HA模式執行Traefik v2。我將使用Cloudflare作為我的DNS提供程式和ACME挑戰解決程式,但請隨時使用其他任何受我們加密支援的提供程式。
先決條件Kubernetes 叢集Helm V3DNS安裝 Traefik我們會把Traefik部署在 traefik 名稱空間中:
$ kubectl create namespace traefik
下面我們會部署三副本的Traefik:
additionalArguments: - "--accesslog=true" - "--accesslog.format=json" - "--log.level=DEBUG" - "--metrics.prometheus=true" - "--metrics.prometheus.entryPoint=metrics" - "--entryPoints.metrics.address=:8082"deployment: replicas: 3 podAnnotations: prometheus.io/port: '8082' prometheus.io/scrape: 'true'
$ helm repo add traefik https://containous.github.io/traefik-helm-chart$ helm install -n traefik traefik traefik/traefik -f traefik/traefik-values.yaml
安裝 Cert-ManagerCert-manager是一個開源工具,可自動執行TLS證書的發行和續簽:
我們將其安裝在名稱空間中cert-manager:
$ kubectl create namespace cert-manager
新增Jetstack Helm repo 並且安裝CRDs:
$ helm install \\ cert-manager jetstack/cert-manager \\ --namespace cert-manager \\ --version v0.16.0 \\ --set installCRDs=true
等待cert manager pod 啟動並檢視:
$ kubectl get pods -n cert-manager -w
部署應用
為了進行演示,我們將whoami 應用部署在default名稱空間中。您可以使用您的應用程式或知名的Helm Chart(例如Grafana,Kibana等)替換它:
---kind: DeploymentapiVersion: apps/v1metadata: namespace: default name: whoami labels: app: whoamispec: replicas: 2 selector: matchLabels: app: whoami template: metadata: labels: app: whoami spec: containers: - name: whoami image: containous/whoami ports: - name: web containerPort: 80 ---apiVersion: v1kind: Servicemetadata: name: whoamispec: ports: - protocol: TCP name: web port: 80 selector: app: whoami ---apiVersion: traefik.containo.us/v1alpha1kind: IngressRoutemetadata: name: whoamispec: entryPoints: - websecure routes: - match: Host(`whoami.example.com`) kind: Rule services: - name: whoami port: 80 tls: secretName: whoami
$ kubectl apply -f whoami
建立證書
為了頒發新證書,我們需要首先定義一個Issuer。在此示例中,我將使用Let's Encrypt staging server,並將Cloudflare用於ACME Issuer型別。您還可以在文件中找到其他受支援的配置(SelfSigned,CA,Vault,Venafi和外部發行者型別)。
apiVersion: cert-manager.io/v1alpha2kind: ClusterIssuermetadata: name: letsencrypt-stagingspec: acme: # You must replace this email address with your own. # Let's Encrypt will use this to contact you about expiring # certificates, and issues related to your account. email: [email protected] server: /file/2020/08/30/20200830042834_4.jpg privateKeySecretRef: # Secret resource used to store the account's private key. name: example-issuer-account-key solvers: - dns01: cloudflare: email: [email protected] apiTokenSecretRef: name: cloudflare key: dns-token selector: dnsZones: - 'example.com'
在certs/issuer.yaml中配置email 和 solvers。下面我們使用Cloudflare 作為DNS01 challenge solver,我們先使用下面的配置建立一個新的API token。
Permissions:
Zone - DNS - EditZone - Zone - ReadZone Resources:
Include - All Zones掛載token 為Kubernetes Secret
$ kubectl create secret generic cloudflare-token --from-literal=dns-token=<my-api-token>
最後,配置certificate並部署:
---apiVersion: cert-manager.io/v1alpha2kind: Certificatemetadata: name: whoami-cert namespace: whoamispec: commonName: whoami.example.com secretName: whoami-cert dnsNames: - whoami.example.com issuerRef: name: letsencrypt-staging kind: ClusterIssuer
$ kubectl apply -f certs
配置DNS
檢查證書是否已經生成:
$ kubectl describe certificate whoami-cert
您還可以檢視Traefik的除錯日誌,以檢視證書是否處於活動狀態。