Kubernetes GCP负载平衡器如何将流量路由到GKE服务?

Kubernetes GCP负载平衡器如何将流量路由到GKE服务?,kubernetes,google-cloud-platform,google-kubernetes-engine,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,我是GCP的新手(

我是GCP的新手(<1岁),我仍在将各种服务映射到我现有的网络心理模型的过程中

我正在努力填补的知识空白是如何将HTTP请求负载平衡到GKE集群中运行的服务

在一个测试集群上,我在为HTTP服务的POD前面创建了一个服务:

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
<
两个问题:

  • 如果节点上没有侦听端口80或443,负载平衡器是否将流量定向到端口30472和30816
  • 如果负载平衡器在80/443上接受流量并转发到30472/30816,我在哪里可以看到该配置?点击负载平衡器屏幕,我看不到任何关于端口30472和30816的内容

  • 要了解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