如所述,Rancher v1.6 使用基于 HAProxy 的微服务提供负载均衡的能力,该服务支持 HTTP,HTTPS,TCP 主机名和基于路径的路由。v2.x 中提供了大多数这些相同的功能。但是,您在 v1.6 中使用的负载均衡器无法迁移到 v2.x。您必须在 v2.x 中手动重新创建 v1.6 中的负载均衡器。

如果在由 v1.6 Compose 文件转化为 Kubernetes 清单后,遇到下面的中的内容,您必须通过在 v2.x 中手动创建负载均衡器来解决它。

解决“output.txt”中的Load Balancer问题

默认情况下,Rancher v2.x 用原生替换了 v1.6 负载均衡器微服务,该服务由 NGINX Ingress Controller 支持,用于 7 层负载均衡。默认情况下,Kubernetes Ingress 仅支持 HTTP 和 HTTPS 协议,不支持 TCP。使用 Ingress 时,负载均衡仅限于这两种协议。

负载均衡器部署

在 Rancher v1.6 中,您可以添加端口/服务规则,配置 HAProxy 以实现目标服务的负载均衡。您还可以配置基于主机名/路径的路由规则。

Rancher v2.x 提供了类似的功能,但是负载均衡由 Ingress 处理。Ingress 是负载均衡器规则的规范,由一个控制器来将这些规则应用到您的负载均衡上。实际的负载均衡器可以在集群之外或集群中运行。

默认情况下,Rancher v2.x 在使用 RKE(Rancher 自己的 Kubernetes 安装程序)配置的集群上部署 NGINX Ingress Controller,以处理 Kubernetes Ingress 规则。默认情况下,NGINX Ingress Controller 仅安装在 RKE 配置的集群中。由云服务提供商(如 GKE)配置的集群具有自己的 Ingress Controller,用于配置负载均衡器。对于本文档,我们的范围仅限于 RKE 安装的 NGINX Ingress Controller。

RKE 将 NGINX Ingress Controller 部署为 Kubernetes DaemonSet,这意味着 NGINX 实例已部署在集群中的每个节点上。NGINX 会作为一个 Ingress Controller,侦听在整个集群中的 Ingress 的创建,并且还将其自身配置为负载均衡器,以满足 Ingress 规则。这个 DaemonSet 使用主机网络并且暴露了两个端口:80 和 443。

有关更多关于 NGINX Ingress Controller 的信息,部署配置选项等,请查看。

将 Ingress Controller 作为 DaemonSet 部署在 v2.x 中,带来了 v1.6 用户应该了解的一些体系结构更改。

在 Rancher v1.6 中,您可以在堆栈中部署可伸缩的负载均衡器服务。如果您在 Cattle 环境中有四个主机,则可以部署规模为 2 的负载均衡器服务,并通过将端口 80 附加到两个主机 IP 地址来指向您的应用程序。您还可以在其余两台主机上启动另一个负载均衡器,以再次使用端口 80 均衡另一服务,因为您的负载均衡器正在使用不同的主机 IP 地址。

Rancher v1.6 负载均衡架构

Rancher v1.6 负载均衡

Rancher v2.x 负载均衡架构

Ingress 警告

尽管 Rancher v2.x 支持基于 HTTP 和 HTTPS 的主机名和路径的负载均衡,但是在配置工作负载时必须使用唯一的主机名和路径。此限制源自:

  • Ingress 限制端口为 80 和 443 (即用于路由的 HTTP[S]端口)。
  • 负载均衡器和 Ingress Controller 作为 DaemonSet 在集群中全局启动。

您可以启动新的负载均衡器来替换您的 v1.6 负载均衡器。使用 Rancher v2.x UI,浏览到适用的项目并选择 资源 > 工作负载 > 负载均衡。(在 v2.3.0 之前的版本中,单击 工作负载 > 负载均衡) 然后点击 添加规则。在部署期间,您可以选择目标项目或命名空间。

工作负载规格

为了在这两个 pods 之间保持平衡,您必须创建一个 Kubernetes Ingress 规则。要创建此规则,请导航到您的集群和项目,然后单击资源>工作负载>负载均衡。(在 v2.3.0 之前的版本中,单击工作负载>负载均衡)然后单击添加规则。下面的 GIF 描述了如何将 Ingress 添加到您的一个项目中。

