问题:在Kubernetes中,如何将nginx入口配置为将来自弹性负载均衡器的流量定义为HTTPS(当其定义为TCP时)?
我正在使用AWS环境中的Kubernetes集群。我想使用Nginx入口对HTTPS流量进行基于路径的路由。但是,我不不想在AWS弹性负载均衡器上进行SSL终止或重新加密。
所需的设置是:
客户端->弹性负载平衡器-> nginx入口->吊舱
要求:
1.对流量进行端到端加密。
2.必须使用AWS ELB(流量不能从外界直接进入Kubernetes)。
我遇到的问题是要在ELB上进行SSL直通,必须将ELB配置为TCP流量。但是,将ELB定义为TCP时,所有流量都会绕过nginx。
据我所知,我可以设置一个TCP passthrough via a ConfigMap,但这只是另一个传递。它不允许我在nginx中进行基于路径的路由。
我正在寻找一种方法,将ELB定义为TCP(用于直通),同时让入口仍将流量视为HTTPS。
我可以将ELB定义为HTTPS,但是在过程中还有第二个不必要的协商/中断/重新加密步骤,如果可能的话,我要避免该步骤。
答案 0 :(得分:1)
为了更清楚一点,我将从OSI model开始,它告诉我们 TCP 是4级协议,而 HTTP / HTTPS是7级协议。因此,坦白地说,HTTP/HTTP
数据是encapsulated到TCP
数据,然后再进行其余级别的封装以将数据包传输到另一个网络设备。
如果您设置Classic (TCP) LoadBalancer,它将在读取TCP部分后停止读取数据包数据,这足以决定(根据LB配置)此数据包指向哪个IP address
和哪个IP port
应该交付。之后,LB获取TCP有效负载数据,并将其与另一个TCP层数据包装在一起,并将其发送到目标点(这又导致应用了所有其他OSI层)。
要使您的配置按预期工作,必须使用nginx-ingress-controller公开NodePort service Pod。然后,可以将经典ELB配置为将流量传递到任何群集节点,以到达为该NodePort服务选择的端口。通常它在30000
和32767
之间。这样您的LB池将如下所示:
让我们想象一下集群节点的IP地址为10.132.10.1...10
,NodePort端口为30276
。
ELB Endpoint 1: 10.132.10.1:30276
ELB Endpoint 2: 10.132.10.2:30276
...
ELB Endpoint 10: 10.132.10.10:30276
注意:我猜如果是AWS ELB,则应使用节点DNS名称代替IP地址。
因此,这将导致从客户端到Kubernetes应用程序Pod的以下流量分配顺序:
a.b.c.d:80
)。l.m.n.k:30xxx
)的TCP端口,然后将其发送到选定的目的地。nginx.conf
设置,Nginx进程更改HTTP请求并将其发送到为已配置的主机和URL路径指定的集群服务。IP_address:TCP_port
。注意:要在入口控制器上终止SSL,您必须在SAN部分中创建包含ELB IP和ELB FQDN的SSL证书。
注意:如果要在应用程序Pod上终止SSL以具有端到端SSL加密,则可能需要将nginx配置为绕过SSL流量。
底线:配置为向Kubernetes集群传输TCP流量的ELB如果采用正确的配置,则可与nginx-ingress控制器完美配合。
在GKE(Google Kubernetes引擎)中,如果您创建类型为:LoadBalancer的服务,它将创建您完全将流量转发到服务NodePort的TCP LB,然后Kubernetes负责将其传递到Pod。 AWS的EKS(Elastic Kubernetes服务)的工作方式非常相似。