作者:赵明山(立衡)

前言

OpenKruise [1]  是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目。它来自阿里巴巴多年来容器化、云原生的技术沉淀,是阿里内部生产环境大规模应用的基于 Kubernetes 之上的标准扩展组件,也是紧贴上游社区标准、适应互联网规模化场景的技术理念与最佳实践。在原有的工作负载、sidecar 管理等领域外,Kruise 目前正在渐进式交付领域进行尝试。

什么是渐进式交付?

“渐进式交付” 一词最早起源于大型、复杂的工业化项目,它试图将复杂的项目进行分阶段拆解,通过持续进行小型闭环迭代降低交付成本和时间。随着 Kubernetes 及云原生理念被普及之后,尤其是在持续部署流水线出现后,渐进式交付为互联网应用提供了基础设施和实现方法。

在产品的迭代过程中,可以将渐进式交付的具体行为附着在流水线中,将整条交付流水线看作产品迭代的一个过程和一次渐进式交付周期。渐进式交付在实践中是以 A/B 测试、金丝雀/灰度发布等技术手段落地的。以 淘宝商品推荐 为例,其每次发布重大功能,都会经历一次典型的渐进式交付过程,从而通过渐进式交付提高交付的稳定性和效率

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jw38uzyx-1650973443537)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/decfce12ee8743eca977d7013fd83256~tplv-k3u1fbpfcp-zoom-1.image “1.png”)]

为什么要 Kruise Rollout

Kubernetes 只提供了应用交付的 Deployment 控制器,以及针对流量的 Ingress、Service 抽象,但是如何将上述实现组合成开箱即用的渐进式交付方案,Kubernetes 并没有出标准的定义。Argo-rollout 与 Flagger 是社区目前比较流行的渐进式交付方案,但是它们在一些能力和理念上跟我们的设想不太一样。首先,它们仅支持 Deployment, 不支持 Statefulset、Daemonset,更不用说自定义的 operator 了;其次,它们不是“非侵入式的渐进式发布方式” ,例如:Argo-rollout 不能支持社区 K8S Native Deployment、Flagger 对业务创建的 Deployment 进行了拷贝导致 Name 改变而与 Gitops 或自建 Paas 存在一些兼容性的问题。

另外,百花齐放是云原生的一大特点。阿里云容器团队负责整个容器平台云原生架构的演进,在应用渐进式交付领域也有强烈的需求,因此在参考社区方案以及考虑阿里内部场景的基础上,我们在设计 Rollout 过程中有以下几个目标:

  1. 无侵入性:对原生的 Workload 控制器以及用户定义的 Application Yaml 定义不进行任何修改,保证原生资源的干净、一致

  2. 可扩展性:通过可扩展的方式,支持 K8S Native Workload、自定义 Workload 以及 Nginx、Isito 等多种 Traffic 调度方式

  3. 易用性:对用户而言开箱即用,能够非常方便的与社区 Gitops 或自建 Paas 结合使用

Kruise Rollout:旁路的渐进式交付能力

Kruise Rollout [2] 是 Kruise 针对渐进式交付抽象的定义模型,完整的 Rollout 定义:满足配合应用流量和实际部署实例的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并能提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、DaemonSet),架构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zzXVPXdR-1650973443538)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/870a5ed40045486c884b8a7f51b0b0bc~tplv-k3u1fbpfcp-zoom-1.image “2.png”)]

流量调度(金丝雀、A/B Test、蓝绿)与分批发布

金丝雀与分批发布是渐进式交付实践中最常用的发布方式,如下所示:

  1. workloadRef 旁路式的选择需要 Rollout 的 Workload(Deployment、CloneSet、DaemonSet)。
  2. canary.Steps 定义了整个 Rollout 过程一共分为五批,其中第一批只灰度一个新版本 Pod,并且 routing 5% 流量到新版本 Pod,并且需要人工确认是否继续发布。
  3. 第二批发布 40% 新版本 Pod,以及 Routing 40% 流量到新版本 Pod,且发布完成后 sleep 10m,自动发布后面批次。
  4. trafficRoutings 定义了业务 Ingress 控制器为 Nginx,此处设计为可扩展实现,除 Nginx 之外还可以支持 Istio、Alb 等其它流量控制器。
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
spec:strategy:objectRef:workloadRef:apiVersion: apps/v1# Deployment, CloneSet, AdDaemonSet etc.kind: Deployment name: echoservercanary:steps:# routing 5% traffics to the new version- weight: 5# Manual confirmation, release the back stepspause: {}# optional, The first step of released replicas. If not set, the default is to use 'weight', as shown above is 5%.replicas: 1- weight: 40# sleep 600s, release the back stepspause: {duration: 600}- weight: 60pause: {duration: 600}- weight: 80pause: {duration: 600}# 最后一批无需配置trafficRoutings:# echoserver service name- service: echoserver# nginx ingresstype: nginx# echoserver ingress nameingress:name: echoserver

基于 Metrics 指标自动化分批与暂停

