k8s中的容器一般是通过deployment管理的,那么一次滚动升级理论上会更新所有pod,这由deployment资源特性保证的,但在实际的工作场景下,需要灰度发布进行服务验证,即只发布部分节点,这似乎与k8s的deployment原理相违背,但是灰度发布的必要性,运维同学都非常清楚,如何解决这一问题?

最佳实践:
定义两个不同的deployment,例如:fop-gate和fop-gate-canary,但是管理的pod所使用的镜像、配置文件全部相同,不同的是什么呢?
答案是:replicas (灰度的fop-gate-canary的replicas是1,fop-gate的副本数是9)

cat deployment.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:{{if eq .system.SERVICE  "fop-gate-canary"}}name: fop-gate-canary{{else if eq .system.SERVICE "fop-gate"}}name: fop-gate{{end}}namespace: dora-appslabels:app: fop-gateteam: doratype: basicannotations:log.qiniu.com/global.agent: "logexporter"log.qiniu.com/global.version: "v2"
spec:{{if eq .system.SERVICE  "fop-gate-canary"}}replicas: 1{{else if eq .system.SERVICE "fop-gate"}}replicas: 9{{end}}minReadySeconds: 30strategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 0template:metadata:labels:app: fop-gateteam: doratype: basicspec:terminationGracePeriodSeconds: 90containers:- name: fop-gateimage: reg.qiniu.com/dora-apps/fop-gate:20190218210538-6-master
...........

我们都知道, deployment 会为自己创建的 pod 自动加一个 “pod-template-hash” label 来区分,也就是说,每个deployment只管理自己的pod,不会混乱,那么此时endpoint列表中就会有fop-gate和fop-gate-canary的pod,其他服务调用fop-gate的时候就会同时把请求发到这10个pod上。

灰度发布该怎么做呢?
最佳实践:创建两个不同pipeline,先灰度发布fop-gate-canary的pipeline,再全局发布fop-gate的pipeline(这里给出的是渲染前的配置文件,注意pipeline不同):

  "fop-gate":"templates":- "dora/jjh/fop-gate/configmap.yaml"- "dora/jjh/fop-gate/service.yaml"- "dora/jjh/fop-gate/deployment.yaml"- "dora/jjh/fop-gate/ingress.yaml"- "dora/jjh/fop-gate/ingress_debug.yaml"- "dora/jjh/fop-gate/log-applog-configmap.yaml"- "dora/jjh/fop-gate/log-auditlog-configmap.yaml""pipeline": "569325e6-6d6e-45ca-b21e-24016a9ef326""fop-gate-canary":"templates":- "dora/jjh/fop-gate/configmap.yaml"- "dora/jjh/fop-gate/service.yaml"- "dora/jjh/fop-gate/deployment.yaml"- "dora/jjh/fop-gate/ingress.yaml"- "dora/jjh/fop-gate/log-applog-configmap.yaml"- "dora/jjh/fop-gate/log-auditlog-configmap.yaml""pipeline": "15f7dd6a-bd01-41bc-bac5-8266d63fc3a5"

注意发布的先后顺序:

灰度发布完成后,可以登陆pod查看日志,并观察相关的grafana监控,查看TPS2XX和TPS5XX的变化情况,再决定是否继续发布fop-gate,实现灰度发布的目的

➜  dora git:(daixuan) ✗ kubectl get pod -o wide | grep fop-gate
fop-gate-685d66768b-5v6q4          2/2     Running   0          15d     172.20.122.161   jjh304    <none>
fop-gate-685d66768b-69c6q          2/2     Running   0          4d21h   172.20.129.52    jjh1565   <none>
fop-gate-685d66768b-79fhd          2/2     Running   0          15d     172.20.210.227   jjh219    <none>
fop-gate-685d66768b-f68zq          2/2     Running   0          15d     172.20.177.98    jjh322    <none>
fop-gate-685d66768b-k5l9s          2/2     Running   0          15d     172.20.189.147   jjh1681   <none>
fop-gate-685d66768b-m5n55          2/2     Running   0          15d     172.20.73.78     jjh586    <none>
fop-gate-685d66768b-rr7t6          2/2     Running   0          15d     172.20.218.225   jjh302    <none>
fop-gate-685d66768b-tqvp7          2/2     Running   0          15d     172.20.221.15    jjh592    <none>
fop-gate-685d66768b-xnqn7          2/2     Running   0          15d     172.20.133.80    jjh589    <none>
fop-gate-canary-7cb6dc676f-62n24   2/2     Running   0          15d     172.20.208.28    jjh574    <none>➜  dora git:(daixuan) ✗ kubectl exec -it fop-gate-canary-7cb6dc676f-62n24 -c fop-gate bash
root@fop-gate-canary-7cb6dc676f-62n24:/# cd app/auditlog/
root@fop-gate-canary-7cb6dc676f-62n24:/app/auditlog# tail -n5 144 | awk -F'\t' '{print $8}'
200
200
200
200
200

此外,spinnaker具有发布具有pause、resume、undo功能,实际测试可行
pause 暂停功能(类似于kubectl rollout pause XXX的功能)
resume恢复功能(类似于kubectl rollout resume XXX的功能)
undo取消功能(类似于kubectl rollout undo XXX功能)

spinnaker的这几种功能可以在正常发布服务的过程中发现问题,及时暂停和恢复,注意,spinnaker取消发布一定是针对正在发布的操作,pause状态中的发布无法取消,这与kubectl操作一致

