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

上次更新时间:2020 年 3 月 10 日

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

简短描述

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

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

下面的解决方法假定:

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

注意:如果要使用 Application Load Balancer,则必须部署 ALB 入口控制器。在部署入口时,您可以使用 alb.ingress.kubernetes.io/certificate-arn 注释指定证书,也可以让入口控制器根据主机值自动发现 ACM 证书。

注意:终止网络负载均衡器上的 TLS 连接仅在 Kubernetes 1.15 或更高版本上受支持

解决方案

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 EC2 控制台,然后选择负载均衡器

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

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

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

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

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

https://yourdomain.com

成功响应后,将会返回网页以及有关客户端的详细信息,包括主机名、Pod 信息、服务器值、请求信息和请求标头。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?