我在本地集群(使用Kubespray创建,运行MetalLB创建LoadBalancer)中安装Ingress控制器时遇到了一些麻烦。
我尝试使用nginx,traefik和kong,但是都得到了相同的结果。
我正在使用以下values.yaml安装nginx掌舵图:
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掌舵图的其余部分)时,一切正常,而Ingress正常工作。我还尝试在服务上使用NodePorts或外部IP在没有LoadBalancer的情况下安装nginx / traefik / kong,但是得到的结果是相同的。
有人认识到这种行为吗? 为什么即使我删除了nginx-ingress-controller服务,入口仍能正常工作?
答案 0 :(得分:1)
经过长时间的搜索,我们终于找到了解决该问题的可行方案。
如@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响应,并且流量将路由到该节点。