我们尝试执行一次,发布,暂停,恢复,取消 操作,整个过程会产生4个version,每次变动会对应一个新version,因为不管是暂停还是恢复,在spinnaker中都将认为是一次新的发布,会更新version版本


总结:k8s中灰度发布最好方法就是定义两个不同的deployment管理相同类型的服务,创建不同的pipeline进行发布管理,避免干扰,同时在正常发布过程中,也可以利用spinnaker的pause,resume,undo等功能进行发布控制。

转载于:https://blog.51cto.com/daixuan/2360529

k8s容器灰度发布最佳实践(基于spinnaker)相关推荐

  1. 阿里云专有云容器服务弹性伸缩最佳实践

    简介:阿里云专有云容器服务弹性伸缩最佳实践 1.容器服务弹性伸缩简介 本小节将基于使用原理对容器服务弹性伸缩进行简要的描述. 本实践基于K8s的业务集群运行在专有云上,对测试业务进行压力测试,主要基于 ...

  2. 容器化技术最佳实践1--容器化技术简介与Docker入门

    容器化技术最佳实践1–容器化技术简介与Docker入门 文章目录 容器化技术最佳实践1--容器化技术简介与Docker入门 容器化简介 通过虚拟化了解容器化 对开发和运维的好处 容器化部署特点 什么情 ...

  3. 云原生之路:容器技术落地最佳实践

    简介: 随着容器技术的快速发展和广泛应用,毫无疑问云原生技术是未来发展的必然趋势.作为国内最早布局容器技术的阿里云,无论在技术还是产品上,都取得了极大的成果.阿里云资深技术专家易立通过阿里云容器服务, ...

  4. 生产中的12种容器镜像扫描最佳实践

    现在很多团队面临着这么一个挑战:如何在不减慢应用交付速度的情况下,管理好安全风险.有种方法可以解决该问题,就是采用安全的 DevOps 工作流程. 安全的DevOps(也称为DevSecOps)会在从 ...

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

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

  6. 从美国 FDA 新药审批制度看分级发布最佳实践

    作者:焦振清 新药临床试验的"黄金标准" 美国 FDA 新药审批流程被公认为世界上最完备,最科学的程序.目前的标准是从 1962 年开始实施,被称为是新药临床试验的"黄金 ...

  7. Docker容器镜像安全最佳实践指南

    文章目录: 0x02 Docker 容器安全最佳实践 1.主机安全配置 1.1 更新docker到最新版本 1.2 为容器创建一个单独的分区 1.3 只有受信任的用户才能控制docker守护进程 1. ...

  8. 可能是Asp.net Core On host、 docker、kubernetes(K8s) 配置读取的最佳实践

     写在前面 为了不违反广告法,我竭尽全力,不过"最佳实践"确是标题党无疑,如果硬要说的话 只能是个人最佳实践. 问题引出 可能很多新手都会遇到同样的问题:我要我的Asp.net ...

  9. 使用k8s实现灰度发布,金丝雀,蓝绿发布

    介绍# Ingress-Nginx 是一个K8S ingress工具,支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试. Nginx Annotations 支持以下 ...

最新文章

  1. always@( )列表里不能同时有电平敏感事件和边沿触发事件
  2. IDEA如何将项目中文件夹设置为Sources(蓝色)
  3. mybatis批量插入(insert)和批量更新(update)
  4. Chrome浏览器 js 关闭窗口失效解决方法
  5. Centos7搭建kubernetes搭建
  6. Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
  7. 震惊!让90%的程序员一看就会的入门级AI项目!
  8. 使用Mac下的sequel Pro数据库错误MySQL said: Authentication plugin 'caching_sha2_password'
  9. (2020年下半年软件设计师49题)程序设计语言的大多数语法现象可以用CFG(上下文无关文法)表示。下面的CFG产生式集用于描述简单算术表达式,其中+ - * 表示加、减、乘运算,id表示单个字母表示
  10. aspcms 可以改成MySQL_ASPCMS免改数据库 快速修改后台登陆密码-♚付涛纪实阁♚
  11. 深度学习之facenet人脸识别网络介绍
  12. 普通最小二乘法(OLS)
  13. MySQL数据库篇---对数据库,数据库中表,数据库中表的记录进行添修删查操作---保姆级教程
  14. 如何使用 JavaScript 显示/隐藏或切换 DIV 元素
  15. ASO小技能:自动输入搜索框文本
  16. 列表List: 什么是列表?
  17. 【react native】Flatlist实现上拉滚动加载
  18. Pandownload盘神回来了
  19. Navicat连接oracleTNS无监听程序解决方法
  20. 我的新书:《Jetpack Compose:Android全新UI编程》已出版

热门文章

  1. this compilation unit is not on the build of a java project
  2. 安装官方 Synaptics 驱动,终于解决 HP Pavilion G4 笔记本 讨厌的触摸板锁定问题!...
  3. 图解硬盘分区调整/硬盘分区重新调整的好软件/Norton PartitionMagic 版本 8.05 硬盘分区调整/想把硬盘空间调整一下...
  4. 2017-2018-1 20155317 《信息安全系统设计基础》第四周学习总结
  5. BZOJ3324 : [Scoi2013]火柴棍数字
  6. POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
  7. int a[5]={1,2,3,4,5}; int *p=(int*)(a+1); printf(%d,*(p-1)); 答案为什么是5?
  8. Web开发面临的挑战主要有哪些?
  9. 使用dbstart 和dbshut 脚本来自动化启动和关闭数据库
  10. Linux 套接字编程中的 5 个隐患