kubernetes如何使用kruise-rollout进行分批灰度发布

news2024/12/30 4:15:30

前言

部署在 Kubernetes 集群中的应用,在升级发布时可能会存在的问题:

1,由于 Kuberneter 底层 Pod 容器生命周期与网络组件生命周期是异步管理的,在升级时如果没有处理好应用优雅退出的问题,就很容易导致 http 访问请求 5xx

2,原生 Deployment 应用的滚动发布功能是一把梭的全量发布模式,没有灰度和分批控制发布的概念,一旦出现问题,故障影响范围就会迅速扩大

这也是为什么需要灰度发布,蓝绿发布,彩虹发布,金丝雀发布、A/B Test等多样化形式发布的重要原因,核心目标只有一个,就是为了确保服务的稳定性,减少或避免因变更带来的不稳定因素

今天我们主要来聊下,如何使用阿里云开源的 Kruise Rollouts 进行灰度发布(官网地址:Introduction | OpenKruise)Kruise Rollouts 是一个旁路组件,提供高级渐进式交付功能。它对金丝雀、灰度发布,蓝绿发布,A/B Test都有很好的支持

安装

kruise-rollout

# Firstly add openkruise charts repository if you haven't do this.
$ helm repo add openkruise https://openkruise.github.io/charts/

# [Optional]
$ helm repo update
#
helm install kruise-rollout openkruise/kruise-rollout --version 0.4.0

# 下载安装包
# helm pull openkruise/kruise-rollout  --untar --untardir .

安装完成后,查看 crd 资源的方式:

(base) ➜  blue_green_deploy kubectl get crd -A
NAME                                  CREATED AT
batchreleases.rollouts.kruise.io      2023-08-25T09:59:30Z
rollouthistories.rollouts.kruise.io   2023-08-25T09:59:30Z
rollouts.rollouts.kruise.io           2023-08-25T09:59:30Z
trafficroutings.rollouts.kruise.io    2023-08-25T09:59:30Z

kubectl-kruise

这里使用手动安装方式,下载安装包:Releases · openkruise/kruise-tools · GitHub

这里是 mac m1 系统,选择 darwin-arm64 即可,解压之后拷贝到系统的 bin 目录即可:

tar -zxvf kubectl-kruise-darwin-amd64.tar.gz
mv darwin-arm64/kubectl-kruise /usr/local/bin/

现在就可以使用:

# 查看帮助文档了 
kubectl-kruise --help

注意在 mac 上由于会验证安全身份,所以如果遇到弹窗:

 

就在设置 -> 安装性与隐私 -> 通用里面 选择放行和信任这个应用即可

 

后面再弹窗,直接选择打开就行了

 


 

Demo 例子

假设,我们有个 Deployment 目前是 V1 版本:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: py-hello-blue
spec:
  selector:
    matchLabels:
      app: hello
      color: blue
  replicas: 6
  template:
    metadata:
      labels:
        app: hello
        color: blue
    spec:
      terminationGracePeriodSeconds: 30
      containers:
      - name: hello
        imagePullPolicy: Always
        image: localhost:5001/py-http:1
        ports:
        - containerPort: 8888
        resources:
          requests:
            memory: "50Mi"
          limits:
            memory: "200Mi"
        lifecycle:
          preStop:
            exec:                                                                      
              command: ["sleep", "5"]
        # command: ["/usr/bin/tini", "--", "bash", "-c"]
        command: ["sh", "-c"]
        args:
        - |
          python app.py

为了让发布更丝滑,我们先绑定 kruise-rollout 灰度发布策略:

apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
  name: rollout-blue
  namespace: default
  annotations:
    rollouts.kruise.io/rolling-style: partition
spec:
  objectRef:
    workloadRef:
      apiVersion: apps/v1
      kind: Deployment
      name: py-hello-blue
  strategy:
    canary:
      steps:
      - replicas: 1
      - replicas: 50%
      - replicas: 100%

策略如下:6 个副本的发布批次

第一批:发布一个副本 = 1

第二批:发布剩下的 50%,5*0.5 不四舍五入取整 = 2

第三批:发布剩下的所有 = 3

