

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

# 使用 ACM 憑證保護 Kubernetes 工作負載
<a name="exportable-certificates-kubernetes"></a>

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

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

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

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

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

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

公開發行的憑證需要[網域驗證](https://docs.aws.amazon.com//acm/latest/userguide/dns-validation.html)，ACM 才能發行它們。您可以使用 [Amazon Route 53 的 ACK 服務控制器](https://github.com/aws-controllers-k8s/route53-controller)，在您的託管區域中自動建立所需的 DNS 驗證 CNAME 記錄。

## 憑證使用選項
<a name="kubernetes-ack-certificate-usage"></a>

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

![\[alt text not found\]](http://docs.aws.amazon.com/zh_tw/acm/latest/userguide/images/kubernetes-acm.png)


1. *負載平衡器終止 （不含匯出）*：透過 ACK 發行憑證，並使用它們在 AWS 負載平衡器終止 TLS。憑證會保留在 ACM 中，並由[AWS Load Balancer控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.1/guide/ingress/cert_discovery/)自動探索。此方法不需要匯出憑證。

1. *傳入終止 （含匯出）*：從 ACM 匯出憑證，並將其存放在 Kubernetes Secrets 中，以在傳入層級進行 TLS 終止。這可讓您直接在 Kubernetes 工作負載中使用憑證。

**注意**  
如需需要私有憑證的使用案例，請參閱 [AWS Private CA Connector for Kubernetes](https://docs.aws.amazon.com//privateca/latest/userguide/PcaKubernetes-concepts.html)，這是一個 cert-manager 外掛程式。

## 先決條件
<a name="kubernetes-ack-prerequisites"></a>

安裝適用於 ACM 的 ACK 服務控制器之前，請確定您有下列項目：
+ Kubernetes 叢集。
+ 已安裝 Helm。
+ 設定好的 `kubectl`，以便與叢集通訊。
+ `eksctl` 安裝用於在 EKS 上設定 Pod 身分關聯。

## 安裝 ACM 的 ACK 服務控制器
<a name="kubernetes-ack-installation"></a>

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

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

   ```
   $ kubectl create namespace ack-system --dry-run=client -o yaml | kubectl apply -f -
   ```

1. 建立 ACK 控制器的 Pod 身分關聯。將 *CLUSTER\$1NAME* 取代為您的叢集名稱，並將 *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
   ```

1. 登入 Amazon ECR Public 登錄檔。

   ```
   $ aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
   ```

1. 安裝 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
   ```

1. 驗證控制器是否正在執行。

   ```
   $ kubectl get pods -n ack-system
   ```

如需 Pod 身分關聯的詳細資訊，請參閱《*Amazon *[EKS 使用者指南》中的 EKS Pod 身分](https://docs.aws.amazon.com//eks/latest/userguide/pod-identities.html)。

## 範例：在傳入終止 TLS
<a name="kubernetes-ack-example"></a>

下列範例示範如何匯出 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`秘密，確保您的傳入繼續使用有效的憑證，而無需手動介入。