如何通过 ACM 终止 Amazon EKS 工作负载的 HTTPS 流量?

上次更新日期:2021 年 7 月 28 日

我想要通过 AWS Certificate Manager (ACM) 终止 Amazon Elastic Kubernetes Service (Amazon EKS) 工作负载的 HTTPS 流量。

简短描述

要在 Elastic Load Balancing 层终止用于 Kubernetes Service 对象的 HTTPS 流量,您必须:

  1. 为您的自定义域请求一个公有 ACM 证书。
  2. 发布您的 Kubernetes 服务时将 type (类型) 字段设置为 LoadBalancer
  3. 使用 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注释在 Kubernetes 服务中指定您的 ACM 证书的 Amazon 资源名称 (ARN)(从 Kubernetes 网站)。该注释允许 Kubernetes API 服务器在创建 Classic Load Balancer 时关联该证书。
  4. 将您的自定义域与负载均衡器相关联。

下面的解决方法假定:

  • 您有一个活动的 Amazon EKS 集群并已关联工作线程节点。
  • 您使用的是 Classic Load Balancer。

注意: 要使用 Application Load Balancer,您必须在 Amazon EKS 上部署应用程序负载均衡

注意:仅 Kubernetes 1.15 或更高版本支持终止 Network Load Balancer 上的 TLS 连接。有关更多信息,请参阅 Kubernetes 网站上的支持使用 AWS NLB 终止 TLS

解决方法

1.    为您的自定义域请求一个公有 ACM 证书

2.    确定您要用于负载均衡器的 HTTPS 侦听器的证书 ARN

3.    要确定注册到您的 Amazon EKS 集群的节点,请在配置 kubectl 的环境中运行以下命令:

$ kubectl get nodes

4.    在文本编辑器中,根据以下内容创建一个 deployment.yaml 清单文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo-pod
  template:
    metadata:
      labels:
        app: echo-pod
    spec:
      containers:
      - name: echoheaders
        image: k8s.gcr.io/echoserver:1.10
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

5.    要创建 Kubernetes Deployment 对象,请运行以下命令:

$ kubectl create -f deployment.yaml

6.    要验证 Kubernetes Pod 是否已部署在您的 Amazon EKS 集群上,请运行以下命令:

$ kubectl get pods

注意:Pod 标签为 app=echo-pod。您可以使用此标签作为 Service 对象的选择器来标识一组 Pod。

7.    在文本编辑器中,根据以下示例创建一个 service.yaml 清单文件。然后,编辑 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注释,以提供第 2 步中确定的 ACM ARN。

apiVersion: v1
kind: Service
metadata:
  name: echo-service
  annotations:
    # Note that the backend talks over HTTP.
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    # TODO: Fill in with the ARN of your certificate.
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run SSL on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  selector:
    app: echo-pod
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8080
  type: LoadBalancer

8.    要创建 Service 对象,请运行以下命令:

$ kubectl create -f service.yaml

9.    要返回 LoadBalancer 类型服务的 DNS URL,请运行以下命令:

$ kubectl get service

注意:如果您的集群中有很多活动服务在运行,则通过命令输出获得正确的 LoadBalancer 类型服务的 URL。

10.    打开 Amazon Elastic Compute Cloud (Amazon EC2) 控制台,然后选择 Load Balancers(负载均衡器)。

11.    选择您的负载均衡器,然后选择侦听器

12.    对于侦听器 ID,请确认您的负载均衡器端口已设置为 443

13.    对于 SSL 证书,请确认您在 YAML 文件中定义的 SSL 证书已附加到您的负载均衡器。

14.    将您的自定义域与负载均衡器名称关联

15.    在 Web 浏览器中,使用以下 HTTPS 协议测试您的自定义域:

https://yourdomain.com

成功的响应将返回一个包含客户端详细信息的网页。此响应包括主机名、Pod 信息、服务器值、请求信息和请求标头。

重要提示:无法通过与 ACM 集成在负载均衡器上安装具有 4096 位 RSA 密钥或 EC 密钥的证书。要将密钥与负载均衡器结合使用,您必须将具有 4096 位 RSA 或 EC 密钥的证书上传到 AWS Identity and Access Management (IAM)。然后,将相应的 ARN 与 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注释结合使用。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?