跳至内容

如何使用 TLS 证书为 Amazon EKS 应用程序激活 HTTPS 连接?

3 分钟阅读
0

我想使用 TLS 证书为 Amazon Elastic Kubernetes Service(Amazon EKS)应用程序激活 HTTPS 连接。

简短描述

要为您的 Amazon EKS 应用程序激活 HTTPS 连接,请完成以下任务:

  • 为自定义域获取有效的 TLS 证书。
  • 使用负载均衡器服务类型公开您的 Kubernetes 服务,或者使用 AWS 负载均衡器控制器公开您的 Kubernetes 入站对象。
  • 将您的自定义域与负载均衡器的 DNS 相关联。

解决方法

为您的自定义域获取有效 TLS 证书

要为您的自定义域获取有效的 TLS 证书,请完成以下步骤:

  1. 为您的自定义域申请公有 AWS Certificate Manager(ACM)证书,或者将您自己的 TLS 证书上传到 ACM。

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

  3. 如需创建 NGINX 部署示例,请运行以下命令:

    $ kubectl create deploy web --image=nginx --port 80 --replicas=3
  4. 如需验证 Kubernetes 容器组(pod)是否已部署在您的 Amazon EKS 集群上,请运行以下命令:

    $ kubectl get pods -l app=web

    **注意:**容器组带有标签 app=web。请使用此标签作为服务对象的选择器来识别一组容器组(pod)。

使用负载均衡器服务类型来公开 Kubernetes 服务

注意:如需使用入站对象来公开应用程序,请跳至使用入站对象公开 Kubernetes 服务部分。

要使用负载均衡器服务类型来公开您的 Kubernetes 服务,请完成以下步骤:

  1. 如需创建 service.yaml 清单文件,请使用服务类型 LoadBalancer

    cat <<EOF > loadbalancer.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: lb-service
      annotations:
        # Note that the backend talks over HTTP.
        service.beta.kubernetes.io/aws-load-balancer-type: external
        # 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}
        # Run TLS only on the port named "https" below.
        service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
        # By default In-tree controller will create a Classic LoadBalancer if you require a NLB uncomment below annotation.
        # service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
    spec:
      selector:
        app: web
      ports:
      - name: http
        port: 80
        targetPort: 80
      - name: https
        port: 443
        targetPort: 80
      type: LoadBalancer
    EOF
  2. 编辑注释 service.beta.kubernetes.io/aws-load-balancer-tls-cert 以包括 ACM 的 ARN。

  3. 如需应用 loadbalancer.yaml 文件,请运行以下命令:

    $ kubectl create -f loadbalancer.yaml
  4. 向前跳至将您的自定义域与负载均衡器的 DNS 关联部分。

使用入站对象公开 Kubernetes 服务

**注意:**以下解决方案假设您已在 Amazon EKS 集群中安装了 AWS 负载均衡器控制器。有关详细信息,请参阅 GitHub 网站上的 aws-load-balancer-controller

要使用入站对象公开您的 Kubernetes 服务,请完成以下步骤:

  1. 根据以下示例创建类型为 NodePort 的 Kubernetes 服务:
    cat  <<EOF  > ingressservice.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: web-nginx
    spec:
      ports:
        - port: 80
          targetPort: 80
          protocol: TCP
      type: NodePort
      selector:
        app: web
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: "web-nginx-ingress"
      annotations:
        # Below annotation is to specify if the loadbalancer is "internal" or "internet-facing"
        alb.ingress.kubernetes.io/scheme: internet-facing
        # TODO: Fill in with the ARN of your certificate.
        alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
        # TODO: Fill in the listening ports.
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
        # Set HTTP to HTTPS redirects. Every HTTP listener configured is redirected to below mentioned port over HTTPS.
        alb.ingress.kubernetes.io/ssl-redirect: '443'
      labels:
        app: web
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Prefix
                backend:
                  service:
                    name: "web-nginx"
                    port:
                      number: 80
    EOF
    **注意:**前面的入站清单监听 HTTP 和 HTTPS,然后终止应用程序负载均衡器上的 TLS,然后将 HTTP 重定向到 HTTPS。
  2. 如需应用 ingressservice.yaml 文件,请运行以下命令:
    $ kubectl create -f ingressservice.yaml

将您的自定义域与负载均衡器的 DNS 相关联

要将您的自定义域与负载均衡器的 DNS 关联起来,请完成以下步骤:

  1. 如需返回类型为 LoadBalancer 的服务的 DNS URL,请运行以下命令:

    $ kubectl get service
  2. 如需返回类型为 Ingress 的服务的 DNS URL,请运行以下命令:

    $ kubectl get ingress/web-nginx-ingress
  3. 将您的自定义域与您的负载均衡器名称相关联

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

    https://yourdomain.com
AWS 官方已更新 2 年前