Rancher - 如何公开我的服务?

Posted

技术标签:

【中文标题】Rancher - 如何公开我的服务?【英文标题】:Rancher - How to expose my services publicly? 【发布时间】:2020-09-21 06:31:57 【问题描述】:

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

公有 IP 上的主机(运行 rancher/rancher 容器); 无法从 Internet 访问的专有网络 (10.1.1.0/24) 中的节点。

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

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

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

我想为我的一个公共 IP 公开这项服务。我该怎么做?

【问题讨论】:

【参考方案1】:

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

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

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

当您执行此操作时,节点会收到一个包含公共 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 并部署云负载均衡器,然后使用节点、服务端口对其进行编程,并在服务的生命周期内维护该配置。

回顾一下:

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

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

披露:我为 Rancher 工作。

【讨论】:

抱歉耽搁了。你的意思是这样的吗? rancher.com/docs/rancher/v2.x/en/installation/options/… 是的,该页面显示了如何使用 Layer4 负载均衡器和在节点上运行的入口控制器。 太棒了。我能够使用默认的 Rancher 设置、我的主机上的第 4 层 LB 和 this 使其工作。非常感谢 xip.io 已死,但您可以使用 sslip.io 或 nip.io 遵循相同的说明。【参考方案2】:
    您必须使用type:LoadBalancer 创建一个 svc。它将为您的部署提供一个公共 IP。 kubectl create service loadbalancer <deployment-name> --tcp=80:8000 一旦你创建了 svc,你必须创建 ingress 并在 ingress 中传递上面创建的 svc。您必须将host: 定义为域的url,并将path 定义为要映射它的位置。 在 DNS 提供商中指向 LB 的 IP。

【讨论】:

为了让 LoadBalancer Service 工作,他必须在支持它的云提供商中。如果他在对其流量进行 NAT 的路由器后面的本地环境中运行,则此答案将不起作用。此外,为每个 Service 创建一个 LoadBalancer 然后将 Ingress 指向它是倒退的。他可以创建一个 ELB 或 NLB 并将其指向他的节点,然后整天创建 Ingress 并将 DNS 指向他所有主机的 LB。一磅。许多入口。钱包上好多了。【参考方案3】:

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

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

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

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

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

我为此苦恼了好几天。

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

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

假设您的路由器的公共 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,并且只能在本地工作。

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

16.43.236.65.xip.io

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

现在,当您在浏览器上导航至 16.43.236.65.xip.io 时,您应该能够访问您在通过网络添加的 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 设置中设置一个指向您路由器公共 IP 的 A Record。使用我们当前的示例,即16.43.236.65

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

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

【讨论】:

以上是关于Rancher - 如何公开我的服务?的主要内容,如果未能解决你的问题,请参考以下文章

RANCHER2.0 的简单使用

Centos7 Docker安装部署Rancher

如何在Rancher Catalog中使用VMware Harbor

Rancher 2.x 生产环境HA(高可用)部署

云原生加速容器技术落地 Rancher如何做好赋能者?

docker部署rancher