Rancher - 如何公开我的服务?

Gab*_*lan 3 load-balancing kubernetes rancher kubernetes-ingress rke

我有一个正在运行的 Rancher 设置,如下所示:

  • 主机(运行牧场主/牧场主容器)在公共 IP 上;
  • 无法从 Internet 访问的专用网络 (10.1.1.0/24) 中的节点。

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

  • 在将端口 80/tcp 映射为名为“web-app”的 NodePort(侦听端口是随机的)的 3 个 pod 上使用“rancher/hello-world”映像部署工作负载;
  • 在相同的命名空间中添加名为“hello”的 Ingress,选择“自动生成.xip.io主机名”并将路由“/”添加到端口 80 上的“web-app”。

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

我想为我的一个公共 IP 公开此服务。我怎样才能做到这一点?

mon*_*hus 6

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

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

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

如果没有该标签,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 并部署一个云负载均衡器,然后使用节点、服务的端口对其进行编程,并在服务的生命周期内维护该配置。

回顾一下:

  • 你的节点不知道他们的公共 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.ioIngress 并将其更改为不同的手动xip.io主机名。你必须重新创建它。

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

披露:我为 Rancher 工作。