现在,我们将 yaml 文件里面的版本升级为 2,然后重新执行 apply 后,使用 kubectl get pods -w 命令观察发布过程:

第一批发布

过程,旧的先终止,然后等优雅退出的 30 秒过后,就彻底销毁了,新的一个来拉起来了:

 

查看发布 rollout 策略的状态,执行命令

kubectl get rollout

结果显示,灰度完就终止了:

 

这个时候,我们去请求我们的 pod多请求几次就能看到新发布的pod 已经生效了:

 

第二批发布

继续发布 第二批

kubectl kruise rollout approve rollout/rollout-blue -n default

查看 deployment 状态和发布进度:

	# 查看发布状态
 kubectl get deployments.apps
 # 查看发布的 hash 值,按时间可以看出来
 kubectl get replicasets.apps -L pod-template-hash

 

 

第二批发完之后,显示如下:

 

 

然后我们继续查看灰度发布的执行阶段:

 

可以看到进行到了完成了第二个阶段:

第三批发布

如果没问题,继续执行第三批发布:

kubectl kruise rollout approve rollout/rollout-blue -n default

如果在没有发布完,显示Progressing,StepUpgrade

 

执行完显示:

 

回滚

kurise 并不直接提供回滚能力,需要借助原生的方式重新 set image 即可, 在这里不需要对 rollout crd 做任何事情,yaml 文件里面的镜像版本改回到之前的 v1 版本即可,然后 kubectl apply -f 到 k8s 集群,再次查看状态会显示 rollout 已经取消

NAME           STATUS    CANARY_STEP   CANARY_STATE   MESSAGE                                  AGE
rollout-blue   Healthy   1             StepReady      Rollout progressing has been cancelled   77m

 

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

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

相关文章

【JAVA】抽象类与接口--下

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈Java 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 抽象类与接口 1. 实现多个接口2. 接口间…

Linux常用命令_文件处理命令

文章目录 1. 命令格式与目录处理命令ls1.1 命令格式1.2 目录处理命令:ls 2. 目录处理命令2.1 目录处理命令:mkdir2.2 目录处理命令:cd2.3 目录处理命令:pwd2.4 目录处理命令:rmdir2.5 目录处理命令:cp2.6 目…

openGauss学习笔记-50 openGauss 高级特性-DB4AI

文章目录 openGauss学习笔记-50 openGauss 高级特性-DB4AI50.1 关键字解析50.2 使用指导 openGauss学习笔记-50 openGauss 高级特性-DB4AI openGauss当前版本支持了原生DB4AI能力,通过引入原生AI算子,简化操作流程,充分利用数据库优化器、执…

【PHP】字符串数组

文章目录 字符串类型字符串转义字符串相关函数 数组定义方式数组特点二维数组数组遍历foreach遍历语法for循环遍历数组相关函数相关题目 字符串类型 定义语法 引号方式:比较适合定义那些比较短(不超过一行)或者没有结构要求的字符串 1&#…

基于Python的图书馆大数据可视化分析系统设计与实现【源码+论文+演示视频+包运行成功】

博主介绍:✌csdn特邀作者、博客专家、java领域优质创作者、博客之星,擅长Java、微信小程序、Python、Android等技术,专注于Java、Python等技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 …

vscode 与 C++

序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …

云计算企业私有云平台建设方案PPT

导读:原文《云计算企业私有云平台建设方案PPT》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 喜欢文章,您可以点赞评论转发本文,…

Linux常用命令_权限管理命令

文章目录 1. 权限管理命令: chmod2. 其他权限管理命令2.1 权限管理命令: chown2.2 权限管理命令: chgrp2.3 权限管理命令: umask 1. 权限管理命令: chmod {ugoa}中分别为:u-user、g-group、a-all;谁创建文件,谁是所有者;所属组为所…

HOOPS Exchange SDK 2023 Service Pack 2 Crack

内容摘自互联网,具体功能以官网介绍为准。。。 HOOPS SDK是全球领先开发商TechSoft 3D旗下的原生产品,专注于Web端、桌面端、移动端3D工程应用程序的开发。长期以来,HOOPS通过卓越的3D技术,帮助全球600多家知名客户推动3D软件创新…

Qt ui对某控件进行全局提升报错:no such file or directory

问题 在Qt项目中,设计师界面,对某一控件进行提升,设置完“提升的类名称”、“头文件”、全局包含后,构建时,报“no such file or directory”错误,但文件命名存在呀。 解决 根据问题就应该明白&#xf…

并查集(C++实现)

目录 一、并查集原理 二、并查集应用 2.1 并查集举例 2.2 并查集数组规律 2.3 并查集功能 三、并查集实现 3.1 并查集 3.2 根据名字查找 四、例题 4.1 省份数量 4.2 等式方程的可满足性 一、并查集原理 再一些应用问题中,需要将n个不同的元素划分成一些…

Python读取Excel:实现数据高效处理的利器

目录 一、Python读取Excel的常用库二、Python读取Excel的步骤三、具体案例和使用场景四、Python读取Excel的优势与其他编程语言比较 摘要 本文将介绍Python读取Excel的方法,并通过具体案例和使用场景展示如何实现数据高效处理。我们将介绍常用的Python库&#xff0c…

QT基础使用:组件和代码关联(信号和槽)

自动关联 ui文件在设计环境下,能看到的组件可以使用鼠标右键选择“转到槽”就是开始组件和动作关联。 在自动关联这个过程中软件自动动作的部分 需要对前面头文件进行保存,才能使得声明的函数能够使用。为了方便,自动关联时先对所有文件…

【Hello Algorithm】堆和堆排序

本篇博客简介: 讲解堆和堆排序相关算法 堆和堆排序 堆堆的概念堆的性质堆的表示形式堆的增加删除堆的最大值 堆排序堆排序思路时间复杂度为N的建堆方法已知一个近乎有序的数组 使用最佳排序方法排序 堆 堆的概念 这里注意!!! 这…

日志系统——性能测试

日志系统项目已经编写完成&#xff0c;在本节完成性能测试之后就正式结束了 测试代码如下 #include "../logs/mjwlog.h" #include <vector> #include <thread>//参数&#xff1a;日志器名称&#xff0c;线程数量&#xff0c;输出日志条数&#xff0c;单…

nginx(七十八)nginx配置http2

一 ngx_http_v2模块 1、本文不讲解HTTP2的知识2、只讲解nginx中如何配置HTTP2 ① 前置条件 1、openssl的版本必须在1.0.2e及以上2、开启https加密,目前http2.0只支持开启了https的网站编译选项&#xff1a;--with-http_ssl_module --with-http_v2_module 特点&#xff1a…

【翻译】RISC-V指令集手册第Ⅱ卷:特权体系结构

第三章 机器级ISA&#xff0c;版本1.11 本章描述RISC-V系统中最高权限的机器模式(M-mode)下的机器级操作。M模式用于对硬件平台的低级访问&#xff0c;是复位时进入的第一个模式。M模式还可以用于实现在硬件中直接实现过于困难或代价过高的特性。RISC-V机器级ISA包含一个公共核…

Android Studio升级到Android API 33版本后,XML布局输入没有提示

低版本的Android Studio升级到Android API 33版本后&#xff0c;XML布局输入没有提示。查一下我目前使用的Android Studio 是2021年发布&#xff0c;而Android API 33是2022年发布的&#xff0c;这是由低版本升级到高版本造成不兼容的问题。解决方法有两种&#xff1a; 第一种…

1 Hadoop入门

1.Hadoop是什么&#xff1f; (1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 (2)主要解决&#xff0c;海量数据的存储和海量数据的分析计算问题。 (3)广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念——Hadoop生态圈 2.Hadoop的优势 3 Hadoop组成 4 HDF…

如何将储存在Mac或PC端的PDF文件传输到移动设备呢?

iMazing是一款iOS设备管理软件&#xff0c;用户借助它可以将iPad或iPhone上的文件备份到PC或Mac上&#xff0c;还能实现不同设备之间的文件传输&#xff0c;能很大程度上方便用户进行文件管理。 在阅读方面&#xff0c;iPad和iPhone是阅读PDF的优秀选择&#xff0c;相较于Mac或…