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

3 分钟阅读
0

我想使用传输层安全性协议 (TLS) 证书为 Amazon Elastic Kubernetes Service (Amazon EKS) 应用程序激活 HTTPS 连接。

简短描述

如需为 Amazon EKS 应用程序激活 HTTPS 连接,您必须执行以下操作:

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

解决方法

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

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

2.    确定要对负载均衡器的 HTTPS 侦听器使用的证书的 Amazon 资源名称 (ARN)

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

$ kubectl create deploy web --image=nginx --port 80 --replicas=3

4.    如需验证 Kubernetes 容器组是否已部署在您的 Amazon EKS 集群上,请运行以下命令:

$ kubectl get pods -l app=web

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

使用负载均衡器服务类型公开 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-backend-protocol: http
    # TODO: Fill in with the ARN of your certificate.
    service.beta.kubernetes.io/aws-load-balancer-tls-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run TLS on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-tls-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 负载均衡器控制器

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 will be 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,然后终止 ALB 上的 TLS,并将 HTTP 重定向到 HTTPS。

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

$ kubectl create -f ingressservice.yaml

将您的自定义域与负载均衡器的 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 官方
AWS 官方已更新 1 年前