首页 > 解决方案 > 如何修复 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 服务,入口仍然有效?

标签: nginxkubernetestraefikkubernetes-ingresskong

解决方案


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

正如@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 响应,流量将被路由到该节点。


推荐阅读