10.0.0.10 |
Nginx |
10.0.0.11 |
service1 |
10.0.0.12 |
service2 |
1:使用Cookie实现灰度
根据Cookie查询Cookie键为version的值,如果该Cookie值为v1则转发到service1,为v2则转发到service2。Cookie值都不匹配的情况下默认走service1所对应的服务器
upstream service1 {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
upstream service2 {
server 10.0.0.12:80 max_fails=1 fail_timeout=60;
}
upstream default {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name www.kubernetes-devops.cn;
access_log /var/log/nginx/kubernetes-devops_cn.log main;
set $group "default";
if ($http_cookie ~* "version=v1"){
set $group service1;
}
if ($http_cookie ~* "version=v2"){
set $group service2;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
# 测试如下
[root@virtual_host ~]# curl 127.0.0.1 --cookie "version=v1"
v1
[root@virtual_host ~]# curl 127.0.0.1 --cookie "version=v2"
v2
2:使用map匹配cookie实现灰度发布
用map指令实现:
# 在Nginx里面配置一个映射,COOKIE_version可以解析出version字段,group是一个变量,{}里面是映射规则
如果一个version为v1的用户来访问,
group就等于service1,在server里面使用就会代理到 http://service1
如果一个version为v2的用户来访问,
group就等于service2,在server里面使用就会代理到 http://service2
Cookie值都不匹配的情况下默认走service1所对应的服务器
# 配置如下
upstream service1 {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
upstream service2 {
server 10.0.0.12:80 max_fails=1 fail_timeout=60;
}
upstream default {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
map $COOKIE_version $group {
~*v1$ service1;
~*v2$ service2;
default default;
}
server {
listen 80;
server_name www.kubernetes-devops.cn;
access_log /var/log/nginx/www.kubernetes-devops_log main;
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
# 测试
[root@virtual_host ~]# curl www.kubernetes-devops.cn --cookie "version=v1"
v1
[root@virtual_host ~]# curl www.kubernetes-devops.cn --cookie "version=v2"
v2
3:根据来源IP实现灰度发布
# 如果是本机,则反向代理到service2;如果不是则反向代理到service1。
# 如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的
[root@virtual_host ~]# cat /etc/nginx/nginx.conf
---
upstream service1 {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
upstream service2 {
server 10.0.0.12:80 max_fails=1 fail_timeout=60;
}
upstream default {
server 10.0.0.11:80 max_fails=1 fail_timeout=60;
}
server {
listen 80;
server_name www.kubernetes-devops.cn;
access_log /var/log/nginx/www.kubernetes-devops_log main;
set $group default;
if ($remote_addr ~ "10.0.0.10") {
set $group service2;
}
location / {
proxy_pass http://$group;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
index index.html index.htm;
}
}
# 如果你只有单台服务器,可以根据不同的IP设置不同的网站根目录来达到相同的目的
server {
listen 80;
server_name www.kubernetes-devops.cn;
access_log /var/log/nginx/www.kubernetes-devops_log main;
set $rootdir "/var/www/html";
if ($remote_addr ~ "10.0.0.10") {
set $rootdir "/var/www/v2";
}
location / {
root $rootdir;
}
}
# 测试
[root@nginx ~]# curl www.kubernetes-devops.cn
v2
# 去另一个主机操作访问
[root@web1 ~]# curl www.kubernetes-devops.cn
v1
# 到此最基本的实现灰度发布方法就讲解完了,如果要做更细粒度灰度发布可参考ABTestingGateway项目