Rollout 过程中能够自动的分析业务 Prometheus Metrics 指标,然后与 steps 结合起来,来决定 Rollout 是否需要继续或者暂停。如下所示,在发布完每个批次之后分析过去五分钟业务的 http 状态码,如果 http 200 的比例小于 99.5 将暂停此 Rollout 过程。

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
spec:strategy:objectRef:...canary:steps:- weight: 5...# metrics分析  analysis:templates:- templateName: success-ratestartingStep: 2 # delay starting analysis run until setWeight: 40%args:- name: service-namevalue: guestbook-svc.default.svc.cluster.local# metrics analysis模版
apiVersion: rollouts.kruise.io/v1alpha1
kind: AnalysisTemplate
metadata:name: success-rate
spec:args:- name: service-namemetrics:- name: success-rateinterval: 5m# NOTE: prometheus queries return results in the form of a vector.# So it is common to access the index 0 of the returned array to obtain the valuesuccessCondition: result[0] >= 0.95failureLimit: 3provider:prometheus:address: http://prometheus.example.com:9090query: |sum(irate(istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m])) / sum(irate(istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m]))

金丝雀发布实践

  1. 假设用户有基于 Kubernetes 部署 echoServer 服务如下,并且通过 nginx ingress 对外服务:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfSP2bYN-1650973443539)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e040830b99b74989a91d080b1640c83b~tplv-k3u1fbpfcp-zoom-1.image “3.png”)]

  1. 定义 Kruise Rollout 金丝雀发布(1 个新版本 Pod,以及 5% 流量),并 apply -f 到 Kubernetes 集群
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:name: rollouts-demo
spec:objectRef:...strategy:canary:steps:- weight: 5pause: {}replicas: 1trafficRoutings:...
  1. 升级 echoserver 镜像版本(Version 1.10.2 -> 1.10.3),并 kubectl -f 到 Kuberernetes 集群中
apiVersion: apps/v1
kind: Deployment
metadata:name: echoserver
...
spec:...containers:- name: echoserverimage: cilium/echoserver:1.10.3

Kruise Rollout 监听到上述行为后,将会自动开始金丝雀发布过程。如下所示,自动生成 canary Deployment、service 以及 Ingress,并且配置 5% 流量到新版本 Pods:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z3YcxAUD-1650973443539)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/11dd0f6b34644f0aabdbfdd37ee71167~tplv-k3u1fbpfcp-zoom-1.image “4.png”)]

  1. 金丝雀一段时间后,业务研发同学确认新版本无异常后,可以通过命令 kubectl-kruise rollout approve rollout/rollouts-demo -n default 发布剩余所有的 Pods。Rollout 会精确的控制后续过程,当发布完成后,会回收所有的 canary 资源,恢复到用户部署的状态。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N7Lv03KV-1650973443539)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/38668f9941e14af7aac34c2c9fc8c464~tplv-k3u1fbpfcp-zoom-1.image “5.png”)]

  1. 如果在金丝雀过程中发现新版本异常,可以将业务镜像调整为之前版本(1.10.2),然后 kubectl apply -f 到 Kubernetes 集群当中。Kruise Rollout 监听到该行为,会回收所有的 canary 资源,达到快速回滚的效果。
apiVersion: apps/v1
kind: Deployment
metadata:name: echoserver
...
spec:...containers:- name: echoserverimage: cilium/echoserver:1.10.2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0w3sySy8-1650973443539)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/511aac5c3e0b4001b0ea545a24d9263b~tplv-k3u1fbpfcp-zoom-1.image “6.png”)]

总结

随着 Kubernetes 上面部署的应用日益增多,如何做到业务快速迭代与应用稳定性之间的平衡,是平台建设方必须要解决的问题。Kruise Rollout 是 OpenKruise 在渐进式交付领域的新探索,旨在解决应用交付领域的流量调度以及分批部署问题。Kruise Rollout 目前已经正式发布 v0.1.0 版本,并且与社区 OAM KubeVela 项目进行了集成,vela 用户可以通过 Addons 快速部署与使用 Rollout 能力。此外,也希望社区用户能够加入进来,我们一起在应用交付领域做更多的扩展。

  • Github:​https://github.com/openkruise/rollouts
  • Official:​https://openkruise.io/
  • Slack: Channel in Kubernetes Slack
  • 钉钉交流群:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e07FDzOa-1650973443539)(https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5211c45dfa2d4241873dd48123632a76~tplv-k3u1fbpfcp-zoom-1.image “7.jpeg”)]

相关链接

[1] OpenKruise:

​​https://github.com/openkruise/kruise​​

[2] Kruise Rollout:

​​https://github.com/openkruise/rollouts/blob/master/docs/getting_started/introduction.md​​

