使用 ACM 憑證保護 Kubernetes 工作負載 - AWS Certificate Manager

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 ACM 憑證保護 Kubernetes 工作負載

您可以搭配 AWS Controllers for Kubernetes (ACK) 使用可 AWS Certificate Manager 匯出的公有憑證,從 ACM 發行公有 TLS 憑證並將其匯出至 Kubernetes 工作負載。此整合可讓您保護 Amazon Elastic Kubernetes Service (Amazon EKS) Pod,並在 Kubernetes Ingress 終止 TLS。若要開始使用,請參閱 GitHub 上的適用於 Kubernetes 的 ACM 控制器

AWS Kubernetes (ACK) 的控制器擴展了 Kubernetes API,以使用原生 Kubernetes 資訊清單管理 AWS 資源。適用於 ACM 的 ACK 服務控制器可在 Kubernetes 工作流程中提供自動化憑證生命週期管理。當您在 Kubernetes 中建立 ACM 憑證資源時,ACK 控制器會執行下列動作:

  1. 從產生憑證簽署請求 (CSR) 的 ACM 請求憑證。

  2. 等待網域驗證完成,並讓 ACM 發出憑證。

  3. 如果指定 exportTo 欄位, 會匯出發行的憑證和私有金鑰,並將其存放在您指定的 Kubernetes 秘密中。

  4. 如果指定 exportTo 欄位且憑證符合續約資格, 會在過期前使用續約的憑證更新 Kubernetes Secret。

公開發行的憑證需要網域驗證,ACM 才能發行它們。您可以使用 Amazon Route 53 的 ACK 服務控制器,在您的託管區域中自動建立所需的 DNS 驗證 CNAME 記錄。

憑證使用選項

您可以透過幾種方式搭配 Kubernetes 使用 ACM 憑證:

  1. 負載平衡器終止 (無匯出):透過 ACK 發行憑證,並使用它們在 AWS 負載平衡器終止 TLS。憑證會保留在 ACM 中,並由AWS Load Balancer控制器自動探索。此方法不需要匯出憑證。

  2. 傳入終止 (含匯出):從 ACM 匯出憑證,並將其存放在 Kubernetes Secrets 中,以在傳入層級終止 TLS。這可讓您直接在 Kubernetes 工作負載中使用憑證。

注意

如需需要私有憑證的使用案例,請參閱 AWS Private CA Connector for Kubernetes,這是一個 cert-manager 外掛程式。

先決條件

安裝適用於 ACM 的 ACK 服務控制器之前,請確定您有下列項目:

  • Kubernetes 叢集。

  • 已安裝 Helm。

  • 設定好的 kubectl,以便與叢集通訊。

  • eksctl 安裝用於在 EKS 上設定 Pod 身分關聯。

安裝 ACM 的 ACK 服務控制器

使用 Helm 在 Amazon EKS 叢集中安裝 ACM 的 ACK 服務控制器。

  1. 建立 ACK 控制器的命名空間。

    $ kubectl create namespace ack-system --dry-run=client -o yaml | kubectl apply -f -
  2. 建立 ACK 控制器的 Pod 身分關聯。將 CLUSTER_NAME 取代為您的叢集名稱,並將 REGION 取代為您的 AWS 區域。

    $ eksctl create podidentityassociation --cluster CLUSTER_NAME --region REGION \ --namespace ack-system \ --create-service-account \ --service-account-name ack-acm-controller \ --permission-policy-arns arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess
  3. 登入 Amazon ECR Public 登錄檔。

    $ aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
  4. 安裝 ACM 的 ACK 服務控制器。將 REGION 取代為您的 AWS 區域。

    $ helm install -n ack-system ack-acm-controller oci://public.ecr.aws/aws-controllers-k8s/acm-chart --set serviceAccount.create=false --set serviceAccount.name=ack-acm-controller --set aws.region=REGION
  5. 驗證控制器是否正在執行。

    $ kubectl get pods -n ack-system

如需 Pod 身分關聯的詳細資訊,請參閱《Amazon EKS 使用者指南》中的 EKS Pod 身分

範例:在傳入終止 TLS

下列範例示範如何匯出 ACM 憑證,並使用它在 Kubernetes 傳入層級終止 TLS。此組態會建立 ACM 憑證,將其匯出至 Kubernetes Secret,並設定傳入資源以使用憑證進行 TLS 終止。

在此範例中:

  • 建立秘密來存放匯出的憑證 (exported-cert-secret)

  • ACK 憑證資源會為您的網域向 ACM 請求憑證,並將其匯出至exported-cert-secret秘密。

  • 傳入資源參考 exported-cert-secret來終止傳入流量的 TLS。

${HOSTNAME} 將 取代為您的網域名稱。

apiVersion: v1 kind: Secret type: kubernetes.io/tls metadata: name: exported-cert-secret namespace: demo-app data: tls.crt: "" tls.key: "" --- apiVersion: acm.services.k8s.aws/v1alpha1 kind: Certificate metadata: name: exportable-public-cert namespace: demo-app spec: domainName: ${HOSTNAME} options: certificateTransparencyLoggingPreference: ENABLED exportTo: namespace: demo-app name: exported-cert-secret key: tls.crt --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-traefik namespace: demo-app spec: tls: - hosts: - ${HOSTNAME} secretName: exported-cert-secret ingressClassName: traefik rules: - host: ${HOSTNAME} http: paths: - path: / pathType: Prefix backend: service: name: whoami port: number: 80

部署後,適用於 ACM 的 ACK 服務控制器會自動管理憑證生命週期,包括續約。當 ACM 續約憑證時,控制器會使用新憑證更新exported-cert-secret秘密,確保您的傳入繼續使用有效的憑證,而無需手動介入。