nginx VirtualServer 流量切分使用

在我的另一篇文章中,我介绍了nginx 官方推出的更加强大的全局负载均衡器VirtualServer 和VirtualServerRoute,这是一种自定义资源类型,它相比于ingress支持流量切分和基于内容的高级路由,那么这篇文章就来介绍一下,流量切分的使用方法。

首先,我们创建一个namespace叫做WordPress,在这个WordPress中,我搭建了两套WordPress网站,具体的搭建yaml文件,我放在github上(这些yaml提供了搭建WordPress的完整思路,里面具体的资源因为会泄露我的集群参数,所以打码了。。。。),搭建完成之后,分别在这两个WordPress网站中创建一片文章,内容不要相同,模仿不同版本的应用。如果嫌搭建WordPress麻烦,可以直接启动两个nginx来测试,只要返回内容不同就好了。

在介绍流量切分之前,先看一下,基本的反向代理怎样配置:

可以看到,如果手动进行流量切分,那么就是切换上游服务的service的名称,这样进行访问的时候,流量就进入到不同的service中。而自动切分无非就是根据一定的条件,动态切换上游的service,以达到流量进入不同的service中。

而流量切分的配置,其实就是upstreams中,把所有的版本的service都写上,然后在routes部分,根据一定的规则进行流量切分,例如下面最简单的,基于权重进行切分:

我们设置了两个版本的权重都是50,也就是访问到这两个版本的概率一样的。

验证:刷新我们的网站,可以看到一会是v1版本,一会是v2版本。

基于权重的流量切分无疑是最简单的,可以使用另外一个指令match来实现根据一定的条件,例如根据浏览器的User-Agent,或者某个请求头的不同,来切换到不同的版本,下面的配置示例的意思是如果请求头中有curl,那么将流量转发到v2版本中,除此之外转发到v1版本中。

在v2版本的nginx配置文件中,我添加了一个响应头x_wordpress_version,以此用来验证。

这个时候,在浏览器里面进行访问,怎么刷新也只显示v1版本,而使用curl请求WordPress首页,可以看到,响应中包含自定义的响应头,说明使用curl的时候流量进入v2版本:

在match中,也可以结合split,也就是说根据一个条件的基础上,还可以根据权重进行流量切分。配置示例:

也就是说,在上面match的基础上,更改action为split,将流量按照比重进行切分,再次进入到不同的版本中,这次,全部使用curl进行验证:

在使用curl请求9次之后,最后一次没有得到x_wordpress_version的响应头,说明最后一次进入v1版本。

留下评论