【发布时间】: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