我在我的本地群集中安装Ingress Controller时遇到了一些问题(使用Kubespray创建,运行MetalLB来创建LoadBalancer。)。
我尝试使用nginx,traefik和kong,但都得到了相同的结果。
我正在使用以下values.yaml安装我的nginx helm图表:
controller:
kind: DaemonSet
nodeSelector:
node-role.kubernetes.io/master: ""
image:
tag: 0.23.0
rbac:
create: true
用命令:
helm install --name nginx stable/nginx-ingress --values values.yaml --namespace ingress-nginx
当我在集群中部署入口控制器时,会创建一个服务(例如nginx的nginx-ingress-controller)。此服务属于LoadBalancer类型并获取外部IP。
分配此外部IP后,链接到此外部IP的节点将丢失(状态未就绪)。但是,当我检查这个节点时,它仍在运行,它只是从其他节点切断,它甚至无法ping它们(找不到路由)。当我删除服务(而不是nginx helm图表的其余部分)时,一切正常并且Ingress正常工作。我还尝试在服务上使用NodePorts或外部IP安装nginx / traefik / kong而没有LoadBalancer,但我得到了相同的结果。
有没有人认识到这种行为?为什么入口仍然有效,即使我删除了nginx-ingress-controller服务?
经过长时间的搜索,我们终于找到了解决这个问题的有效方法。
正如@A_Suh所提到的,metallb使用的IP池应该包含当前集群中某个节点未使用的IP。通过添加也在DHCP服务器中配置的新IP范围,metallb可以使用ARP将其中一个IP链接到其中一个节点。
例如,在我的5节点集群(kube11-15)中:当metallb获得10.4.5.200/31的范围并为我的nginx-ingress-controller分配10.4.5.200时,10.4.5.200链接到kube12。在10.4.5.200的ARP请求中,所有5个节点都响应kube12,并且trafic将路由到此节点。