我正在尝试使用以下方法在 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