OpenKruise v0.5.0 版本发布,支持无损的流式分批发布策略

作者 | 酒祝 阿里云技术专家 导读:OpenKruise 是阿里云开源的大规模应用自动化管理引擎,在功能上对标了 Kubernetes 原生的 Deployment/StatefulSet 等控制器,但 OpenKruise 提供了更多的增强功能如 优雅原地升级、发布优先级/打散策略、多可用区 workload 抽象管理、统一 sidecar 容器注入管理等,都是经历了阿里巴巴超大规模应用场景打磨出的核心能力。这些 feature 帮助我们应对更加多样化的部署环境和需求、为集群维护者和应用开发者带来更加灵活的部署发布组合策略。 目前在阿里巴巴内部云原生环境中,绝大部分应用都统一使用 OpenKruise 的能力做 Pod 部署、发布管理,而不少业界公司和阿里云上客户由于 K8s 原生 Deployment 等负载不能完全满足需求,也转而采用 OpenKruise 作为应用部署载体。 背景问题 在介绍 OpenKruise 新增能力之前,我们先来看一下原生 K8s workload 所提供的发布能力:

  • Deployment 目前支持 maxUnavailable 和 maxSurge:

  • StatefulSet 目前支持 partition:

  • 其余 workload 如 DaemonSet,也只支持了 maxUnavailable。

以上这些策略在测试环境或是小场景下尚且可行,但其实无法完全满足大规模的应用场景。比方说:

  • 首先,Deployment 不支持灰度分批发布,你想只灰度升级其中 20% 的 Pod 做验证?抱歉做不到啊,用户只能设置小一些的 maxUnavailable 等着它全部发完,或者发布出现问题紧急 pause 暂停;

  • StatefulSet 确实支持灰度分批(partition),但目前是只能一个一个 Pod 来升级。如果 replicas 总数有个几百上千的量,那么一次发布可能要等到天黑。

v0.5.0 新增功能 这里我们只针对 v0.5.0 版本 CloneSet 和 SidecarSet 的两个主要功能改动来介绍,有兴趣的同学可以在 Github changelog 上看到版本改动明细:https://github.com/openkruise/kruise/blob/master/CHANGELOG.md 。 CloneSet 支持 maxSurge 策略 在阿里巴巴内部的云原生环境下,绝大部分无状态应用都使用 CloneSet 管理。为了应对超大规模应用的极致部署需求,我们在其中支持:

  • 原地升级(发布前后 Pod 对象不变、IP 不变、volume 不变,只升级容器的镜像)

  • 缩小 replicas 指定 Pod 删除

  • 丰富的发布策略(流式、灰度分批、优先级、打散等)

而在今年 2 月份的 Kruise v0.4.0 版本中,我们将 CloneSet 推出到开源。CloneSet 一经发布就广受关注,目前已经有多家知名互联网公司在调研使用。 最初版本的 CloneSet 并未支持 maxSurge(先扩后缩发布),只支持了 maxUnavailable、partition 等策略。这对阿里巴巴内部的大体量应用来说不是问题,但是很多社区用户的平台上都有小规模的应用,如果不能配置先扩后缩,那么在发布阶段可能会影响到应用的可用性。 在收到社区的 issue #250 #260 反馈后,我们在 CloneSet 中新增了 maxSurge 策略的支持并于 v0.5.0 版本中提供,在此也感谢社区 fatedier shiyan2016 等成员的参与贡献和宝贵建议。至此,CloneSet 已经覆盖了 K8s 原生 workload 的所有发布策略,下图构建了 CloneSet 目前提供的发布功能:

这里暂时不对 CloneSet 的发布策略做详细说明,我们后续会有专项文章来介绍。我们只看一下新增的 maxSurge 是如何配合流式、分批发布来实现的呢?接下来我们用几个简单的例子来看一下:

  1. 设置 maxSurge + maxUnavailable + partition 发布:

apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet # ... spec: replicas: 5 # Pod 总数为 5 updateStrategy: maxSurge: 20% # 多扩出来 5 * 20% = 1 个 Pod (rounding up) maxUnavailable: 0 # 保证发布过程 5 - 0 = 5 个 Pod 可用 partition: 3 # 保留 3 个旧版本 Pod (只发布 5 - 3 = 2 个 Pod) 当开始发布时,CloneSet 会先根据 maxSurge 多扩出来一个 Pod,此时 Pod 总数为 6(5 个旧版,1 个新版): $ kubectl get clone demo NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo 5 1 0 5 6 17m 随后,CloneSet 会在保证 maxUnavailable 的前提下逐渐把 Pod 删除、新建的方式更新,直到满足 partition=3 即剩余 3 个旧版本 Pod。此时,因为已经达到了期望的终态,CloneSet 会把新版本 Pod 删除一个,此时 Pod 总数为 5(3 个旧版,2 个新版): $ kubectl get clone demo NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo 5 2 2 5 5 17m 这里可以观察一段时间,当需要继续往下发布时,再次修改 partition 为 0。然后,CloneSet 会再次根据 maxSurge 多扩出来一个 Pod,此时 Pod 总数为 6(3 个旧版,3 个新版): $ kubectl get clone demo NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo 5 3 2 5 6 17m 随后,CloneSet 会在保证 maxUnavailable 的前提下逐渐把 Pod 删除、新建的方式更新,直到满足 partition=0 即所有 Pod 都升级到新版本。最后,CloneSet 会把新版本 Pod 删除一个,此时 Pod 总数为 5(5 个新版): $ kubectl get clone demo NAME DESIRED UPDATED UPDATED_READY READY TOTAL AGE demo 5 5 5 5 5 17m

  1. maxSurge 配合原地升级:

CloneSet 提供了 Pod 原地升级和重建升级两种升级方式,都可以配合 maxSurge / maxUnavailable / partition 等策略来发布。 apiVersion: apps.kruise.io/v1alpha1 kind: CloneSet # ... spec: updateStrategy: type: InPlaceIfPossible maxSurge: 20% 如果在原地升级方式下配置了 maxSurge,CloneSet 会先扩出来 maxSurge 数量的 Pod,然后对旧版本 Pod 采用 in-place 的方式来升级(更新 Pod spec 中的 image 镜像),最后在满足 partition 终态之后再清理删掉 maxSurge 数量的 Pod。 通过这种方式,既保证了发布过程的业务可用性,也尽量使 Pod 发布过程中 IP、volume 等信息不变。 SidecarSet 支持 volume 注入合并 SidecarSet 是 Kruise 提供的另一个重磅功能,不同于 CloneSet/StatefulSet 这些管理业务 Pod 的 workload,SidecarSet 是负责统一管理集群中的 sidecar 容器版本和注入。 而 v0.5.0 版本中新增的功能,就是在 sidecar 容器注入的时候,解决了 SidecarSet 和 Pod 中 volume 重复定义的冲突问题。这也是来自于一个社区 issue #254 反馈,他们使用 SidecarSet 做日志采集 sidecar 的管理,并期望以旁路的方式注入到所有 Pod 中。 举个例子,我们需要往集群中每个 Pod 都注入一个日志采集 sidecar 容器。但是一来我们无法让每个应用开发者都在自己的 CloneSet/Deployment 中增加这个容器的定义,二来即使在所有应用的 workload 中都加了,如果我们想要升级这个日志采集容器的镜像版本,还得更新所有应用的 workload,这样做的成本实在太高了! 而 OpenKruise 提供的 SidcarSet 正是为了解决上述这个问题。我们只需要将 sidecar 定义写到一个全局的 SidcarSet 中,不管用户用 CloneSet、Deployment、StatefulSet 等任何方式部署,扩出来的 Pod 中都会注入我们定义好的 sidecar 容器。

