如何修复 Kubernetes Ingress Controller 从集群中切断节点

How to fix Kubernetes Ingress Controller cutting off nodes from cluster

我在本地集群中安装入口控制器时遇到了一些问题(使用 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 chart 的其余部分)时,一切正常,Ingress 正常。我还尝试在服务上使用 NodePorts 或外部 IP 在没有 LoadBalancer 的情况下安装 nginx/traefik/kong,但我得到了相同的结果。

有人认识这种行为吗? 为什么即使我删除了 nginx-ingress-controller 服务,入口仍然有效?

经过长时间的搜索,我们终于找到了解决这个问题的有效方法。

如@A_Suh所述,metallb 使用的 IP 池应该包含集群中的一个节点当前未使用的 IP。通过添加也在 DHCP 服务器中配置的新 IP 范围,metallb 可以使用 ARP 将 IP 之一 link 指向其中一个节点。

例如在我的 5 节点集群 (kube11-15) 中:当 metallb 获取范围 10.4.5.200/31 并为我的 nginx-ingress-controller 分配 10.4.5.200 时,10.4.5.200 是 link编辑到 kube12。在对 10.4.5.200 的 ARP 请求上,所有 5 个节点都以 kube12 响应,流量将路由到该节点。