AWS kubernetes 负载均衡器终止端口 443 上的 SSL 并转发至端口 80 上的服务

AWS kubernetes 负载均衡器终止端口 443 上的 SSL 并转发至端口 80 上的服务

我正在尝试使用以下方法在 AWS 中设置我的 EKS 集群Nginx 入口控制器

Nginx 入口控制器创建一个 LoadBalancer 类型的服务,该服务又创建一个映射到服务节点端口的 ELB 实例。

我希望 SSL 证书由 AWS 而不是 kubernetes 集群管理,因此我将其导入 AWS 证书管理器并为 nginx 服务添加了注释:

service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <certificate_arn>

到目前为止,这都是标准做法。负载均衡器现在正在执行 SSL 终止,并且它与集群之间的后续通信是未加密的,这正是我想要的。唯一的问题是,而不是这样:

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (80) -> [Service]

我明白了

[Client] -> HTTPS (443) -> [ELB (SSL termination)] -> HTTP (443) -> [Service]

如您所见,ELB 不会将端口从 443 更改为 80,并且通信被 Nginx pod 拒绝,因为它在端口 443 上接收未加密的流量。

我尝试使用 SSL/TCP ELB 进行类似操作,但出现了同样的问题。

我搜索了一下,但找不到任何方法,如何告诉 ELB 将未加密的流量发送到端口 80。有什么想法吗?

谢谢!

答案1

您需要配置您的 Ingress 服务以便targetPort: http在使用443端口时也能使用。

以下是一个例子使用 Nginx Ingress 和 Amazon ELB 与第 7 层 (HTTP/HTTPS) 侦听器:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-west-2:XXXXXXXX:certificate/XXXXXX-XXXXXXX-XXXXXXX-XXXXXXXX"
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
    service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "60"
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: http  # <--- PAY ATTENTION HERE

相关内容