Kruise Rollout: 让所有应用负载都能使用渐进式交付相关推荐

  1. 为什么7层负载均衡压测性能低

    为什么80%的码农都做不了架构师?>>>    为什么7层负载均衡压测性能低 7层性能会比4层性能低 负 载均衡集群采用LVS和Tengine实现,其中4层监听经过LVS后直接到达后 ...

  2. 从程序员到CTO都应该了解的一些技术趋势

    作者 | ThoughtWorks 编辑 | 小智 ThoughtWorks 每年都会出品两期技术雷达,这是一份关于技术趋势的报告,由 ThoughtWorks 技术战略委员会(TAB)经由多番正式讨 ...

  3. 2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

    2019天猫双11 成交额2684亿! "不是任何一朵云都能撑住这个流量.中国有两朵云,一朵是阿里云,一朵叫其他云."11月11日晚,阿里巴巴集团CTO张建锋表示,"阿里 ...

  4. 怎样才能“负载”均衡

    ADC产品(应用交付控制器)主要实现负载均衡.应用和协议优化.安全防护等功能,其目的是实现服务器和应用系统的高可靠可用性.其中负载均衡功能是ADC的基本功能也是最重要的功能,但是基本不代表简单,在实际 ...

  5. 企业级负载均衡如何实现

    转载自  企业级负载均衡如何实现 负载均衡简介 首先,我们来了解一下什么是负载均衡: 在一个大型网站中,在线用户有时可能有几千个甚至上万个之多.如果一个用户的请求需要服务使用0.02秒来处理,那么该服 ...

  6. 缓存雪崩,缓存穿透,缓存预热,缓存热备都是什么鬼?

    转载自 缓存雪崩,缓存穿透,缓存预热,缓存热备都是什么鬼? 缓存雪崩,缓存穿透,缓存预热,缓存热备是在做缓存设计或者缓存应用时经常遇到的概念,也是缓存应用过程中必须熟知及知道 的东西. 缓存雪崩 当缓 ...

  7. java 负载均衡_java负载均衡 - 岁月静好I的个人空间 - OSCHINA - 中文开源技术交流社区...

    作用 对系统的高可用,网络压力的缓解,处理能力扩容的重要手段之一. 服务器负载 我们通常所说的负载是指:服务器负载 软硬件负载 服务器负载又分为:软件负载--硬件负载 软件负载:通过在服务器上安装一些 ...

  8. 网络动态负载均衡算法分析

    转自CSDN博客:http://blog.csdn.net/wallacexiang/archive/2009/07/24/4376147.aspx 随着Internet的日益普及,无论在企业网.园区 ...

  9. linux 负载命令,通过Linux命令查看系统平均负载的方法

    1.Linux系统的平均负载的概念 有时候我们会觉得系统响应很慢,但是又找不到原因,这时就要查看平均负载了,看它是否有大量的进程在排队等待.特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度, ...

  10. 网页加载出现没有合适的负载均衡器_分布式必知必会-七层负载和四层负载到底是什么?...

    背景 我们在使用负载均衡器的时候,往往会听到七层负载或四层负载这两个名词,许多负载均衡软件提供的方式也不同,那么七层和四层区别在哪呢?为什么有的支持有的不支持呢? 负载均衡简介 负载均衡建立在现有网络 ...

最新文章

  1. scala(3):class和object,trait的区别
  2. struts2框架之国际化(参考第二天学习笔记)
  3. 对官网vue事件修饰符串联的顺序如何理解?
  4. use resources at the campus if possible
  5. 【转】HashSet的用法
  6. BBlean最初级的入门幽默教程
  7. php ci is numeric,CI继承类MY_Model
  8. SpringBoot App Registers UNKNOWN with Eureka in Brixton SR3
  9. Spring @Scheduled定时任务调度配置的详解
  10. word文档更新目录为什么更新不了?
  11. 解读:加性高斯白噪声信道
  12. 人工智能现在的技术“好玩”到了什么程度?
  13. Zookeeper之Curator分布式锁简单模拟12306抢票
  14. 来自北京大学NOIP金牌选手yxc的常用代码模板3——搜索与图论
  15. linux学习笔记-第三课-ls,cd,alias,PASH,目录结构,快捷键
  16. 百数智慧社区细分领域合作案例展示
  17. 全网首发?蚂蚁金服内部共享—1658页《Java面试突击核心讲》
  18. [区块链技术] 吐血推荐!区块链从入门到放弃(区块链入门汇总整理)
  19. keil里的debug项里没有 proteus vsm 51解决方案
  20. 网站刷关键词_如何提升网站关键词及长尾词的排名 - 百度排名提升软件

热门文章

  1. IOS微信分享调起微信后立刻返回到app中无法分享的问题
  2. 软件硕士和计算机硕士,详解软件工程硕士和计算机硕士区别
  3. android的备忘录带闹钟提醒,‎App Store 上的“Reminders 3 - 款带有闹钟提醒功能的备忘录”...
  4. xy苹果助手未受信任_苹果ios企业签名后App无法安装?如何解决?
  5. 国内主流短信验证码平台收费价格对比「二」:亿佰云、秒嘀科技、极光短信、华信云通信
  6. 摇身一变,ADSL猫进化为无线路由器
  7. python项目实战:免费下载某平台任意付费音乐
  8. android 文件管理器
  9. NDK (C++) 开发中如何使用 ASan 检测内存越界、溢出等内存错误
  10. java海贼王秘宝传说下载_我的世界1.7.10海贼王整合包