使用 ACM 证书保护 Kubernetes 工作负载 - AWS 证书管理器

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

使用 ACM 证书保护 Kubernetes 工作负载

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

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

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

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

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

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

公开发行的证书需要经过域验证后,ACM 才能颁发证书。您可以使用适用于 Amazon Route 53 的 ACK 服务控制器在您的托管区域中自动创建所需的 DNS 验证别名记录。

证书使用选项

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

  1. 负载均衡器终止(不导出):通过 ACK 颁发证书,并使用它们在 AWS 负载均衡器上终止 TLS。证书保留在 ACM 中,并由 Loa AWS d Balancer 控制器自动发现。这种方法不需要导出证书。

  2. 入口终止(使用导出):从 ACM 导出证书并将其存储在 Kubernetes 密钥中,以便在入口级别终止 TLS。这使您可以直接在 Kubernetes 工作负载中使用证书。

注意

有关需要私有证书的用例,请参阅证书管理器插件 Kubernetes AWS 专用 CA 连接器

先决条件

在安装 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 公共注册表。

    $ 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

有关容器身份关联的更多信息,请参阅 Amazon EKS 用户指南中的 E KS 容器身份

示例:在入口处终止 TLS

以下示例演示如何导出 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 无需手动干预即可继续使用有效证书。