牧场主 - 如何公开我的服务



我有一个正在运行的牧场主设置如下:

  • 公共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.ionip.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.4DNS 查询。

您只是无法编辑现有的xip.io入口并将其更改为其他手动xip.io主机名。您必须重新创建它。

在此解决方法中,流量仍会进入入口控制器,因此您仍然可以将服务从 NodePort 更改为 ClusterIP。

披露:我为牧场主工作。

  1. 你必须创建一个带有type:LoadBalancer的 svc 。它将为您的部署提供公共 IP。kubectl create service loadbalancer <deployment-name> --tcp=80:8000
  2. 创建 SVC 后,您必须在入口中创建入口并传递上方创建的 SVC。您必须将host:定义为域的 url 以及要映射它path的位置。
  3. 将 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

在路由器的设置中,将所有端口80443流量转发到其中一个节点的端口80443,使其实质上如下所示:

16.43.236.65:80->192.168.0.155:80

16.43.236.65:443->192.168.0.155:443

完成后,返回Rancher并单击Add IngressLoad 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上添加一个入口并指定相同的域名。

相同的概念。希望这有帮助!

相关内容

  • 没有找到相关文章

最新更新