5

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

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

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

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

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

4

3 回答 3

8

编辑 2021-09-27:xip.io不见了,但我在回复中留下了这些参考资料,因为 OP 询问了xip.io. 替代品是sslip.ionip.io,它们的功能相同。您可以xip.io在我的回复中用其中任何一个替换以获得相同的结果。

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

如果这些节点是自定义集群(安装 Docker,然后使用docker runRancher 中的命令安装 RKE 并将集群加入到 Rancher),那么在安装之前,您可以单击右下角的 Advanced Options 链接并设置每个节点的公共和私有 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 工作。

于 2020-06-02T22:06:52.127 回答
1
  1. 您必须使用type:LoadBalancer. 它将为您的部署提供一个公共 IP。kubectl create service loadbalancer <deployment-name> --tcp=80:8000
  2. 一旦你创建了 svc,你必须创建 ingress 并在 ingress 中通过上面创建的 svc。您必须定义host:为域的 url 以及path要映射它的位置。
  3. 将 LB 的 IP 指向 DNS 提供商。
于 2020-06-03T07:03:09.280 回答
0

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

我的节点都没有公共 IP,只有我的路由器有。

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

因为我的集群中的节点都在一个私有家庭网络中,所以没有关于如何做到这一点的简单说明。

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

我为此头疼了好几天。

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

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

假设您的路由器的公共 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 并单击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而不是Workloadfor Target Backend

现在,在16.43.236.65.xip.io浏览器上导航到时,您应该能够访问您在通过 Web 添加的 Ingress 中选择的服务。

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

another-service.16.43.236.65.xip.io

yet-another-service.16.43.236.65.xip.io

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

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

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

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

于 2021-03-24T19:16:59.207 回答