文章目录
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
。
注意:通过 RKE 搭建 Kubernetes 集群后,可以通过 Rancher UI 页面,切换到 System 项目下工作负荷页面,查看系统各命令空间下 Kubernetes 资源以及 Rancher 资源是否显示启动正常。尤其要注意命名空间 ingress-nginx
下的 default-http-backend
以及 nginx-ingress-controller
是否正常启动完毕,如果这里显示启动不正常的话,那么下边无法正常使用 Ingress 负载均衡配置。
接下来我们通过 Rancher 部署两个简单的服务: my-nginx
和 my-tomcat
,顾名思义就是部署 nginx 和 tomcat 两个简单服务,方便下边演示 Ingress 负载均衡配置。my-nginx
服务部署这里可以参照 7、Rancher 部署服务 文章里的配置即可,同样映射容器内 80
端口到主机 30001
端口,这里就不演示了,贴一下部署完成之后的页面。
本地通过 NodePort 端口访问一下 http://192.168.99.102:30001
也是没有问题的。
同理,我们部署一个 my-tomcat
服务,使用 tomcat:alpine
镜像,映射容器内 8080
端口到主机 30002
端口,贴一下部署完成之后的页面。
本地访问一下 http://192.168.99.102:30002
也是没有问题的。
同时可以看到 Rancher 为每个服务创建了两个 Service 类型,一个为 ClusterIP
方式,一个为 NodePort
,而这些就是下边 Ingress 配置负载均衡转发到的 Service。
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
服务上。
配置完成后,稍等片刻即可显示 Active
状态,说明 Ingress 已生效。
此时,我们将 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 会自动帮我们创建一个 Ingress 绑定的 Service,例如上边操作自动创建了 ingress-00a468ccd101703fea1965f2f1786811
Service。当然,我们也可以选择服务类型,选择已存在的 my-nginx
和 my-nginx-nodeport
服务,那么就不用在创建了,直接就可以使用。
后台通过 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 配置如下所示。
注意:根据 Path 来访问不同的 Service,需要配置后端重写,具体方法就是以注释的方式添加到 Ingress 中,这里我们需要配置注释项 nginx.ingress.kubernetes.io/rewrite-target=/
。
配置完毕后,本地将 my-ingress.k8s.com
域名绑定一下本地 Host 即可浏览器分别访问啦!
$ echo "192.168.99.102 my-ingress.k8s.com" >> /etc/hosts
妥妥没有问题,可以看到上边我选择目标后端为服务类型,并选择了 my-nginx
和 my-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 UI 上部署一个新的服务为 my-tomcat-i18n
的服务了。
稍等片刻,等服务 my-tomcat-i18n
状态为 Active
后,本地通过 NodePort 访问一下 http://192.168.99.102:30003/i18n/
也是妥妥没有问题的呦!
最后,配置一下 Ingress 负载均衡,通过 my-tomcat.k8s.com/i18n
来访问 my-tomcat-i18n
服务,为什么这里 URL 我要带上 /i18n
?那是因为在 js 中配置的 cookie 存储域 Path 为 i18n,如果不带该路径就会出现存储域跟读取域不一致,导致的切换语言时加载不到选择的语言值。如果想不带 i18n 路径,那么就需要修改 js 中 cookie 存储域 path 为空。
配置完毕后,本地将 my-tomcat.k8s.com
域名绑定一下本地 Host 即可浏览器访问啦!
$ echo "192.168.99.102 my-tomcat.k8s.com" >> /etc/hosts
同样妥妥没有问题的!
参考资料