Higress & Kruise Rollout: 渐进式交付为应用发布保驾护航

本文涉及的产品
MSE Nacos/ZooKeeper 企业版试用,1600元额度,限量50份
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 通常在应用发布新功能阶段,我们会采用灰度发布的思想对新版本进行小流量验证,在符合预期之后再进行全量发布,这就是"渐进性交付"。在本文中开发者通过GitOps、CI/CD方式集成渐进式交付框架,让新功能交付以流水线的方式分批执行,利用A/B 测试、金丝雀发布等技术精细化控制每一批次的流量策略,充分保障应用发布的稳定性。

前言

在业务高速发展过程中,如何最大化保障功能迭代过程中业务流量无损一直是开发者比较关心的问题。通常在应用发布新功能阶段,我们会采用灰度发布的思想对新版本进行小流量验证,在符合预期之后再进行全量发布,这就是"渐进性交付"。该词最早起源于大型、复杂的工业化项目,它试图将复杂的项目进行分阶段拆解,通过持续进行小型闭环迭代降低交付成本和时间。随着云原生架构不断发展,渐进性交付被广泛应用在互联网业务应用中,开发者通过GitOps、CI/CD方式集成渐进式交付框架,让新功能交付以流水线的方式分批执行,利用A/B 测试、金丝雀发布等技术精细化控制每一批次的流量策略,充分保障应用发布的稳定性。


什么是Higress


Higress 是一款标准化、高集成、易扩展、热更新的云原生网关。


Higress 源自阿里巴巴内部电商、交易等核心生产场景的实践沉淀,遵循 Ingress/Gateway API 标准,将流量网关、微服务网关、安全网关三合一,并在此基础上扩展了服务管理插件、安全类插件和自定义插件,高度集成 K8s 和微服务生态,包括 Nacos 注册和配置、Sentinel 限流降级等能力,并支持规则变更毫秒级生效等热更新能力。

image.png


更多关于 Higress 的介绍,可以参阅Higress官网[1]


什么是Kruise Rollout


Kruise Rollout 是阿里云开源的云原生应用自动化管理套件 OpenKruise 在渐进式交付领域的新尝试,支持配合流量和实例灰度的金丝雀发布、蓝绿发布、A/B Testing 发布,以及发布过程能够基于 Prometheus Metrics 指标自动化分批与暂停,并提供旁路的无感对接、兼容已有的多种工作负载(Deployment、CloneSet、DaemonSet)。


这里,熟悉 Kubernetes 的小伙伴可以会疑惑,官方的 Deployment 工作负载不是有控制发布的策略吗?我们为什么还需要 Kruise Rollout 呢?首先,Kubernetes 官方的 Deployment 中定义发布策略严格上不符合渐进性交付的思想,它实际是滚动发布。虽然 Deployment 对于升级而言提供了 maxUnavailable 和 maxSurge 两个参数,但是本质上来讲 Deployment 它只支持流式的一次性发布,用户并不能控制分批以及精细化的流量策略。比如用户无法严格控制新老版本之间的流量比例,只能根据实际 Pod 数量占比以及调用端的负载均衡策略;用户无法做 A/B testing 策略,例如限制公司内部员工可以访问新版本。当新版本出现问题,只能重新执行一遍滚动发布切回老版本,这样不仅回滚速度慢,而且频繁线上变更本身就具有极高的不稳定因素。再者,Kubernetes 只提供了应用交付的 Deployment 控制器,以及针对流量的 Ingress、Service 抽象,但是如何将上述实现组合成开箱即用的渐进式交付方案,Kubernetes 并没有出标准的定义。出于以上问题和考量,阿里云开始发起对渐进式领域的探索,结合多年来容器化、云原生的技术沉淀,推出了无侵入、可扩展、高易用的渐进式交付框架 Kruise Rollout。


Higress & Kruise Rollout工作机制


简单介绍一下 Higress 和 Kruise Rollout 在一次应用发布过程中的工作机制。

image.png


这里,假设集群中有一个 Deployment 应用A,通过 Higress 网关对外暴露提供服务。应用A由于业务发展,需要发布新功能。


  1. 用户首先在集群中添加渐进性交付策略(Rollout CRD资源),描述目标工作负载的交付策略,比如批次,每一批次的流量控制,以及关联的 Service 资源和 Ingress 资源。
  2. 应用A发布新版本,用户修改集群上中目标Deployment的Pod模板中容器镜像为新版本。
  3. Kruise Rollout通过hook方式参与到Deployment滚动发布流程,修改Deployment的Pause来暂停滚动发布过程。
  4. 执行第一次批次发布,根据Rollout CRD资源描述的交付策略,控制新版本的Pod数量,同时为正式Ingress资源生成对应的灰度Ingress资源,并配置灰度流量策略,比如流量权重比或者根据请求内容Header进行流量分发。Higress监听到Ingress资源变化,实时动态修改路由规则,满足灰度规则的流量被分发到新版本。
  5. 通过Prometheus等监控手段观察应用流量的指标信息,验证新版本是否符合预期。
  1. 如果符合预期,触发下一次批次发布,重复执行步骤4
  2. 如果不符合预期,触发回滚,新发布的Pod下线,灰度已下线的部分老版本的Pod,Ingress资源自动下线灰度规则,Higress实时修改路由规则,确保流量只访问老版本服务。


整个 Rollout 过程,自动整合Deployment、Service、Ingress一起工作,并向用户屏蔽底层资源变化。这是与现有工作负载能力的一种协同,它尽量复用工作负载的能力,又做到了非 Rollout 过程的零入侵。


实战:金丝雀发布


01:什么是金丝雀发布

金丝雀发布的思想是将少量的请求引流到新版本上,因此部署新版本服务只需极小数的机器。验证新版本符合预期后,逐步调整流量权重比例,使得流量慢慢从老版本迁移至新版本,期间可以根据设置的流量比例,对新版本服务进行扩容,同时对老版本服务进行缩容,使得底层资源得到最大化利用。


如图,某服务当前版本为v1,现在新版本v2要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。


image.png


02:基于Higress & Kruise Rollout实践金丝雀发布

假设集群中有一个服务demo,通过Higress网关对外提供服务。如何安装Higress,请参阅Higress快速开始[2]如何安装Kruise Rollout,请参阅安装Kruise Rollout[3]


apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  replicas: 5
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: main
        image: registry.cn-hangzhou.aliyuncs.com/mse-ingress/version:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: demo
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: demo
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: demo
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: demo
            port:
              number: 80
        path: /version
        pathType: Exact


现在,服务demo需要发布新版本。在修改应用镜像之前,我们需要为服务demo定义金丝雀发布策略,以达到渐进式发布的效果。

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-demo
spec:
  objectRef:
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: demo
  strategy:
    canary:
      steps:
      - weight: 10
        pause: {}
        replicas: 1
      - weight: 30
        pause: {}
        replicas: 2
      trafficRoutings:
      - service: demo
        type: nginx
        ingress:
          name: demo


  • 其中workloadRef 旁路式的选择需要 Rollout 的 Workload,此处为Deployment,支持其他Workload(如CloneSet、DaemonSet)。
  • 其中canary.Steps 定义了整个 Rollout 过程一共分为3批,其中第一批只灰度一个新版本 Pod,并且 routing 10% 流量到新版本 Pod,并且需要人工确认是否继续发布;第二批只灰度两个新版本Pod,并且routing 30%流量到新版本Pod,并且需要人工确认是否继续发布;最后一批,无需定义,即全量发布。
  • 其中trafficRoutings指向了需要感知流量规则的资源,kruise rollout会自动更新相关资源,实时反射目标流量规则。


修改服务A的Deployment中镜像为registry.cn-hangzhou.aliyuncs.com/mse-ingress/version:v2,观察相关资源变化。


查看rollout资源状态,发现当前执行完第一批发布,并且出于暂停状态,需要人工确认才能继续下一批次发布。

image.png


查看pod状态,发现新版本pod只有一个,Deployment资源没有全部滚动发布。

image.png


查看Ingress的解析IP (即Higress网关对外的公网IP地址)。

image.png


测试流量,发现有10%流量访问新版本。

image.png


继续第二批次发布,查看当前Pod状态,发现新版本Pod有两个。如何安装kubectl-kruise,请参阅安装kubectl-kruise[4]

image.png


测试流量,观察流量分配比。

image.png


发布最后一批,完成全量发布。

image.png


测试流量,发现流量全部转发至新版本。至此,我们通过小流量的方式逐步将流量从老版本迁移至新版本。

image.png


实战:A/B Testing


01:什么是A/B Testing

相比于基于权重方式的金丝雀发布,A/B测试基于用户请求的元信息将流量路由到新版本,这是一种基于请求内容匹配的灰度发布策略。只有匹配特定规则的请求才会被引流到新版本,常见的做法包括基于Http Header和Cookie。基于Http Header方式的例子,例如User-Agent的值为Android的请求 (来自安卓系统的请求)可以访问新版本,其他系统仍然访问旧版本。基于Cookie方式的例子,Cookie中通常包含具有业务语义的用户信息,例如普通用户可以访问新版本,VIP用户仍然访问旧版本。如图,某服务当前版本为v1,现在新版本v2要上线。希望安卓用户可以尝鲜新功能,其他系统用户保持不变。


image.png


通过在监控平台观察旧版本与新版本的成功率、RT对比,当新版本整体服务预期后,即可将所有请求切换到新版本v2,最后为了节省资源,可以逐步下线到旧版本v1。


image.png


02:基于Higress & Kruise Rollout实践A/B Testing

我们仍然利用上面的例子,服务A初始镜像为v1。现在,服务demo需要发布新版本。在修改应用镜像之前,我们需要为服务demo定义A/B Testing 策略,以达到渐进式发布的效果。

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: rollouts-header
spec:
  objectRef:
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: demo
  strategy:
    canary:
      steps:
      - matches:
        - headers:
          - name: user-agent
            value: android
        pause: {}
        replicas: 1
      trafficRoutings:
      - service: demo
        ingress:
          classType: nginx
          name: demo


其中canary.Steps 定义了整个 Rollout 过程一共分为2批,其中第一批只灰度一个新版本 Pod,并且将带有HTTP Header user-agent: android (即安卓用户)的流量routing 到新版本 Pod,并且需要人工确认是否继续发布;最后一批,无需定义,即全量发布。


修改服务A的Deployment中镜像为registry.cn-hangzhou.aliyuncs.com/mse-ingress/version:v2,观察相关资源变化。查看rollout资源状态,发现当前执行完第一批发布,并且出于暂停状态,需要人工确认才能继续下一批次发布。

image.png


查看pod状态,发现新版本pod只有一个,Deployment资源没有全部滚动发布。

image.png


测试来自安卓的流量是否路由到新版本,非安卓的流量是否路由到老版本。

image.png


发布最后一批,完成全量发布。并测试所有流量是否路由到新版本。

image.png


总结

相比于传统人工手动方式,Higress & Kruise Rollouts提供了无侵入、自动化运维方式让应用发布丝滑般顺畅。开发者无需关注发布过程中如何调整Deployment、Ingress、Service等资源,只需声明并管理发布策略Rollouts资源即可,原生Deployment的滚动发布会自动实现为渐进式交付,让应用发布可批次、可灰度、可回滚,助力业务快速迭代发展同时,也提高了应用发布的稳定性和效率问题。


01:Higress 社区

Higress项目处于开源初期,我们在兼容好现有 Ingress 标准的基础上,会重点发力下一代的Ingress 标准 Gateway API,利用 Gateway API 带来的契机打通南北向与东西向的全域流量调度,帮助用户使用一套架构架构同时管理外部与内部流量,降低部署运维成本、提升开发及运维效率。欢迎更多的用户参与到Higress社区,贡献一份文档、提交一段代码,您就有可能成为 Higress  的第一批 Contributor 甚至 Committer。目前,我们建立了1个钉群和1个微信群,加入我们,联系群主或群管,共建云原生网关吧。


image.png


02:OpenKruise 社区

OpenKruise是阿里巴巴从容器化转向云原生化过程中,在云原生应用管理方面的最佳实践经验,除本文涉及的Kruise Rollout外,OpenKruise还提供了诸多云原生应用管理相关的能力,如:增强的工作负载、Sidecar容器管理、弹性拓扑管理等。目前OpenKruise上面托管着阿里集群上百万的Pod,包含:有状态、无状态、通用类型的Sidecar Aagent。最后,欢迎感兴趣的同学加入下面的社区钉钉群,我们大家一起讨论云原生应用管理相关的需求与技术。


image.png


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
算法 Python
线性回归-最小二乘法入门(波士顿房价)
线性回归-最小二乘法入门(波士顿房价)
410 0
|
6月前
|
存储 监控 算法
Java程序员必学:JVM架构完全解读
Java 虚拟机(JVM)是 Java 编程的核心,深入理解其架构对开发者意义重大。本文详细解读 JVM 架构,涵盖类加载器子系统、运行时数据区等核心组件,剖析类加载机制,包括加载阶段、双亲委派模型等内容。阐述内存管理原理,介绍垃圾回收算法与常见回收器,并结合案例讲解调优策略。还分享 JVM 性能瓶颈识别与调优方法,分析 Java 语言特性对性能的影响,给出数据结构选择、I/O 操作及并发同步处理的优化技巧,同时探讨 JVM 安全模型与错误处理机制,助力开发者提升编程能力与程序性能。
Java程序员必学:JVM架构完全解读
|
8月前
|
数据采集 人工智能 API
生物医药蛋白分子数据采集:支撑大模型训练的技术实践分享
作为生物信息学领域的数据工程师,近期在为蛋白质相互作用预测AI大模型构建训练集时,我面临着从PDB、UniProt等学术数据库获取高质量三维结构、序列及功能注释数据的核心挑战。通过综合运用反爬对抗技术,成功突破了数据库的速率限制、验证码验证等反爬机制,将数据采集效率提升4倍,为蛋白质-配体结合预测模型训练提供了包含10万+条有效数据的基础数据集,提高了该模型预测的准确性。
285 1
|
11月前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
存储 Java
Java实现贪吃蛇大作战小游戏(完整教程+源码)额外实现积分和变速功能(下)
文章目录 1 开发环境及游戏展示 1.1 游戏主界面 1.2 移动界面 1.3 奖励界面 1.4 F加速功能界面 1.5 死亡界面 2 需求分析 3 系统设计 3.1 系统总体功能设计 3.2 系统总体流程设计 4 功能设计 4.1 贪吃蛇移动及加速功能设计 4.2 贪吃蛇吃食物加速及死亡判定功能的设计 4.2.1 贪吃蛇吃食物加速功能的设计 4.2.2 贪吃蛇死亡判定功能的设计 4.3 贪吃蛇主动加速功能的设计 4.4 贪吃蛇奖励机制功能的设计 5 项目结构与项目实现 5.1 项目结构及类间关系 5.2 项目完整源码 5.2.1 Images类
|
JavaScript 前端开发 开发者
深入理解 TypeScript:从基础到进阶
TypeScript 作为 JavaScript 的超集,通过静态类型系统提升了代码组织与错误检测能力,广泛应用于前端开发。本文介绍 TypeScript 的核心概念(类型系统、接口、类、模块)及基础特性(基础类型、接口、类和继承),并深入探讨泛型、高级类型和装饰器等进阶特性,帮助开发者构建更健壮、可维护的应用。
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
391 1
|
缓存 运维 安全
在Docker中,构建镜像应该遵循哪些原则?
在Docker中,构建镜像应该遵循哪些原则?
|
存储 安全 Java
深入理解Java字节码与反编译技术
深入理解Java字节码与反编译技术
295 0
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
在阿里云服务器的实例规格中,有共享型也有企业型,一般用户选择较多的企业级实例规格有计算型、通用型、内存型,每一种实例规格又有多个实例规格族可选,不同的云服务器实例规格在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考

热门文章

最新文章