我已经使用同一个 IP 段 172.26.10.XX 设置了 3 个主节点和 6 个工作节点。
对于负载均衡器服务,我使用 Kube-Vip 作为负载均衡器,其配置命名空间细节如下:-
Data
====
cidr-private-app:
----
172.26.10.XX/27
range-global:
----
172.26.16.XX-172.26.16.XX
range-public-app:
----
172.26.14.XX-172.26.14.XX
BinaryData
当我尝试公开 IP 为 172.26.10.XX 的服务 LB 时,我可以毫无问题地访问集群内外。但是当我公开 LB IP 为 172.26.16.XX 和 172.26.14.XX 的服务时,我只能在集群节点中访问它们,而不能在集群外部访问它们。有什么问题吗?非常感谢大家的建议。
著名的:
K8S:v1.27.7+k3s2 KUBE-VIP:0.6.4 防火墙规则:允许/所有服务器与 Ips 段为 172.26.10.XX、172.26.16.XX 和 172.26.14.XX 的服务器进行通信
重新启动所有节点并检查配置防火墙。
我希望LB能够浏览具有不同IP段的IP地址。
答案1
问题
172.26.16.0 是不同于 172.26.10.0/27 的子网。集群内的主机将具有 172.26.16.0 子网的路由信息,因为 kube-vip 添加了正确的路由。集群外的主机将不知道在哪里可以找到这个子网,除非有特别说明(某些东西正在更新它们的路由)。对于缺少路由的主机,它们将使用默认路由,该路由通常是网络上的路由器。如果该路由器不知道在哪里可以找到 172.26.16.0,它将丢弃数据包或将其路由出去它是默认路由。
当您使用主机配置的子网内的 IP 时,其他主机将看到它们正在向同一网络中的主机发送信息,并且它们将使用 ARP 查找目标的 MAC 地址并将帧发送到该主机。
您可以在集群内部和外部的节点上检查这些路由表
ip route show table all
简而言之,您需要一个路由器来跨网络。您的 Kubernetes 节点充当路由器,因此通信可以在集群内部进行
解决方案
如果您希望集群外的主机能够访问 IP,最简单的方法可能是使用主机子网中的 IP。例如,如果您的主机位于子网 172.26.10.0/27 中,则使用 172.26.10.24/29 (.24 - .31) 作为您的 VIP。
另一种选择;在 Kubernetes 之外的主机上设置静态路由,告诉它们可以使用 Kubernetes 节点作为网关找到 VIP 网络。如果您的节点是 172.26.10.1、.2、.3,那么 k8s 之外的主机将有一条类似这样的路由172.26.16.0/24 via 172.26.10.1
另一种选择;在 k8s 使用的路由器主机上设置路由,并让路由器将流量发送回 VIP 网络(您的路由器可能需要在同一接口上配置每个子网的 IP 地址)
另一种选择;向与负载均衡器 VIP 位于同一子网的 k8s 外部每个主机添加辅助 IP。
另一种选择;设置路由协议(如 RIP 或 OSPF),以便 k8s 外部的主机可以了解 k8s 集群内部的网络(一些 CNI 可以做到这一点,例如使用 BGP 的 Calico)