

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 ACM 证书保护 Kubernetes 工作负载
<a name="exportable-certificates-kubernetes"></a>

您可以将可导 AWS Certificate Manager 出的公共证书与 Kubernetes AWS 控制器 (ACK) 一起使用，将 ACM 中的公共 TLS 证书颁发并导出到您的 Kubernetes 工作负载。这种集成使您能够保护亚马逊 Elastic Kubernetes Service (Amazon EKS) Pod 的安全，并在您的 Kubernetes 入口处终止 TLS。要开始使用，请参阅适用于 [Kubernetes 的 ACM 控制器](https://github.com/aws-controllers-k8s/acm-controller)。 GitHub

AWS 适用于 Kubernetes 的控制器 (ACK) 扩展了 Kubernetes API，使其能够使用原生 Kubernetes 清单来管理资源 AWS 。ACM 的 ACK 服务控制器在您的 Kubernetes 工作流程中提供自动化的证书生命周期管理。当你在 Kubernetes 中创建 ACM 证书资源时，ACK 控制器会执行以下操作：

1. 向 ACM 请求证书，ACM 会生成证书签名请求 (CSR)。

1. 等待域验证完成以及 ACM 颁发证书。

1. 如果指定了该`exportTo`字段，则导出已颁发的证书和私钥并将其存储在您指定的 Kubernetes 密钥中。

1. 如果指定了该`exportTo`字段并且证书符合续订条件，则会在到期前使用续订的证书更新 Kubernetes 密钥。

公开发行的证书需要经过[域验证后](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 验证别名记录。

## 证书使用选项
<a name="kubernetes-ack-certificate-usage"></a>

您可以通过以下几种方式将 ACM 证书与 Kubernetes 配合使用：

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


1. *负载均衡器终止（不导出）*：通过 ACK 颁发证书，并使用它们在 AWS 负载均衡器上终止 TLS。证书保留在 ACM 中，并由 Loa [AWS d Balancer 控制器](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.1/guide/ingress/cert_discovery/)自动发现。这种方法不需要导出证书。

1. *入口终止（使用导出）*：从 ACM 导出证书并将其存储在 Kubernetes 密钥中，以便在入口级别终止 TLS。这使您可以直接在 Kubernetes 工作负载中使用证书。

**注意**  
有关需要私有证书的用例，请参阅证书管理器插件 [Kubernetes AWS 专用 CA 连接器](https://docs.aws.amazon.com//privateca/latest/userguide/PcaKubernetes-concepts.html)。

## 先决条件
<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 公共注册表。

   ```
   $ 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
   ```

有关容器身份关联的更多信息，请参阅 *Amazon EKS 用户指南中的 E* [KS 容器身份](https://docs.aws.amazon.com//eks/latest/userguide/pod-identities.html)。

## 示例：在入口处终止 TLS
<a name="kubernetes-ack-example"></a>

以下示例演示如何导出 ACM 证书并使用它在 Kubernetes 入口级别终止 TLS。此配置创建 ACM 证书，将其导出到 Kubernetes 密钥，并配置一个 Ingress 资源以使用该证书终止 TLS。

在本示例中：
+ 创建密钥是为了存储导出的证书 (`exported-cert-secret`)
+ ACK 证书资源向 ACM 请求您的域名的证书，然后将其导出到`exported-cert-secret`密钥。
+ Ingress 资源引用，`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 续订证书时，控制器会使用新证书更新 S `exported-cert-secret` ecret，从而确保您的 Ingress 无需手动干预即可继续使用有效证书。