蓝绿发布

蓝绿部署是不停老版本,部署新版本然后进行测试,确认OK后将流量逐步切到新版本。蓝绿部署无需停机,并且风险较小。

示例

本例是一个 nginx 应用,包含一个 deployment、 service 以及 ingress。deployment 通过 NodePort 对外暴露端口,并且有一个 ingress 正在对外提供服务。编排模板如下。

步骤一 部署版本1的应用(old-nginx)

编排模板如下:

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

name:old-nginx

spec:

replicas:2

selector:

matchLabels:

run:old-nginx

template:

metadata:

labels:

run:old-nginx

spec:

containers:

-image:registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx

imagePullPolicy:Always

name:old-nginx

ports:

-containerPort:80

protocol:TCP

restartPolicy:Always

---

apiVersion:v1

kind:Service

metadata:

name:old-nginx

spec:

ports:

-port:80

protocol:TCP

targetPort:80

selector:

run:old-nginx

sessionAffinity:None

type:NodePort

---

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

name:gray-release

spec:

rules:

-host:www.example.com

http:

paths:

# 老版本服务

-path:/

backend:

serviceName:old-nginx

servicePort:80

配置CodePipeline项目进行部署:

登录Master节点,查询Ingress的访问地址

# kubectl get ing

NAME HOSTS ADDRESS PORTS AGE

gray-release www.example.com47.97.238.11808m

执行curl命令,查看路由的访问情况:

#curl -H "Host: www.example.com" http://47.97.238.11

old

步骤二 创建新版本的应用(new-nginx)

编排模板如下:

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

name:new-nginx

spec:

replicas:1

selector:

matchLabels:

run:new-nginx

template:

metadata:

labels:

run:new-nginx

spec:

containers:

-image:registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx

imagePullPolicy:Always

name:new-nginx

ports:

-containerPort:80

protocol:TCP

restartPolicy:Always

---

apiVersion:v1

kind:Service

metadata:

name:new-nginx

spec:

ports:

-port:80

protocol:TCP

targetPort:80

selector:

run:new-nginx

sessionAffinity:None

type:NodePort

---

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

name:gray-release

annotations:

# 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中

#nginx.ingress.kubernetes.io/service-match: |

# new-nginx: header("foo", /^bar$/)

nginx.ingress.kubernetes.io/service-weight:|

new-nginx:${NEW_PER},old-nginx:${OLD_PER}

spec:

rules:

-host:www.example.com

http:

paths:

# 老版本服务

-path:/

backend:

serviceName:old-nginx

servicePort:80

# 新版本服务

-path:/

backend:

serviceName:new-nginx

servicePort:80

此处我们在编排模板中设置了${NEW_PER}和${OLD_PER}两个环境变量来帮助调节路由权重。 您可通过灵活调整这两个值来设置蓝绿发布的流量占比。

配置CodePipeline项目进行部署:

设置NEW_PER为0,OLD_PER为100进行部署:

执行curl命令,查看路由的访问情况:

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

设置NEW_PER为50,OLD_PER为50进行部署:

执行curl命令,查看路由的访问情况:

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

new

#curl -H "Host: www.example.com" http://47.97.238.11

new

#curl -H "Host: www.example.com" http://47.97.238.11

old

设置NEW_PER为100,OLD_PER为0进行部署:

执行curl命令,查看路由的访问情况:

#curl -H "Host: www.example.com" http://47.97.238.11

new

#curl -H "Host: www.example.com" http://47.97.238.11

new

#curl -H "Host: www.example.com" http://47.97.238.11

new

#curl -H "Host: www.example.com" http://47.97.238.11

new

完成新版本应用测试后,您可将 Ingress 的路由权重设置为 100 将流量完全导向新服务;或者删除 Ingress 中的注解和旧版本服务,实现蓝绿发布。

灰度发布

灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。让一部分用户继续用A,一部分用户开始用B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。

假若我们希望请求头中满足foo=bar的客户端请求才能路由到新版本服务(new-nginx)中,那么我们可以如下修改配置ingress规则:

编排模板如下:

apiVersion:extensions/v1beta1

kind:Deployment

metadata:

name:new-nginx

spec:

replicas:1

selector:

matchLabels:

run:new-nginx

template:

metadata:

labels:

run:new-nginx

spec:

containers:

-image:registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx

imagePullPolicy:Always

name:new-nginx

ports:

-containerPort:80

protocol:TCP

restartPolicy:Always

---

apiVersion:v1

kind:Service

metadata:

name:new-nginx

spec:

ports:

-port:80

protocol:TCP

targetPort:80

selector:

run:new-nginx

sessionAffinity:None

type:NodePort

---

apiVersion:extensions/v1beta1

kind:Ingress

metadata:

name:gray-release

annotations:

# 请求头中满足正则匹配foo=bar的请求才会被路由到新版本服务new-nginx中

nginx.ingress.kubernetes.io/service-match:|

new-nginx:header("foo",/^bar$/)

spec:

rules:

-host:www.example.com

http:

paths:

# 老版本服务

-path:/

backend:

serviceName:old-nginx

servicePort:80

# 新版本服务

-path:/

backend:

serviceName:new-nginx

servicePort:80

