【问题标题】:Kubernetes: MetalLB not load balancing the requests properlyKubernetes:MetalLB 没有正确地对请求进行负载平衡
【发布时间】:2022-08-03 02:30:26
【问题描述】:

我已经使用 MetalLB 设置了一个带有 LoadBalancer 类型服务的 kubernetes 集群,并且能够让外部 IP 为其工作。唯一的问题是,当我从主节点访问端口 80 上的 LB 服务 IP 时,只有在主节点上运行的 pod 才会响应,只有当 LB 平衡/映射到主节点上运行的 pod 的 IP 时也是如此。然而,当它平衡/映射到工作节点上运行的其中一个 pod 的 ip 时,它只是超时。

当我从工作节点访问端口 80 上的 LB 服务 IP 时,也会发生同样的情况。它只在映射到同一工作节点上的 Pod 的 IP 时返回结果,并在映射到在主节点上运行的 Pod IP 时超时。

以下是有关我的集群的详细信息:

Pod network CIDR: 10.0.1.0/24

Host system\'s local CIDR: 192.168.2.0/24

Master system IP: 192.168.2.28

Worker node IP: 192.168.2.32

LB IP range assigned to MetalLB: 192.168.2.89-192.168.2.95 (range has been assigned to master)

Service running on pods: nginx (on port 80)

Pod-1 (on master) -  IP: 10.0.1.3:80 (nginx)

Pod-2 (on worker) -  IP: 10.0.1.7:80 (nginx)

MetalLB Service IP: 192.168.2.89

CNI used: Calico

现在,当我这样做时:

  (On Master) # curl -sL \'http://192.168.2.89\'

只有当 \"192.168.2.89\" 映射到 \"10.0.1.3\" 时,我才会收到响应。当我再次执行上述命令时,LB 映射到工作节点上的“10.0.1.7”,它只是超时。当我在工作节点上执行上述任务时也是如此。

请注意,我已经修改了每个 pod 的索引文件,以更好地识别哪个 pod 正在返回结果。

我还尝试从同一网络中的机器访问端口 80 上的 LB IP,但不是 kubernetes 集群的一部分。但是,从这台机器上,我只收到来自主节点上运行的 pod 的结果,而当 LB 映射到工作节点上的 pod 时它会超时。

在大师:

  # curl -sL \'http://192.168.2.89\'

输出> 仅显示托管在主节点上运行的 pod 上的索引文件的数据。

在工人上:

  # curl -sL \'http://192.168.2.89\'

输出> 仅显示托管在 Worker 节点上运行的 pod 上的索引文件的数据。

在客户端机器上:

  # curl -sL \'http://192.168.2.89\'

输出> 仅显示托管在主节点上运行的 pod 上的索引文件的数据。

以下是我使用网络流量记录从测试中发现的:

在请求失败的情况下,LB IP直接将请求转发到节点的集群IP,而不是节点的公共IP,因为它只在集群内部有效,在集群外部无效。

LB IP: 192.168.2.89

Client machine IP: 192.168.2.34

Pod on Master: 10.0.1.7:80

Pod on Worker: 10.0.1.3:80

Cluster IP of the worker node/Unknown: 10.0.1.81

[从客户端机器成功传输]:# curl -sL \'http://192.168.2.89\'

192.168.2.34:35162 --> 192.168.2.89:80

<public_ip_master>:54113 --> 10.0.1.7:80

10.0.1.7:80 --> <public_ip_master>:54113

192.168.2.89:80 --> 192.168.2.34:35162

[从客户端机器传输失败]:# curl -sL \'http://192.168.2.89\'

192.168.2.34:42114 --> 192.168.2.89:80

10.0.1.81:58946 --> 10.0.1.3:80

192.168.2.34:42114 --> 192.168.2.89:80

192.168.2.34:42114 --> 192.168.2.89:80

询问:我可以确认没有防火墙阻止任何一个系统上的访问。我不明白的是,为什么负载均衡器不映射到工作节点的公共 IP 并且只对主节点这样做?

经过我的调查,我发现LB在平衡对主节点的请求时,只映射到节点的公共IP。但是,当它尝试平衡对工作节点的请求时,它直接尝试到达工作节点的集群 IP 在 10.0... 范围内,而不是工作节点的公共 IP。

这种行为正常吗?我可以调整它吗?

    标签: kubernetes networking load-balancing calico metallb


    【解决方案1】:

    就我而言,在 Oracle 云上使用 Rancher k3s

    当使用 Flannel VXLAN 时,节点需要能够通过 UDP 端口 8472 访问其他节点,或者当使用 Flannel Wireguard 后端时,节点需要能够通过 UDP 端口 51820 和 51821(使用 IPv6 时)访问其他节点。该节点不应侦听任何其他端口。

    因为默认的 Oracle 云块 udp 端口​​ 8472 但 Rancher k3s 需要打开 udp 端口​​ 8472 以使节点可以到达其他节点。

    我不知道你的背景,但我认为它可以帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 2020-06-25
      • 1970-01-01
      • 2020-05-26
      • 1970-01-01
      • 2018-07-02
      • 2021-12-24
      相关资源
      最近更新 更多