我使用LoadBalancer设置了一个具有MetalLB类型服务的kubernetes集群,并使外部IP能够正常工作。唯一的问题是,当我从主节点访问端口80上的LB服务IP时,只有在主节点上运行的豆荚才会响应,这也只有当LB平衡/映射到运行在主节点上的荚的ip时才会响应。然而,当它平衡/映射到运行在worker节点上的一个豆荚的ip时,它只是超时。
当我从worker节点访问端口80上的LB服务IP时,也会发生同样的情况。它只在映射到同一个工作节点上的pod的IP时返回结果,并在映射到运行在主节点上的pod时超时。
下面是关于我的集群的详细信息::
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“,它只是超时。当我在worker节点上执行上述任务时,情况也是如此。
注意,我修改了每个豆荚的索引文件,以便更好地识别哪个pod返回结果。
我还尝试从同一网络中的机器访问端口80上的LB IP,而不是kubernetes集群的一部分。然而,在这台机器上,我只接收运行在主节点上的豆荚的结果,而当LB映射到工作者节点上的荚时,结果就超时了。
On Master:
# curl -sL 'http://192.168.2.89'Output>只显示托管在主节点上运行的豆荚上的索引文件的数据。
On Worker:
# curl -sL 'http://192.168.2.89'Output>只显示索引文件的数据,该索引文件托管在工作节点上运行的吊舱上。
客户端机器上的:
# curl -sL 'http://192.168.2.89'Output>只显示托管在主节点上运行的豆荚上的索引文件的数据。
下面的是我在使用网络流量日志的测试中发现的:
在请求失败的情况下,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。但是,当它试图平衡对工作节点的请求时,它直接尝试在10.0…中访问该工作节点的集群IP。范围,但不是工作节点的公共IP。
这种行为正常吗?我能调整一下吗?
发布于 2022-08-02 18:30:26
在我的例子中,在Oracle上使用Rancher k3s
当使用Flannel时,节点需要能够到达UDP端口8472上的其他节点,当使用Flannel后端时,需要能够到达UDP端口51820和51821 (当使用IPv6)。节点不应在任何其他端口上侦听。
因为默认情况下,Oracle云阻塞了udp端口8472,但是Rancher k3s需要打开udp端口8472,节点可以到达其他端口。
我不知道你的背景,但我认为这能帮上忙
https://stackoverflow.com/questions/71506940
复制相似问题