配置CodePipeline项目进行部署:

执行curl命令,查看路由的访问情况:

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" http://47.97.238.11

old

#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11

new

#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11

new

#curl -H "Host: www.example.com" -H "foo: bar" http://47.97.238.11

new

git灰度发布版本_灰度发布/蓝绿发布_部署到Kubernetes_选择部署方式_用户指南_CodePipeline - 阿里云...相关推荐

  1. K8S的灰度发布、滚动更新、蓝绿发布

    K8S灰度发布.蓝绿发布.滚动更新 一.简介 1.1灰度发布(金丝雀发布) 金丝雀发布一般是先发1台机器,或者一个小比例,例如2%的服务器,主要做流量验证用,也称为金丝雀 (Canary) 测试,国内 ...

  2. 金丝雀发布、滚动更新、蓝绿发布到底有啥区别

    根据 2017 年的 DevOps 发展报告,高效能组织和低效能组织在软件交付的效率上有数量级上的差异.技术组织的软件交付能力是一种综合能力,涉及众多环节,其中发布是尤为重要的环节. 作为技术人员,大 ...

  3. 常用于生产部署方式详解 灰度发布 滚动发布 蓝绿发布

    传统型 这种方式基本上很多中小型企业都在用,尤其是政府或是对企业内部的系统.通常都是直接停服务,将正在运行的程序包备份到指定目录,将新的程序包上传到服务器,停服务,替换老的包,启动服务. 优点: 1. ...

  4. 蓝绿发布,灰度发布及滚动发布

    [README] 本文转自:理解蓝绿发布.灰度发布和滚动发布_Jitwxs的博客-CSDN博客_蓝绿发布和灰度发布的区别目前绝大多数公司的业务系统都是集群化部署,那么在新版本上线时,保证平滑稳定,尽量 ...

  5. 蓝绿发布、滚动发布、灰度发布,有什么区别?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 在项目迭代的过程 ...

  6. APISIX安装与灰度、蓝绿发布

    文章目录 1.安装 1.1.基于docker安装 1.2.基于RPM安装 2.灰度发布与蓝绿发布测试 2.1.compose安装nginx 2.1.1.创建目录 2.1.2.编辑nginx.conf配 ...

  7. 1W字长文:蓝绿发布、金丝雀发布、滚动发布、A/B测试 原理和实操

    背景: 蓝绿发布.金丝雀发布.滚动发布.A/B测试 ,是大家日常常见的发布工作.所以发布的原理和实操是一个非常.非常核心的面试知识点. 在40岁老架构师 尼恩的读者交流群(50+)中,其相关面试题是一 ...

  8. No.184# 蓝绿发布实践回顾

    0 缘起 随着蓝绿发布项目落地进入试运行,也对蓝绿发布项目做个简要回顾. 早在2022年初的时候效能.交易和中间件的同学就如何提高发布效率做过讨论,蓝绿发布当时也被提出.由于彼时有更重要的事情去落地, ...

  9. 蚂蚁金服蓝绿发布实践

    本文转载自公众号"金融级分布式架构" 提示:有童鞋小米AI音响还没有领哦! 什么是蓝绿发布 蓝绿发布 (Blue Green Deployment) 是一种平滑过渡的发布模式.蓝绿 ...

最新文章

  1. 漫画:生活很苦!当你扛不下去想放弃时,一定要过来看看!
  2. [SDUT](3329)顺序表应用5:有序顺序表归并 ---有序表归并(线性表)
  3. 数据库的数据在硬盘上吗
  4. 【java】System.getProperty()参数大全
  5. Java 实现基于 UDP 的简单 socket 通信
  6. java servlet 跳转_Servlet跳转方式sendReDirect()和forward()
  7. 1185. 一周中的第几天 golang
  8. mysql 日志_MySQL日志系统
  9. JavaScript语言精粹:对象——读书笔记
  10. python自学要多久-怎么自学python,大概要多久?
  11. ANT发送邮件需要的3个JAR包
  12. 2017中国程序员薪资生存现状调查报告
  13. XML可扩展语言的发展
  14. mysql创建表插入随机数_插入随机数到MySQL数据库
  15. JavaScript 原形链
  16. java企业工程项目管理系统平台源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  17. IDEA 解决import类飘红
  18. 计算机c盘中用户文件夹内的文件改名,Win10-更改c盘下的用户文件夹名
  19. 分布式数据库稳定性资料整理
  20. Redis地理算法GEO解析和应用

热门文章

  1. 正版推荐 - cFosSpeed 网络优化加速器 Ping优化器
  2. 基于stm32f407下的W5500网卡驱动(下)
  3. GitHub 疑遭中间人攻击,无法访问;最大暗网托管商再次被黑,数据库被删​
  4. Redis——集群配置
  5. STM8L低功耗HALT模式一些总结
  6. 已解决:Downloading https://github.com/ultralytics.../yolov5n6.pt to yolov5n6——ubuntu18.4-yolov5报错记录[02]
  7. STM32-串口通信(串口的接收和发送)
  8. 架构师内功心法之设计原则
  9. 拼多多笔试题(三):多多的电子字典
  10. Jenkin持续集成部署-Jenkins常用插件篇