kubernetes - Kubernetes Service LoadBalancer“EXTERNAL-IP”仍然是“" 而不是使用工作节点的公共 IP 地址
问题描述
我有 5 个 VPS,每个 VPS 都有一个公共网络接口,为此我配置了一个 VPN。
- 3 个节点是 Kubernetes 主节点,我将 Kubelet
--node-ip
标志设置为它们的私有 IP 地址。 - 3 个节点中的一个有一个用于 Kubernetes 主节点的 HAProxy 负载均衡器,监听私有 IP,因此所有节点都使用负载均衡器的私有 IP 地址来加入集群。
- 2 个节点是 Kubernetes 工作人员,我没有设置 Kubelet
--node-ip
标志,因此它们的节点 IP 是公共地址。
集群很健康,我已经部署了我的应用程序及其依赖项。
现在我想从 Internet 访问应用程序,所以我部署了一个边缘路由器并创建了一个类型为LoadBalancer
.
该服务创建良好,但从不将工作节点的公共 IP 地址作为EXTERNAL-IP
.
手动分配 IP 地址是可行的,但显然希望它是自动的。
我已经阅读了有关MetalLb 项目的信息,但它似乎不适合我的情况,因为它应该有一系列 IP 地址来分发,而在这里我每个节点都有一个公共 IP 地址,而不是在同一范围内.
那么谁可以配置 Kubernetes,以便我的 LoadBalancer 类型的服务自动获取公共 IP 地址EXTERNAL-IP
?
解决方案
我终于可以分两次回答自己了。
没有外部负载均衡器
首先,为了解决我的问题,我发现唯一有效的方法是将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。
这解决了我将 Kubernetes 集群与 Gitlab 集成的问题。
警告: MetalLB 只会分配一次IP 地址,因此如果您有第二个LoadBalancer
Service
,它将永远保持Pending
状态,直到您为 MetalLB 提供一个新的 IP 地址。
推荐阅读
- ms-access - 如何在 Access 中设置一个按钮来同步从 Access 到 SQL Server 的所有内容?
- python - 使用 pipenv 时,`tkinter._test()` 按钮不可见
- angular - 对象属性的Angular中的绑定问题
- amazon-web-services - 存储在 AWS S3 中时,parquet 文件是否可拆分?
- laravel - 如何在数据表中使用 if else 添加来自控制器的列
- postgresql - 在 docker 中使用 pg_dump 时没有合适的本地集群错误
- php - Laravel 6.x - 配置文件中未定义的函数
- service-worker - 为什么 Service Worker 会停止对服务器的 http/https 请求?
- azure - Azure 虚拟机,无法从 Internet 访问
- c++ - iostream 运算符重载的 C++ 异常规范