Rancher 2.x 负载均衡配置及使用

时间:2024-05-22 16:42:52

1、Rancher 2.x 负载均衡

我们知道 Kubernetes 支持 4 层和 7 层负载均衡策略,其中 4 层负载均衡(或外部负载均衡)支持转发 HTTP、TCP 请求到 Nodeports 上去,7 层负载均衡(或 Ingress Controller)支持根据 Host、Path 的负载均衡以及 SSL 终端,因为它只支持转发 HTTP 和 HTTPS 的请求,所以它需要监听 80 和 443 端口。4 层和 7 层负载均衡策略在 EKS、GKE、AKS 以及 RKE 在各个云平台的支持情况,参照下表。

部署集群 4 层负载均衡支持 7 层负载均衡支持
Amazon EKS AWS cloud 提供支持 AWS cloud 提供支持
Google GKE GCE cloud 提供支持 GKE cloud 提供支持
Azure AKS Azure cloud 提供支持 不支持
RKE on EC2 AWS cloud 提供支持 Nginx Ingress Controller
RKE on DigitalOcean 不支持 Nginx Ingress Controller
RKE on vSphere 不支持 Nginx Ingress Controller
RKE on Custom Hosts 不支持 Nginx Ingress Controller

注意: RKE 集群部署 7 层负载均衡底层默认支持 Nginx Ingress Controller 类型。

2、环境、软件准备

上一篇文章 Rancher 2.x 搭建及管理 Kubernetes 集群 中我们是在虚拟机上安装 RancherOS 系统,然后在 RancherOS 上启动 Rancher,并且通过 RKE 在 RancherOS 上搭建 Kubernetes 集群,这里需要的环境、软件准备跟之前大致一样。

不过今天我们得换一个方式启动 Rancher,即本机或者换一个主机启动 Rancher,那是为什么呢?这是因为 Rancher 服务启动需要监听 80 端口以及 443 端口,而默认 RKE 启动的 Nginx Ingress Controller 也需要监听 80 端口和 443 端口,如果二者都在一个主机上的话,那么 Nginx Ingress Controller 会一直显示 Initializing 状态,查看日志提示 80 或者 443 端口已占用的报错信息。然后我尝试修改 Rancher 启动命令 -p 80:80 -p 443:443 端口映射为其他端口号的时候,发现 Rancher 能够启动,但是 UI 页面始终无法访问。所以,为了解决这个端口冲突问题,我将 Rancher 服务在本机启动。

3、Rancher 部署服务

本地我已启动好了 Rancher Server,访问地址为 https://10.222.76.78,并且已参照上一篇文章中 6、Rancher 2.x 基于 RKE 搭建 Kubernetes 集群 创建好了 Kubernetes 集群名称为 my-rancheros
Rancher 2.x 负载均衡配置及使用

注意:通过 RKE 搭建 Kubernetes 集群后,可以通过 Rancher UI 页面,切换到 System 项目下工作负荷页面,查看系统各命令空间下 Kubernetes 资源以及 Rancher 资源是否显示启动正常。尤其要注意命名空间 ingress-nginx 下的 default-http-backend 以及 nginx-ingress-controller 是否正常启动完毕,如果这里显示启动不正常的话,那么下边无法正常使用 Ingress 负载均衡配置。
Rancher 2.x 负载均衡配置及使用
接下来我们通过 Rancher 部署两个简单的服务: my-nginxmy-tomcat,顾名思义就是部署 nginx 和 tomcat 两个简单服务,方便下边演示 Ingress 负载均衡配置。my-nginx 服务部署这里可以参照 7、Rancher 部署服务 文章里的配置即可,同样映射容器内 80 端口到主机 30001 端口,这里就不演示了,贴一下部署完成之后的页面。
Rancher 2.x 负载均衡配置及使用
本地通过 NodePort 端口访问一下 http://192.168.99.102:30001 也是没有问题的。
Rancher 2.x 负载均衡配置及使用
同理,我们部署一个 my-tomcat 服务,使用 tomcat:alpine 镜像,映射容器内 8080 端口到主机 30002 端口,贴一下部署完成之后的页面。
Rancher 2.x 负载均衡配置及使用
本地访问一下 http://192.168.99.102:30002 也是没有问题的。
Rancher 2.x 负载均衡配置及使用
同时可以看到 Rancher 为每个服务创建了两个 Service 类型,一个为 ClusterIP 方式,一个为 NodePort,而这些就是下边 Ingress 配置负载均衡转发到的 Service。
Rancher 2.x 负载均衡配置及使用

4、Rancher Ingress 负载均衡配置

服务已经部署完毕,而且服务发现也已经有了,接下来就可以配置负载均衡了。上边说到 Ingress Controller 支持根据 Host、Path 的负载均衡,那么分别来演示下。

4.1、Ingress Base Host

登录 Rancher UI 页面,切换到 my-rancheros 集群下 Default 项目下的负载均衡页面,点击 “添加Ingress” 按钮来配置 Ingress。这里我使用 my-nginx.k8s.com 域名来绑定到指定的 my-nginx 服务上。
Rancher 2.x 负载均衡配置及使用
配置完成后,稍等片刻即可显示 Active 状态,说明 Ingress 已生效。
Rancher 2.x 负载均衡配置及使用
此时,我们将 my-nginx.k8s.com 域名绑定一下本地 Host 即可浏览器访问啦!绑定的 IP 为 Kubernetes Cluster Master IP,这里因为我创建在 RancherOS 里面,所以这里需要绑定创建的 rancheros 虚拟机 IP。

