Kubernetes GCP负载平衡器如何将流量路由到GKE服务?
我是GCP的新手(<1岁),我仍在将各种服务映射到我现有的网络心理模型的过程中 我正在努力填补的知识空白是如何将HTTP请求负载平衡到GKE集群中运行的服务 在一个测试集群上,我在为HTTP服务的POD前面创建了一个服务:Kubernetes GCP负载平衡器如何将流量路由到GKE服务?,kubernetes,google-cloud-platform,google-kubernetes-engine,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,我是GCP的新手(
apiVersion: v1
kind: Service
metadata:
name: contour
spec:
ports:
- port: 80
name: http
protocol: TCP
targetPort: 8080
- port: 443
name: https
protocol: TCP
targetPort: 8443
selector:
app: contour
type: LoadBalancer
服务正在侦听节点端口30472和30816:
$ kubectl get svc contour
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
contour LoadBalancer 10.63.241.69 35.x.y.z 80:30472/TCP,443:30816/TCP 41m
自动为我创建GCP网络负载平衡器。它有自己的公共IP地址35.x.y.z,正在监听端口80-443:
卷曲负载平衡器IP工作:
$ curl -q -v 35.x.y.z
* TCP_NODELAY set
* Connected to 35.x.y.z (35.x.y.z) port 80 (#0)
> GET / HTTP/1.1
> Host: 35.x.y.z
> User-Agent: curl/7.62.0
> Accept: */*
>
< HTTP/1.1 404 Not Found
< date: Mon, 07 Jan 2019 05:33:44 GMT
< server: envoy
< content-length: 0
<
两个问题:
要了解LoadBalancer服务,首先必须了解NodePort服务。这些工作方式是在集群中的每个节点上都有一个代理(通常在iptables或ipv中实现,现在用于perf,但这是一个实现细节),当创建节点端口服务时,它会选择一个未使用的端口,并将这些代理中的每一个都设置为将数据包转发到Kubernetes pod。LoadBalancer服务在此基础上构建,因此在GCP/GKE上,它会创建一个GCLB转发规则,将请求的端口映射到所有这些节点级代理的轮换。所以GCLB监听端口80,它代理随机节点上的某个随机端口,代理pod上的内部端口
这个过程比这更具可定制性,但这是基本的默认设置。我想我找到了我自己问题的答案-有人能确认我走对了吗 网络负载均衡器将流量重定向到集群中的节点,而不修改数据包-端口80/443的数据包到达该节点时仍具有端口80/443 节点上的端口80/443上没有侦听内容。但是
kube-proxy
编写了iptables规则,将数据包匹配到负载平衡器IP,并使用适当的集群IP和端口重写它们:
您可以在节点上看到iptables配置:
$ iptables-save | grep KUBE-SERVICES | grep loadbalancer
-A KUBE-SERVICES -d 35.x.y.z/32 -p tcp -m comment --comment "default/contour:http loadbalancer IP" -m tcp --dport 80 -j KUBE-FW-D53V3CDHSZT2BLQV
-A KUBE-SERVICES -d 35.x.y.z/32 -p tcp -m comment --comment "default/contour:https loadbalancer IP" -m tcp --dport 443 -j KUBE-FW-J3VGAQUVMYYL5VK6
$ iptables-save | grep KUBE-SEP-ZAA234GWNBHH7FD4
:KUBE-SEP-ZAA234GWNBHH7FD4 - [0:0]
-A KUBE-SEP-ZAA234GWNBHH7FD4 -s 10.60.0.30/32 -m comment --comment "default/contour:http" -j KUBE-MARK-MASQ
-A KUBE-SEP-ZAA234GWNBHH7FD4 -p tcp -m comment --comment "default/contour:http" -m tcp -j DNAT --to-destination 10.60.0.30:8080
$ iptables-save | grep KUBE-SEP-CXQOVJCC5AE7U6UC
:KUBE-SEP-CXQOVJCC5AE7U6UC - [0:0]
-A KUBE-SEP-CXQOVJCC5AE7U6UC -s 10.60.0.30/32 -m comment --comment "default/contour:https" -j KUBE-MARK-MASQ
-A KUBE-SEP-CXQOVJCC5AE7U6UC -p tcp -m comment --comment "default/contour:https" -m tcp -j DNAT --to-destination 10.60.0.30:8443
一个有趣的含义是节点端口被创建了,但似乎没有被使用。与中的此注释相匹配:
Google计算引擎不需要分配节点端口就可以使负载均衡器工作
它还解释了为什么GKE创建了一个自动防火墙规则,允许从0.0.0.0/0到节点上端口80/443的流量。负载均衡器没有重写数据包,因此防火墙需要允许来自任何地方的流量到达节点上的iptables,并且在那里重写。谢谢!负载平衡器如何知道将流量发送到哪个节点端口?我在LoadBalancer配置中的任何地方都看不到它们。每个LoadBalancer服务都是隐藏的NodePort服务:)很抱歉,我的评论不清楚-我主要感兴趣的是如何配置GCP网络负载平衡器以访问该服务,因为它们似乎没有转发到NodePort。经过进一步研究,我补充了一个我希望是准确的答案。
$ iptables-save | grep KUBE-SERVICES | grep loadbalancer
-A KUBE-SERVICES -d 35.x.y.z/32 -p tcp -m comment --comment "default/contour:http loadbalancer IP" -m tcp --dport 80 -j KUBE-FW-D53V3CDHSZT2BLQV
-A KUBE-SERVICES -d 35.x.y.z/32 -p tcp -m comment --comment "default/contour:https loadbalancer IP" -m tcp --dport 443 -j KUBE-FW-J3VGAQUVMYYL5VK6
$ iptables-save | grep KUBE-SEP-ZAA234GWNBHH7FD4
:KUBE-SEP-ZAA234GWNBHH7FD4 - [0:0]
-A KUBE-SEP-ZAA234GWNBHH7FD4 -s 10.60.0.30/32 -m comment --comment "default/contour:http" -j KUBE-MARK-MASQ
-A KUBE-SEP-ZAA234GWNBHH7FD4 -p tcp -m comment --comment "default/contour:http" -m tcp -j DNAT --to-destination 10.60.0.30:8080
$ iptables-save | grep KUBE-SEP-CXQOVJCC5AE7U6UC
:KUBE-SEP-CXQOVJCC5AE7U6UC - [0:0]
-A KUBE-SEP-CXQOVJCC5AE7U6UC -s 10.60.0.30/32 -m comment --comment "default/contour:https" -j KUBE-MARK-MASQ
-A KUBE-SEP-CXQOVJCC5AE7U6UC -p tcp -m comment --comment "default/contour:https" -m tcp -j DNAT --to-destination 10.60.0.30:8443