以日志采集为例,我们可以先定义一个 SidecarSet: apiVersion: apps.kruise.io/v1alpha1 kind: SidecarSet metadata: name: log-sidecar spec: selector: matchLabels: app-type: long-term # 往所有带 long-term 标签的 Pod 中注入 containers: - name: log-collector image: xxx:latest volumeMounts: - name: log-volume mountPath: /var/log # 将 log-volume 的卷挂到 /var/log 目录,采集这个目录下的日志 volumes: - name: log-volume # 定义一个名为 log-volume 的卷 emptyDir: {} 这里大家可能会问,如果每个应用打出日志的目录路径不同,怎么办?不要急,这就是本次 volume merge 的功能所在。 这个时候,比如有一个应用 A 扩容的原始 Pod 如下: apiVersion: v1 kind: Pod metadata: labels: app-type: long-term spec: containers: - name: app image: xxx:latest volumeMounts: - name: log-volume mountPath: /app/logs # 应用自己的日志目录 volumes: - name: log-volume # 定义一个名为 log-volume 的卷 persistentVolumeClaim: claimName: pvc-xxx 那么 kruise webhook 就会将 SidecarSet 中定义的 log sidecar 容器注入到 Pod 中: apiVersion: v1 kind: Pod metadata: labels: app-type: long-term spec: containers: - name: app image: xxx:latest volumeMounts: - name: log-volume mountPath: /app/logs # 应用自己的日志目录 - name: log-collector image: xxx:latest volumeMounts: - name: log-volume mountPath: /var/log volumes: - name: log-volume # 定义一个名为 log-volume 的卷 persistentVolumeClaim: claimName: pvc-xxx 可以看到,因为 SidecarSet 和 Pod 中定义的日志 volume 名字都叫 log-volume,那么在注入的时候就会以 Pod 中定义的 volume 为准。比如这里 Pod 中的 volume 采用了 pvc 的方式来挂载 pv,那么注入 sidecar 后,同样会把这个卷挂到 sidecar 容器中的 /var/log 目录下,然后执行日志采集即可。 这样以 SidecarSet 的方式管理 sidecar 容器,既和应用部署发布做了解耦,也同样可以和应用容器共享 volume 卷,来实现日志采集、监控等相关 sidecar 功能。 总结 本次 v0.5.0 版本的升级,主要带来了应用无损发布和 sidecar 容器管理上更加便捷的能力。 后续 OpenKruise 还会持续在应用部署/发布能力上做出更深的优化,我们也欢迎更多的同学参与到 OpenKruise 社区来,共同建设一个场景更加丰富、完善的 K8s 应用管理、交付扩展能力,能够面向更加规模化、复杂化、极致性能的场景。 课程推荐 为了更多开发者能够享受到 Serverless 带来的红利,这一次,我们集结了 10+ 位阿里巴巴 Serverless 领域技术专家,打造出最适合开发者入门的 Serverless 公开课,让你即学即用,轻松拥抱云计算的新范式——Serverless。 点击即可免费观看课程:https://developer.aliyun.com/learning/roadmap/serverless “阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的公众号。”

原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真正的程序员,从来不会告诉你这些事!

有没有发现,每个程序员都曾有过这样的疑问:我该从事什么技术方向?相信很多人都会跟你说:找个“钱景”好的,找个简单的,找个应用广的.....听着好像都很有道理,但很多人学了很久后才发现&#xff…

Idea更改console控制台 日志颜色(非插件)

Idea更改console控制台 日志颜色(非插件) file-setting-editor-color scheme-console colors 在右侧的选项中可以自定义更改颜色 我之前控制台日志都是亮青色。晃眼睛,就干脆把idea的亮青换成了黑色。 之前: 之后:…

流批一体机器学习算法平台

发布会传送门 产品详情 针对正在兴起的机器学习广泛而多样的应用场景,阿里巴巴计算平台基础算法团队在2017年开始基于Flink研发新一代的机器学习算法平台。该项目名称定为Alink,取自相关名称(Alibaba, Algorithm, AI, Flink, Blink&#xf…

Linux 下 Tomcat /jboss内存大小配置

找到 TOMCAT_NOME/bin/catalina.sh 文件加入以下代码: JAVA_OPTS"-Xms256m -Xmx512m -Xss1024K -XX:PermSize128m -XX:MaxPermSize256m" 具体位置如下图: 参数解释: -Xms128m JVM初始分配的堆内存-Xmx512m JVM最大允许分配的堆内存…

扎心!天天写代码,方向真的对吗?

“每个人的时间都是有限的,在有限的时间里选择一项值得投入的技术会变得尤为重要。” 笔者从 2008 年开始工作到现在也有 12 个年头了,一路走来都在和数据打交道,做过很多大数据底层框架内核的开发(Hadoop,Pig&#xf…

powerdesigner-建立数据库模型及全局脚本

powerdesigner 使用 文章目录powerdesigner 使用1. 建立数据库表模型2. 脚本统一修改表结构(赋值默认字段、统一删除、统一修改)2.1.统一添加默认字段:2.2.统一删除字段:2.3.统一修改表名称:2.4. 统一修改字段属性&…

霍因科技获首届全国信创产业生态创新奖

近日,2020首届全国信创产业生态创新大赛颁奖盛典在北京信创园举办,霍因科技提交的“霍因科技-信创云统一存储和数据湖方案”荣获生态创新奖,这彰显了霍因科技在以数据存储技术推动信息技术应用创新产业方面的卓越成就。 据悉,首届…

国际免费版 新冠疫情数据分析APP正式发布!

简介 在今年2月初,SLS 已经发布针对新冠病毒肺炎疫情国内动态展示分析 APP,目前该能力全面开放给政府、社区、第三方平台和开放者进行广泛应用,完全免费开放。还没有关注过的同学可以通过以下链接了解背景: 新冠病毒疫情分析 AP…

powerdesigner生成表sql语句时,统一添加默认字段(生成时间、生成人等)

powerdesigner生成表sql语句时,统一添加默认字段 文章目录powerdesigner生成表sql语句时,统一添加默认字段方式一:配置创建表默认字段:方法二:创建表模型后执行vb语句推荐方法一:对pd表模型结构不侵入&…

Cloud Native Infrastructures Meetup 北京 | 活动安排

OpenAnolis社区首场线下meetup将联合Open Infrastructure基金会亮相北京,来自阿里云、蚂蚁集团,Intel,中国移动,红帽等公司的技术专家将围绕内核、容器及虚拟化等云原生基础设施技术展开探讨,解析相关开源技术内幕及社…

阿里云专家赵伟教你在CDN边缘节点上构建多层纵深防护体系

网络安全态势严峻,常见的五大网络攻击风险类型 赵伟认为,企业线上服务所面临的安全风险,主要来自以下五个方面: DDoS攻击 DDoS攻击类型已有20多年历史,它攻击方式简单直接,通过伪造报文直接拥塞企业上联带…

java并发编程面试

文章目录1.为什么要使用线程池?2.你们哪些地方会使用到线程池?3.线程池有哪些作用?4.线程池的创建方式?5.线程池底层是如何实现复用的?6.ThreadPoolExecutor 核心参数有哪些 ?7.线程池创建的线程会一直在运…

下一代云原生应用制品管理平台,容器镜像服务企业版优惠进行时

随着越来越多的企业拥抱容器、拥抱云原生技术,享受技术带来的弹性、敏捷、可移植的便利,但是在实现容器技术生产落地时,很难规避以下痛点问题: 1、 运维复杂度:需要自建一个高可用的镜像服务去面对峰值流量…

软件设计师 - 系统测试

软件测试的目的:发现尽可能多的缺陷,而不是为了证明软件的正确性; 白盒测试: 语句覆盖每个可执行语句都被执行到判定覆盖(分支覆盖)每个语句至少执行一次,且每个判定的可能结果都至少执行一次条…

从移动广告业务“长出”的新增长点,汇量科技进军云服务

10 年前,Netscape 创始人、硅谷著名投资人马克安德森表示“软件正在吞噬世界”,这只说了故事的一半,10 年过去,人们从不信任到得“云”者得天下,云服务成为正在吞噬世界的“大鱼”。 工业和信息化部在《推动企业上云实…

开放下载!《OSS运维基础实战手册》

作为一名云运维工程师,在攻克OSS的道路上难免会遇到"天花板"。放轻松,《OSS运维基础实战手册》帮你轻松解决!本书透彻解析OSS核心概念,十二心法打开全新运维视角,力求帮助云运维工程师们打破能力上升瓶颈。 …

MQ相关面试题

文章目录你们项目中哪些地方有使用到 MQ ?为什么需要使用 MQ?MQ 如何避免消息堆积的问题?MQ 宕机了消息是否会丢失呢?生产者投递消息,MQ 宕机了如何处理?MQ 如何保证消息顺序一致性问题?为什么保证了消息顺…

com.taobao.config.client.exception.ConfigClientException: cannot get serverlist, so exit jvm env=DEF

问题: com.taobao.config.client.exception.ConfigClientException: cannot get serverlist, so exit jvm envDEFAULT_ENVat com.taobao.config.client.ServerListManager.start(ServerListManager.java:116)at com.taobao.config.client.EnvironmentProbe.probe(E…

终于要跟大家见面了,Flink 面试指南

面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂。但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒? 之前社区帮大…

云转型谈何容易?打破转型阵痛,汇量科技加码云原生

作者 | 伍杏玲出品 | CSDN云计算10 年前,Netscape 创始人、硅谷著名投资人马克安德森表示“软件正在吞噬世界”,这只说了故事的一半,10 年过去,人们从不信任到得“云”者得天下,云服务成为正在吞噬世界的“大鱼”。工业…