$ docker-machine ip rancheros
192.168.99.102
$ echo "192.168.99.102 my-nginx.k8s.com" >> /etc/hosts

Rancher 2.x 负载均衡配置及使用
注意:默认目标后端是基于工作负荷的,这个工作负荷是个啥呢?选择工作负荷类型,Rancher 会自动帮我们创建一个 Ingress 绑定的 Service,例如上边操作自动创建了 ingress-00a468ccd101703fea1965f2f1786811 Service。当然,我们也可以选择服务类型,选择已存在的 my-nginxmy-nginx-nodeport 服务,那么就不用在创建了,直接就可以使用。
Rancher 2.x 负载均衡配置及使用
后台通过 Kubectl 命令获取一下 Service 也可以看到。

$ kubectl get svc -n my-namespaces
NAME                                       TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
ingress-00a468ccd101703fea1965f2f1786811   ClusterIP   10.43.227.135   <none>        80/TCP           23m
my-nginx                                   ClusterIP   10.43.165.62    <none>        80/TCP           57m
my-nginx-nodeport                          NodePort    10.43.165.31    <none>        80:30001/TCP     57m
my-tomcat                                  ClusterIP   10.43.131.119   <none>        8080/TCP         54m
my-tomcat-nodeport                         NodePort    10.43.36.241    <none>        8080:30002/TCP   54m

4.2、Ingress Base Path

接下来,我们根据不同的 Path 来分别访问不同的 Service,例如通过 my-ingress.k8s.com/nginx 来访问 my-nginx 服务,通过 my-ingress.k8s.com/tomcat 来访问 my-tomcat 服务,添加 Ingress 配置如下所示。
Rancher 2.x 负载均衡配置及使用
注意:根据 Path 来访问不同的 Service,需要配置后端重写,具体方法就是以注释的方式添加到 Ingress 中,这里我们需要配置注释项 nginx.ingress.kubernetes.io/rewrite-target=/
Rancher 2.x 负载均衡配置及使用
配置完毕后,本地将 my-ingress.k8s.com 域名绑定一下本地 Host 即可浏览器分别访问啦!

$ echo "192.168.99.102 my-ingress.k8s.com" >> /etc/hosts

Rancher 2.x 负载均衡配置及使用
Rancher 2.x 负载均衡配置及使用
妥妥没有问题,可以看到上边我选择目标后端为服务类型,并选择了 my-nginxmy-tomcat-nodeport 服务,也是一样可以的。

5、tomcat-i18n demo 示例演示

好了,上边演示了通过 Rancher UI 如何配置 Ingress 来实现负载均衡的,不过例子中都是比较简单的服务,那这里我在演示一下如何制作一个服务镜像并通过 Rancher 运行在 Kubernetes 集群中吧!由于之前文章 基于jQuery.i18n.properties 实现前端页面的资源国际化 一文中,诸多网友下载了源码后依旧运行不起来,各种报错等情况,我再次说明一下:源码没有问题,亲测可行,注意要在 tomcat 等服务器中运行,修改项目名时注意修改 cookie 存储域 Path。那我就以这个 i18n demo 为例,将源码添加到 tomcat 镜像中,最终通过 Rancher 部署在 Kubernetes 集群中并配置 Ingress 访问它吧!

下载 Demo 源码 到本地并解压,在项目 i18n 同级目录创建 Dockerfile 如下:

$ vim Dockerfile.tomcat
FROM tomcat:alpine

MAINTAINER wanyang3 <[email protected]>

ADD i18n  /usr/local/tomcat/webapps/i18n/

然后 Build 镜像并 Push 到 Dockerhub 仓库中,供后续服务部署拉取镜像。

$ docker build -t huwanyang168/tomcat-i18n:alpine -f Dockerfile.tomcat .
$ docker push huwanyang168/tomcat-i18n:alpine

注意:如果 push 不上去,有可能是未登录 DockerHub 仓库,登录以后再次执行 Push 即可,注意自己制作镜像时需要修改 huwanyang168 为自己的 DockerHub 仓库名称。

部署服务之前,本地启动一下该镜像,测试下有问题木有。

$ docker run -d --rm -p 9000:8080 huwanyang168/tomcat-i18n:alpine

本地浏览器访问 http://127.0.0.1:9000/i18n 试下,妥妥没有问题的嘛!
Rancher 2.x 负载均衡配置及使用
接着,我们就可以去 Rancher UI 上部署一个新的服务为 my-tomcat-i18n 的服务了。
Rancher 2.x 负载均衡配置及使用
稍等片刻,等服务 my-tomcat-i18n 状态为 Active 后,本地通过 NodePort 访问一下 http://192.168.99.102:30003/i18n/ 也是妥妥没有问题的呦!
Rancher 2.x 负载均衡配置及使用
最后,配置一下 Ingress 负载均衡,通过 my-tomcat.k8s.com/i18n 来访问 my-tomcat-i18n 服务,为什么这里 URL 我要带上 /i18n?那是因为在 js 中配置的 cookie 存储域 Path 为 i18n,如果不带该路径就会出现存储域跟读取域不一致,导致的切换语言时加载不到选择的语言值。如果想不带 i18n 路径,那么就需要修改 js 中 cookie 存储域 path 为空。
Rancher 2.x 负载均衡配置及使用
配置完毕后,本地将 my-tomcat.k8s.com 域名绑定一下本地 Host 即可浏览器访问啦!

$ echo "192.168.99.102 my-tomcat.k8s.com" >> /etc/hosts

Rancher 2.x 负载均衡配置及使用
Rancher 2.x 负载均衡配置及使用
Rancher 2.x 负载均衡配置及使用

同样妥妥没有问题的!

参考资料