2021年9月27日编辑:xip.io
已经消失了,但我在回复中留下了这些参考资料,因为OP询问了xip.io
。替代方案是sslip.io
and nip.io
,两者的功能相同。您可以更换xip.io
在我的回应中,使用其中任何一个都可以获得相同的结果。
有几种方法可以做到这一点。根据您使用无法从 Internet 访问的专用网络,节点没有公共 IP,因此 Kubernetes 不知道映射到它们的任何公共 IP。这就是它在 EC2 或节点外发生 NAT 的任何地方的工作方式。
如果这些节点是自定义集群(您在其中安装 Docker,然后使用docker run
从 Rancher 命令安装 RKE 并将集群加入到 Rancher),然后在安装之前,您可以单击右下角的高级选项链接并设置每个节点的公共和私有 IP。
当您执行此操作时,节点会收到一个包含公共 IP 的标签,并且该地址将与您的xip.io
您在设置 Ingress 时生成的主机名。
如果没有这个标签,xip.io
hostname 选择节点的主 IP,在本例中位于专用网络上。
但是,如果您这样做,即使您的入口控制器正在侦听多个节点,您的流量也只会到达集群上的一个节点。
相反,在运行多节点集群时,我建议您将第 4 层负载均衡器放在所有工作节点(或者入口控制器正在侦听的节点,如果它没有侦听每个节点)前面。插入 80 和 443,然后将其用作您的域的目标。
domain.com -> load balancer -> ingress controller (on all nodes) -> Service -> Pods
您的入口控制器正在侦听 80/443 的 HTTP 流量,这也意味着您的服务不必是 NodePort。它可以是 ClusterIP,因为流量会经过入口控制器,然后在集群内部路由。
当您有外部负载均衡器并且需要将流量定向到某个节点时,请使用 NodePort 服务specific服务。在这种情况下,外部负载均衡器将取代入口控制器。您为每个应用程序创建 NodePort 服务,然后告诉负载均衡器将应用程序 A 的流量发送到端口 30547 上的每个节点或该服务的 NodePort。
顺便说一句,如果您在云提供商中,则可以将它们组合到 LoadBalancer 服务中。这将在节点上创建 NodePort 服务,然后访问云提供商的 API 并部署云负载均衡器,然后使用节点、服务的端口对其进行编程,并在服务的生命周期内维护该配置。
回顾一下:
- 你的节点不知道他们的公共IP,所以
xip.io
主机名也不知道
- 在节点前面放置一个第 4 层负载均衡器,并将流量发送到所有节点上的 80/443
- 将您的服务更改为 ClusterIP
- 将流量发送到负载均衡器
此外,作为一种解决方法,如果您不想部署负载均衡器,您可以删除 Ingress 并重新创建它,而不是创建一个xip.io
自动主机名,选择“设置主机名”并手动创建。如果一个节点的公网IP是1.2.3.4
,那么你可以将其设置为any.thing.you.want.1.2.3.4.xip.io
它会返回1.2.3.4
DNS 查询。
您只是无法编辑现有的xip.io
Ingress 并将其更改为不同的手册xip.io
主机名。你必须重新创建它。
在此解决方法中,流量仍会进入入口控制器,因此您仍然可以将服务从 NodePort 更改为 ClusterIP。
披露:我为 Rancher 工作。