首頁>技術>

使用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-Manager

Cert-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: user@example.com 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: user@example.com 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 - Read

Zone 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的除錯日誌,以檢視證書是否處於活動狀態。

70

DNS

JSON

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 3分鐘短文:Laravel 程式設計中優雅地新增定義常量