我有一个正在运行的牧场主设置如下:
- 公共IP上的主机(运行牧场主/牧场主容器);
- 独享网络 (10.1.1.0/24) 中无法从互联网访问的节点。
我的目标是使用Rancher负载平衡或任何类似的东西来提供Web应用程序。 为此,我执行了以下步骤:
- 在 3 个 pod 上使用"牧场主/hello-world"映像部署工作负载,将端口 80/tcp 映射为名为"web-app"的节点端口(侦听端口是随机的); 在同一
- 命名空间中添加名为"hello"的入口,选择"自动生成
.xip.io
主机名"并将路由"/"添加到端口 80 上的"web-app"。
这适用于本地网络,因为我得到一个像 http://hello.gabriel-milan.10.1.1.14.xip.io/这样的地址,可以解析为 10.1.1.14,这是本地的。
我想为我的一个公共 IP 公开此服务。我该怎么做?
> 编辑 2021-09-27:
xip.io
消失了,但我在回复中留下了这些参考资料,因为 OP 询问了xip.io
.替代方案是sslip.io
和nip.io
,它们的功能相同。您可以将我的回复中的xip.io
替换为其中任何一个,以达到相同的结果。
有几种方法可以做到这一点。基于您使用无法从互联网访问的专用网络,节点没有公共 IP,因此 Kubernetes 对映射到它们的任何公共 IP 一无所知。这就是它在 EC2 或任何节点外发生 NAT 的地方的工作方式。
如果这些节点是自定义集群(您在其中安装Docker,然后使用Rancher的docker run
命令安装RKE并将集群加入Rancher),那么在安装之前,您可以单击右下角的高级选项链接并为每个节点设置公共和私有IP。
执行此操作时,节点会收到一个包含公共 IP 的标签,该地址将与设置入口时生成的xip.io
主机名一起使用。
如果没有该标签,xip.io
主机名将选取节点的主 IP,在本例中,该 IP 位于专用网络上。
但是,如果执行此操作,则流量将仅流向群集上的一个节点,即使您的入口控制器正在侦听多个节点也是如此。
相反,在运行多节点集群时,我建议您在所有工作器节点(或入口控制器正在侦听的节点(如果入口控制器未侦听每个节点)前面放置第 4 层负载均衡器。打通 80 和 443,然后将其用作域的目标。
domain.com -> load balancer -> ingress controller (on all nodes) -> Service -> Pods
入口控制器正在 80/443 上侦听 HTTP 流量,这也意味着您的服务不必是 NodePort。它可以是 ClusterIP,因为流量通过入口控制器,然后在群集内路由。
当您有外部负载均衡器并且需要将流量定向到特定服务时,将使用 NodePort 服务。在这种情况下,外部负载均衡器将替换入口控制器。您可以为每个应用程序创建 NodePort 服务,然后告诉负载均衡器将应用程序 A 的流量发送到端口 30547 上的每个节点或该服务的任何 NodePort。
顺便说一下,如果您在云提供商中,则可以将它们组合到负载均衡器服务中。这将在节点上创建一个 NodePort 服务,然后访问云提供商的 API 并部署云负载均衡器,然后使用节点、服务的端口对其进行编程,并在服务的生命周期内维护该配置。
回顾一下:
- 您的节点不知道其公共 IP,因此
xip.io
主机名也无法知道 - 在节点前面放置第 4 层负载均衡器,并将流量发送到所有节点上的 80/443
- 将服务更改为群集IP
- 将流量发送到负载均衡器
此外,如果您不想部署负载均衡器,则可以删除入口并重新创建它,但不是自动创建xip.io
主机名,而是选择"设置主机名"并手动创建它。如果一个节点的公共 IP1.2.3.4
,则可以将其设置为any.thing.you.want.1.2.3.4.xip.io
,它将返回1.2.3.4
DNS 查询。
您只是无法编辑现有的xip.io
入口并将其更改为其他手动xip.io
主机名。您必须重新创建它。
在此解决方法中,流量仍会进入入口控制器,因此您仍然可以将服务从 NodePort 更改为 ClusterIP。
披露:我为牧场主工作。
- 你必须创建一个带有
type:LoadBalancer
的 svc 。它将为您的部署提供公共 IP。kubectl create service loadbalancer <deployment-name> --tcp=80:8000
- 创建 SVC 后,您必须在入口中创建入口并传递上方创建的 SVC。您必须将
host:
定义为域的 url 以及要映射它path
的位置。 - 将 LB 的 IP 指向 DNS 提供程序。
在使用路由器的传统家庭网络中,一切都在裸机上,我想在网络上公开应用程序,只有有限的进入集群的入口点(端口 80 和 443 分别用于 http 和 https 流量),而不打开任何不必要的端口,并保持工作负载和服务在 ClusterIP 网络后面的安全(无需使用 NodePort 公开工作负载和服务的端口)。
我的节点都没有公共IP,只有我的路由器有。
入口是答案,因为它可以根据不同的主机名路由流量,同时使用相同的IP地址。
由于群集中的节点都在专用家庭网络中,因此没有有关如何执行此操作的直接说明。
此外,我想使用 xip.io 来生成用于测试目的的免费URL,这些URL在WWW上工作,但是通过Rancher UI添加入口时的Automatically generate a .xip.io hostname
选项仅适用于我的本地网络,而不适用于网络。
我为此撞了好几天。
但我终于想通了,它像馅饼一样简单。
首先,我们需要进入路由器的设置并进行一些端口转发。
假设您的路由器的公共 IP16.43.236.65
,并且您的集群上有一个节点,其家庭网络上的内部私有 IP192.168.0.155
在路由器的设置中,将所有端口80
和443
流量转发到其中一个节点的端口80
和443
,使其实质上如下所示:
16.43.236.65:80
->192.168.0.155:80
16.43.236.65:443
->192.168.0.155:443
完成后,返回Rancher并单击Add Ingress
下Load Balancing
,不幸的是,Automatically generate a .xip.io hostname
仍将在您的家庭网络中使用节点的私有IP,并且只能在本地工作。
相反,只需选择Specify a hostname to use
并将公共 IP 与如下所示xip.io
一起使用:
16.43.236.65.xip.io
现在配置其余的入口,我现在只是将所有内容保留为默认值,我使用Service
而不是Workload
进行Target Backend
.
现在,在浏览器上导航到16.43.236.65.xip.io
时,您应该能够访问在通过 Web 添加的入口中选择的服务。
如果您想使用 xip.io 添加其他服务,只需添加子域,例如:
another-service.16.43.236.65.xip.io
yet-another-service.16.43.236.65.xip.io
它可能看起来像魔术,但它的工作方式是按主机名,因此您可以从字面上将任何域名指向相同的公共 IP,Ingress 将根据主机名知道将流量转发到哪里以及使用哪个服务/工作负载,我觉得这很棒。 它可能看起来像魔术,但它的工作方式是按主机名,因此您可以从字面上将任何域名指向相同的公共 IP,Ingress 将根据主机名知道将流量转发到哪里以及使用哪个服务/工作负载,我觉得这很棒。
最后,如果您想使用实际域名:在域名提供商的 DNS 设置中,设置指向路由器公共 IP 的A Record
。使用我们当前的示例,这将是16.43.236.65
.
在Rancher上添加一个入口并指定相同的域名。
相同的概念。希望这有帮助!