Kubernetes Service LoadBalancer“ EXTERNAL-IP”保持为“ <none>”,而不是使用工作节点的公共IP地址

时间:2019-12-12 12:49:13

标签: kubernetes vpn kubernetes-networking

我有5个具有公共网络接口的VPS,并且已经为其配置了VPN。

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

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

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

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

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

我已经读过the MetalLb project,但是它似乎不适合我的情况,因为应该分配一定范围的IP地址,而这里每个节点只有一个公共IP地址,并且不在同一范围内。

那么谁可以配置Kubernetes,以便我的LoadBalancer类型的服务自动获得公共IP地址为EXTERNAL-IP

1 个答案:

答案 0 :(得分:0)

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

没有外部负载均衡器

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

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

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

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

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

使用外部负载均衡器

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

通过这个解决方案,我从我的 externalIPs 中删除了 Service 字段,并且我已经安装了 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。

这已经解决了my issue to integrate my Kubernetes cluster with Gitlab

警告:MetalLB 将只分配一次 IP 地址,因此如果您有第二个 LoadBalancer Service,它将保留在 { {1}} 状态永远存在,直到你给 MetalLB 一个新的 IP 地址。