添加规则

与 Rancher v1.6 中的服务/端口规则类似,您可以在此处指定针对工作负载的容器端口规则。以下各节说明了如何创建 Ingress 规则。

使用 Rancher v2.x,您可以添加基于主机名或 URL 路径的 Ingress 规则。根据您创建的规则,NGINX Ingress Controller 会将流量路由到多个目标工作负载或 Kubernetes 服务。

例如,假设您有多个工作负载部署到了一个命名空间里。如下图所示,您可以添加一个 Ingress,以使用相同的主机名但使用不同的路径将流量路由到这两个工作负载。对 foo.com/name.html的 URL 请求会将用户定向到web工作负载,而对foo.com/login的 URL 请求将用户定向到chat工作量。

Ingress: 基于路径的路由配置

Ingress:基于路径的路由配置

工作负载链接

Ingress 地址是 Ingress Controller 为您的工作负载分配的集群中的 IP 地址。您可以通过浏览到该 IP 地址来访问您的工作负载。使用下面的命令查看控制器分配的 Ingress 地址:

Rancher v2.x Ingress 功能支持 HTTPS 协议,但如果要使用它,则需要使用有效的 SSL/TLS 证书。在配置 Ingress 规则时,请使用SSL/TLS 证书部分来配置证书。

负载均衡配置:SSL/TLS证书部分

四层负载均衡器

对于 TCP 协议,Rancher v2.x 支持配置 4 层负载均衡器。这个 4 层负载均衡器是由您的集群所在的云服务提供商提供的。在您配置了 Cloud Provider 之后,当您在部署工作负载时,您可以选择4 层负载均衡器选项进行端口映射时。Rancher 会自动创建相应的负载均衡服务。该服务将连接相应的云提供商,来配置负载均衡器,从而将请求路由到适当的 pod。有关如何为您的云提供商配置 Cloud Provider,查看配置 Cloud Provider

例如,如果我们创建名为myapp的部署并在端口映射部分中指定 4 层负载均衡器,则 Rancher 会自动将一个名为myapp-loadbalancer的条目添加到负载均衡器选项卡中。

工作负载部署:创建4层负载均衡器

负载均衡器的配置成功后,Rancher UI 将提供指向工作负载的公共端点的链接。

通过配置 ConfigMaps 使 NGINX Ingress Controller 支持 TCP

尽管 NGINX 支持 TCP,但 Kubernetes Ingress 本身不支持 TCP 协议。所以 NGINX Ingress Controller 无法做到开箱即用的 TCP 协议支持。

然而,有一种解决方法,可以通过创建 Kubernetes ConfigMap 来使用 NGINX 的 TCP 负载均衡。如Ingress GitHub 自述文件。您可以创建一个 ConfigMap 对象,该对象将 pod 配置参数存储为键值对,与 pod 镜像分开,如 。

如果要通过配置 NGINIX 以 TCP 的协议暴露您的服务,您可以配置在ingress-nginx命名空间中的名称为的 ConfigMap。该命名空间也包含 NGINX Ingress Controller 容器。

4层负载均衡器:ConfigMap解决方法

Rancher v2.x 负载均衡限制

Cattle 提供了功能丰富的负载均衡器支持,可以参阅。其中一些功能在 Rancher v2.x 中没有等效功能。以下是这些功能的列表:

  • 当前的 NGINX Ingress Controller 不支持 SNI。
  • TCP 负载均衡需要集群中的云提供商启用的负载均衡器设备。Kubernetes 上没有对 TCP 的 Ingress 支持。
  • 只能用 80 端口和 443 端口来路由 HTTP/HTTPS 请求。Ingress Controller 通过 DaemonSet 的方式全局部署,所以不作为可伸缩服务来启动。此外,用户不能分配随机的外部端口用于均衡。因此,用户需要确保配置唯一的主机名/路径组合,以避免使用相同的两个端口而导致的路由冲突。
  • 无法指定端口规则优先级和顺序。
  • Rancher v1.6 添加了对优雅停止后端连接和指定优雅停止超时的支持。Rancher v2.x 不支持此功能。