跨多个节点的服务节点端口

Service Node Port across multiple nodes

我是 Kubernetes 集群中的 运行 3 个节点。每个节点都有相同的 Pod myApp。 我使用 NodePort 类型创建了一个服务,这样所有 3 个节点都可以从外部访问。 服务 yaml 如下所示

apiVersion: v1
kind: Service
metadata:
  name: myService
  labels:
    app: myApp
spec:
  selector:
    app: myApp
  type: NodePort

假设3个节点的Node IP+端口为:
1. 192.168.18.1:30010
2. 192.168.18.2:30010
3. 192.168.18.3:30010

我的问题是:
1.如果所有请求都到达具有IP(192.168.18.1:30010)的单个节点,服务是否会将请求负载均衡到其他节点中的Pod,或者只是目标节点(IP 192.168.18.1:30010)?

2. 如果问题 1 的答案是肯定的,这意味着服务可以负载均衡请求。那我们还需要负载均衡器吗

谢谢

  1. 是的,kube-proxy 将提供负载平衡。如果您通过描述服务来查看端点,您会发现那里列出了服务支持的 pods 的 IP。因此,当请求到达任何节点 IP 和 NodePort 时,它将通过 pods 之间的 kube-proxy 进行负载平衡。它的工作方式是请求到达节点 IP 和端口之一,然后转到集群 IP,然后负载平衡到集群 IP 后面的任何 pods。

  2. kube 代理的负载平衡通过 IP table 规则发生在 TCP 层。 Loadbalancer 提供 L7 层(HTTP)的负载均衡和基于 HTTP header 等的高级路由规则。因此,如果您需要,则需要使用 Loadbalancer。使用 nodeport 的另一个缺点是,如果节点 IP 更改,则客户端需要知道可以通过使用通常提供 DNS 的 Loadbalancer 来避免。