Rancher - 如何公开我的服务?

Rancher - How to expose my services publicly?

我有一个 运行 Rancher 设置如下:

我的目标是使用 Rancher 负载平衡或任何类似的东西为 Web 应用程序提供服务。 为此,我执行了以下步骤:

这适用于本地网络,因为我得到一个像 http://hello.gabriel-milan.10.1.1.14.xip.io/ 这样的地址,它会解析为本地的 10.1.1.14。

我想为我的 public IP 之一公开此服务。我该怎么做?

Edit 2021-09-27: xip.io is gone, but I'm leaving those references in my response because the OP asked about xip.io. Alternatives are sslip.io and nip.io, which both function the same way. You can replace xip.io in my response with either of those to achieve the same results.

有几种方法可以做到这一点。根据您使用的无法从 Internet 访问的专用网络,节点没有 public IP,因此 Kubernetes 对映射到它们的任何 public IP 一无所知。这就是它在 EC2 或节点外发生 NAT 的任何地方的工作方式。

如果这些节点是自定义集群(您在其中安装 Docker 然后使用 Rancher 的 docker run 命令安装 RKE 并将集群加入 Rancher),那么在安装之前,您可以点击右下角的高级选项link,为每个节点设置public和私有IP。

执行此操作时,节点会收到一个包含 public IP 的标签,该地址将与您在设置 Ingress 时生成的 xip.io 主机名一起使用。

如果没有该标签,xip.io 主机名会选择节点的主 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。

顺便说一句,如果您在云提供商中,则可以将这些组合到 LoadBalancer 服务中。这将在节点上创建一个 NodePort 服务,然后连接到云提供商的 API 并部署一个云负载平衡器,然后使用节点对其进行编程,服务的端口,并在生命周期内维护该配置服务。

回顾一下:

  • 您的节点不知道它们的 public IP,因此 xip.io 主机名也不知道
  • 在您的节点前面放置一个第 4 层负载均衡器,并将流量发送到所有节点上的 80/443
  • 将您的服务更改为 ClusterIP
  • 将流量发送到负载均衡器

此外,如果您不想部署负载均衡器,作为解决方法,您可以删除 Ingress 并重新创建它,但不要自动创建 xip.io 主机名,而是选择“设置主机名”并手动创建它。如果一个节点的 public IP 是 1.2.3.4,那么您可以将其设置为 any.thing.you.want.1.2.3.4.xip.io,它将 return 1.2.3.4 进行 DNS 查询。

您无法编辑现有的 xip.io Ingress 并将其更改为不同的手动 xip.io 主机名。你必须重新创建它。

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

披露:我为 Rancher 工作。

  1. 您必须使用 type:LoadBalancer 创建一个 svc。它将为您的部署提供 public IP。 kubectl create service loadbalancer <deployment-name> --tcp=80:8000
  2. 创建svc后,必须创建ingress并在ingress中传递上面创建的svc。您必须将 host: 定义为域的 url 和要将其映射到的位置 path
  3. 在 DNS 提供商中指向 LB 的 IP。

在使用路由器的传统家庭网络中,一切都在裸机上,我想在网络上公开应用程序,只有有限的集群入口点(端口 80 和 443 分别用于 http 和 https 流量) ,无需打开任何不必要的端口,并在 ClusterIP 网络后保证工作负载和服务的安全(无需使用 NodePort 为工作负载和服务公开端口)。

None 我的节点有 public IP,只有我的路由器有。

Ingress 就是答案,因为它可以始终根据不同的主机名路由流量,同时使用相同的 IP 地址。

因为我的集群中的节点都在私人家庭网络中,所以没有关于如何执行此操作的直接说明。

此外,我想使用 xip.io 生成用于测试目的的免费 URL,这些 URL 可以在 WWW 上运行,但是通过 Rancher UI 添加入口时的 Automatically generate a .xip.io hostname 选项只会在我的本地网络上工作,而不是网络。

我为此苦恼了好几天。

但我终于想通了,这很容易。

首先,我们需要进入路由器的设置并进行一些端口转发。

假设您的路由器的 public IP 是 16.43.236.65 并且您的集群上有一个节点,其家庭网络上的内部私有 IP 是 192.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 并单击 Load Balancing 下的 Add Ingress,不幸的是 Automatically generate a .xip.io hostname 仍将在您的家庭网络中使用您节点的私有 IP,并且仅在本地工作.

相反,您可以 select Specify a hostname to use 并将您的 public IP 与 xip.io 一起使用,如下所示:

16.43.236.65.xip.io

现在配置其余的入口,我暂时将所有内容保留为默认值,我使用 Service 而不是 Workload Target Backend

现在,当您在浏览器上导航到 16.43.236.65.xip.io 时,您应该能够访问您在通过网络添加的 Ingress 中 select 编辑的服务。

如果您想使用 xip.io 添加其他服务,只需添加子域即可,例如:

another-service.16.43.236.65.xip.io

yet-another-service.16.43.236.65.xip.io

它可能看起来很神奇,但它的工作方式是通过主机名,所以你可以让任何域名指向同一个 public IP,Ingress 将知道将流量转发到哪里以及 service/workload 根据主机名使用,我觉得这很棒。 它可能看起来很神奇,但它的工作方式是通过主机名,所以你可以让任何域名指向相同的 public IP,Ingress 将知道将流量转发到哪里以及使用哪个 service/workload基于我觉得很棒的主机名。

最后,如果您想使用实际域名:在您的域名提供商的 DNS 设置中,设置指向您路由器的 public IP 的 A Record。使用我们当前的示例 16.43.236.65.

在 Rancher 上添加一个 Ingress 并指定相同的域名。

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