繁体   English   中英

Kubernetes 服务负载均衡器“EXTERNAL-IP”仍然是“<none> &quot; 而不是采用工作节点公共 IP 地址

[英]Kubernetes Service LoadBalancer "EXTERNAL-IP" remains "<none>" instead of taking worker nodes public IP addresses

我有 5 个 VPS,每个 VPS 都有一个公共网络接口,为此我配置了一个 VPN。

  • 3 个节点是 Kubernetes 主节点,我将 Kubelet --node-ip标志设置为它们的私有 IP 地址。
  • 3 个节点之一有一个 HAProxy 负载均衡器用于 Kubernetes 主节点,监听私有 IP,以便所有节点都使用负载均衡器的私有 IP 地址来加入集群。
  • 2 个节点是 Kubernetes 工作节点,我没有设置 Kubelet --node-ip标志,因此它们的节点 IP 是公共地址。

集群运行良好,我已经部署了我的应用程序及其依赖项。

现在我想从 Internet 访问该应用程序,因此我部署了一个边缘路由器并创建了一个类型为LoadBalancer的 Kubernetes 服务。

该服务创建良好,但从未将工作节点的公共 IP 地址作为EXTERNAL-IP

手动分配 IP 地址是可行的,但显然希望它是自动的。

我已经阅读了 MetalLb 项目,但它似乎不适合我的情况,因为它应该有一个 IP 地址范围来分配,而在这里我每个节点有一个公共 IP 地址,并且不在同一范围内.

那么我可以配置 Kubernetes 以便我的 LoadBalancer 类型的服务自动获取公共 IP 地址作为EXTERNAL-IP吗?

我终于可以分两次回答自己了。

没有外部负载均衡器

首先,为了解决我的问题,我发现唯一有效的方法是将LoadBalancer服务的externalIPs设置为 Kubernetes 工作节点的 IP 地址。

这些节点正在运行 Traefik,因此它监听端口 80 和 443。

之后,我创建了与 Kubernetes 工作节点一样多的 A DNS 条目,将每个条目指向 Kubernetes 各自的工作节点公共 IP 地址。 此设置使 DNS 服务器以随机顺序返回 IP 地址列表,然后 Web 浏览器将负责尝试第一个 IP 地址,如果第一个 IP 地址关闭,则再尝试第二个,依此类推。

这样做的缺点是,当您想要耗尽节点进行维护时,或者当它崩溃时,Web 浏览器将浪费时间尝试访问它,直到它尝试下一个 IP 地址。

所以这里出现了第二个选项:外部负载均衡器。

使用外部负载均衡器

我在另一个 VPS 上安装了 HAproxy 并配置了 Kubernetes API 端口的 SSL 直通,以便它负载均衡到主节点的流量,而不会终止它。

使用此解决方案,我从我的Service删除了externalIPs字段,并且我已经安装了 MetalLB,其中包含一个配置了此清单的 IP 地址:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: staging-public-ips
      protocol: layer2
      addresses:
      - 1.2.3.4/32

创建LoadBalancer Service ,MetalLB 会分配此 IP 地址并相应地调用 Kubernetes API。

这解决了我将 Kubernetes 集群与 Gitlab 集成的问题

警告: MetalLB 只会分配一次IP 地址,因此如果您有第二个LoadBalancer Service ,它将永远保持Pending状态,直到您为 MetalLB 提供新的 IP 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM