nginx - 如何修复 Kubernetes Ingress Controller 切断集群中的节点
问题描述
我在我的本地集群(使用 Kubespray 创建,运行 MetalLB 以创建 LoadBalancer)中安装 Ingress Controller 时遇到了一些问题。
我尝试使用 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 正常工作。我还尝试在没有 LoadBalancer 的情况下在服务上使用 NodePorts 或外部 IP 安装 nginx/traefik/kong,但我得到了相同的结果。
有人认识这种行为吗?为什么即使我删除了 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 响应,流量将被路由到该节点。