Rancher 2.x 负载均衡并绑定域名对外提供服务
ingress 暴露服务
在上一篇中,我们部署了一个 Go 应用,在这一小节中,我们将增加其副本并且做负载均衡。
在最开始我们一共有三台节点,其中一台跑 Rancher,一台 Master 和一台 Node,既然是负载,那肯定是需要将 pod 运行在两个节点上,所以我们需要新增一个主机节点,由于我的电脑内存即将吃紧所以对其配置进行了调整。
机器 | ip | 配置 | 备注 |
---|---|---|---|
CentOS7 | 192.168.0.199 | 2cpu 4G ram | Rancher |
CentOS7 | 192.168.0.210 | 2cpu 4G ram | Master |
CentOS7 | 192.168.0.211 | 2cpu 2G ram | Node |
CentOS7 | 192.168.0.212 | 1cpu 2G ram | Node |
我的那一台电脑一共是有 16G 已经无法再增加节点了,所以我们为了模拟多节点,我们只能通过削减其他虚拟机的配置空闲出来一些资源,然后新建一个虚拟机。
我们重复第一章的内容,然后将其加入节点。
我们找到集群,然后点击编辑,在页面的最下方,还有增加节点的方法。
当皆甜增加完成后,我们来调整在上一章节中部署的 goapi 应用。
我们 Deployment 部署位 2 个 Pods,同时将端口映射修改为了 NodePort
我们可以看到在两个节点上都调度了 pod,但是出现了报错,这是因为在 worker 宿主机上没有我们设置的目录,我们只需要将可执行文件以相同位置上传上去即可,后续更好的解决方案肯定是 CICD,我会在后面的章节进行讲解。
上传完成后,很快就完成了部署。
由于节点选择的事 NodePort 我们只能通过节点的 IP 地址来对应用进行访问,这很明显不是我们想要的效果,我们一般对外提供服务都是使用域名的形式,然后通过反向代理进行负载均衡到我们的后台计算节点。
在 k8s 中如果想要实现这一效果我们就需要使用 ingress 对外暴露我们的服务。
Ingress 相当于一个 7 层的负载均衡,我们可以理解为是一个反向代理并定义规则的一个 api 对象。Ingress Controller 通过监听 ingress api 转换为各自的配置(常用的有 nginx-ingress,trafik-ingress)。
我们点击负载均衡,然后添加规则。
k8s 为我们提供了一个域名后缀,但是我们通常不会使用,我们来使用自定义域名,其中端口号就是我们要暴露的 80 的端口,我们对外访问的时候,选择的也是这个。
由于是在虚拟集中创建的集群,所以我们绑定域名最简单的方案是修改本地 host 文件,域名直接指向任意一个 worker 节点(Ingress 通过边缘节点对外提供服务,所以如果在生产环境,建议利用 keeplived + lvs 对外提供服务,避免单点故障)。
# maksim.website vitralbox
192.168.0.211 goapi.maksim.website
新件号 ingress 后我们等待完成状态。
我们特意将 woker2 节点上的代码进行了修改,为的就是能够演示出 worker 的样子。
配置 SSL 证书
我们的线上服务一般都会有配置证书的需求,在 Rancher 中配置证书非常容易,我们只需要在资源中选择密文,在选择证书,添加证书即可。
这里需要注意,我们需要进入到 project 下才可以看到资源文件夹。
作用域我们需要注意,这里选择为整个项目或者单个命名空间生效,在这里,我们选择了 myweb。
证书的神情,可以到阿里云免费的 SSL 证书。
添加完证书后,我们修改 goapi 的负载均衡,找到 SSL/TLS 证书选项卡,点击添加证书。
选择我们的证书后,填写对应的域名。点击保存。
当我们访问后就会发现证书已经生效了,在浏览器中显示以增强安全性。
路径重写
当我们要去做路径重写的时候,其实只需要做两项配置即可,如果在 nginx 中我们还需要修改配置文件,然后在 reload,其实 k8s 中的重写和 nginx 基本一致,因为其底层使用的就是 nginx。
例如我们的 goapi这个项目,如果我们想通过 https://goapi.maksim.website/api 来访问我们的接口。我们可以像下面这样操作。
我们先是增加重写规则,表示将 /api/转发到项目上 (.*)代表了分组,也就是我们的重写部分,然后在标签和注释中增加注释。
nginx.ingress.kubernetes.io/rewrite-target = /$1
我们去访问项目。
这个时候我们发现已经是 404 状态了,增加 /api/ 再来看一下。
项目可以访问了。