k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
文章目录
- OpenKruise简介
- OpenKruise来源
- OpenKruise是什么?
- 核心组件有什么?
- 有什么特性和优势?
- 适用于什么场景?
- 什么是OpenKruise的原地升级
- 原地升级的关键特性
- 使用原地升级的组件
- 原地升级的工作原理
- 应用
- 环境
- 一、OpenKruise部署
- 1.安装helm客户端工具
- 2. 通过 helm 安装
- 二、OpenKruise使用案例
- 1. 部署应用
- 2. 应用扩容
- 3. 应用缩容
- 4. 原地升级
- 5. 灰度更新
- 总结
OpenKruise简介
OpenKruise来源
它是由阿里巴巴集团的阿里云团队维护和开发的,并且在2018年将其贡献给了云原生计算基金会(CNCF),成为了CNCF的孵化项目。
OpenKruise是什么?
OpenKruise 是一个基于 Kubernetes 的扩展项目,旨在增强和扩展 Kubernetes 的原生能力,以更好地支持大规模应用的管理和运维。它通过提供一系列自定义控制器和自定义资源(CRD),帮助用户在 Kubernetes 集群中更加灵活、高效地管理容器化应用。
核心组件有什么?
1.CloneSet:
功能:
用于管理一组具有相同模板的 Pod。类似于 Kubernetes 的 Deployment,但提供了更多高级特性,如灰度发布、并行和顺序更新策略、最大不可用副本数等。
用途:
适用于需要复杂更新策略和高可用性的应用场景。
2.SidecarSet:
功能:
用于管理 Sidecar 容器。可以动态地将 Sidecar 容器注入到指定的 Pod 中,而不需要修改 Pod 的模板。
用途:
适用于需要在多个应用 Pod 中添加统一的辅助容器,如日志收集、监控代理等。
3.StatefulSet:
功能:
扩展了 Kubernetes 的 StatefulSet 功能。支持有状态应用的管理,提供了更灵活的更新和扩展策略。
用途:
适用于有状态应用,如数据库、缓存服务等。
4.Advanced DaemonSet:
功能:
提供了比原生 Kubernetes DaemonSet 更加灵活的功能,如灰度发布、并行和顺序更新策略等。
用途:
适用于需要在每个节点上运行一个副本的应用,如监控代理、日志收集代理等。
5.BroadcastJob:
功能:
类似于 Kubernetes 的 Job,但用于在集群中所有或部分节点上运行一次性任务。
用途:
适用于需要在每个节点上执行一次性任务的场景,如节点初始化、数据分发等。
6.ImagePullJob:
功能:
用于在集群的所有或部分节点上预拉取镜像,以减少 Pod 启动时的延迟。
用途:
适用于需要快速启动大量 Pod 的场景,如批量部署、大规模弹性扩容等。
有什么特性和优势?
高级发布策略:
支持蓝绿发布、金丝雀发布等高级发布策略,提供更灵活的应用更新方式。
高可用性和容错性:
通过高级的副本管理和更新策略,确保应用的高可用性和容错性。
易于集成:
与 Kubernetes 原生功能无缝集成,用户可以在现有 Kubernetes 集群上直接使用 OpenKruise 提供的功能。
社区支持:
由阿里巴巴开源,并得到社区广泛支持和贡献,持续更新和优化。
适用于什么场景?
互联网企业:
需要频繁更新和部署的在线服务,如电商网站、社交平台等。
金融行业:
高可用性和高安全性要求的金融应用,如银行系统、交易平台等。
大数据和 AI:
需要大规模计算和数据处理的应用,如数据分析、机器学习等。
企业 IT:
企业内部的各类业务系统和应用,如 CRM、ERP 系统等
什么是OpenKruise的原地升级
因为后面会使用,这里详细讲一下
OpenKruise 的原地升级(In-Place Update)是一种更新策略,允许在不销毁和重建 Pod 的情况下直接更新 Pod 内的容器镜像或资源配置。这种方法与传统的替换策略不同,可以显著减少更新过程中应用的中断时间和资源开销。
原地升级的关键特性
无需重建 Pod:
优势:
避免了 Pod 重建过程中的网络重连、存储重新挂载等操作,减少了因重建导致的潜在服务中断和性能抖动。
用途:
特别适用于那些对重建敏感的应用,如状态有管理复杂的有状态应用。
减少资源开销:
优势:
在更新过程中,不需要重新调度和启动新的 Pod,从而减少了对集群资源的占用。
用途:
适用于资源紧张的集群环境,可以有效节约计算和存储资源。
提升更新速度:
优势:
直接更新现有 Pod 的容器镜像或配置,省去了 Pod 创建和销毁的时间,显著提升了更新操作的效率。
用途:
适用于需要快速更新的场景,如紧急补丁、快速迭代开发等。
使用原地升级的组件
CloneSet:
原地升级功能:
通过配置 CloneSet 的 inPlaceUpdateStrategy,可以实现对应用的原地升级。
适用场景:
需要频繁更新且对更新速度和资源开销有较高要求的无状态应用。
Advanced StatefulSet:
原地升级功能:
扩展了原生 StatefulSet 的能力,支持对有状态应用进行原地升级。
适用场景:
需要高可用性和快速更新的有状态应用,如数据库、缓存服务等。
原地升级的工作原理
镜像更新:
操作:
修改 Pod 的容器镜像标签或 ID。
过程:
控制器监控到更新请求后,直接在原有 Pod 上更新容器镜像,触发容器重启但不销毁 Pod。
资源更新:
操作:
修改 Pod 的资源请求和限制(如 CPU 和内存)。
过程:
控制器监控到更新请求后,直接在原有 Pod 上更新资源配置,可能触发资源重调度但不销毁 Pod。
应用
环境
虚拟机
Ip | 主机名 | cpu | 内存 | 硬盘 |
---|---|---|---|---|
192.168.10.11 | master01 | 2cpu双核 | 4G | 100G |
192.168.10.12 | worker01 | 2cpu双核 | 4G | 100G |
192.168.10.13 | worker02 | 2cpu双核 | 4G | 100G |
版本 centos7.9
已部署k8s-1.27
一、OpenKruise部署
本案例使用helm方式安装部署
Helm用于实现kubernetes中相互关联的多个yaml文件的安装部署,相当于linux系统中的yum工具
1.安装helm客户端工具
wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
tar xf helm-v3.13.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
helm version
详情请看
链接: k8s学习–helm的详细解释及安装和常用命令
2. 通过 helm 安装
helm repo add openkruise https://openkruise.github.io/charts/helm repo updatehelm search repo openkruise
搜索OpenKruise仓库中的Charts
可以看到已经存在
由于本次部署在K8S 1.27版本集群,并使用cri-dockerd,所以手动指定CRI。
注意:如果是1.24以下,则不需要,因为默认就是docker
helm install kruise openkruise/kruise --version 1.6.3 --set daemon.socketLocation=/var/run --set daemon.socketFile=cri-dockerd.sock
查看一下
helm list
kubectl -n kruise-system get all
可以看到都已经运行起来了
二、OpenKruise使用案例
1. 部署应用
mkdir yaml && cd yaml
vim 01-ok.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:name: nginxweb1namespace: default
spec:replicas: 3selector:matchLabels:app: nginxweb1template:metadata:labels:app: nginxweb1spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80
应用yaml文件并查看
kubectl apply -f 01-ok.yaml
kubectl get clonesets
kubectl get all
创建成功之后通过 kubectl get all命令查看对应的信息,可以发现cloneset- controller 是直接创建的 Pod,而原生的Deployment 是通过 ReplicaSet 去创建的 Pod
2. 应用扩容
vim 02-ok.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:name: nginxweb1namespace: default
spec:minReadySeconds: 30scaleStrategy:maxUnavailable: 1replicas: 5selector:matchLabels:app: nginxweb1template:metadata:labels:app: nginxweb1spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80
minReadySeconds: 30 创建了一个pod之后30s才会创建第二个
应用yaml文件并持续查看
注意: watch是持续查看 ctrl+c退出
kubectl apply -f 02-ok.yaml
watch kubectl get pods
可以看到30s之后才创建出来的第二个
kubectl get cloneset
kubectl get pods
3. 应用缩容
vim 03-ok.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:name: nginxweb1namespace: default
spec:minReadySeconds: 30scaleStrategy:maxUnavailable: 1podsToDelete:- nginxweb1-frcl2 # 可指定多个replicas: 4selector:matchLabels:app: nginxweb1template:metadata:labels:app: nginxweb1spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80
缩容时, CloneSet可以指定一些pod删除,而 StatefulSet 或者 Deployment 做不到:
StatefulSet 是根据序号来删除 Pod,而 Deployment/ReplicaSet 目前只能根据控制器里定义的排序来删除。
而 CloneSet 允许用户在缩小 replicas 数量的同时,指定想要删除的 Pod 名字。
如果只是把name加入podsToDelete,而没有修改replicas的话,删完之后会再扩一个pod
kubectl apply -f 03-ok.yaml
kubectl get pods
可以看到指定的pod已经被删除
4. 原地升级
先查看一下pod内nginx的版本
kubectl exec -it nginxweb1-g44p9 -- nginx -v
vim 04-ok.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:name: nginxweb1namespace: default
spec:minReadySeconds: 30updateStrategy: #添加更新策略type: InPlaceIfPossiblescaleStrategy:maxUnavailable: 1replicas: 4selector:matchLabels:app: nginxweb1template:metadata:labels:app: nginxweb1spec:containers:- name: nginximage: nginx:latest #更换镜像版本imagePullPolicy: IfNotPresentports:- containerPort: 80
应用yaml文件
kubectl apply -f 04-ok.yaml
更新过程
watch kubectl get pods
kubectl exec -it nginxweb1-g44p9 -- nginx -v
可以看到nginx版本已经更新成功
5. 灰度更新
通过灰度更新可以更新部分pod
vim 05-ok.yaml
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:name: nginxweb1namespace: default
spec:minReadySeconds: 30updateStrategy: # 添加更新策略 type: InPlaceIfPossiblepartition: 2 # 保留旧版本pod数量scaleStrategy:maxUnavailable: 1replicas: 4selector:matchLabels:app: nginxweb1template:metadata:labels:app: nginxweb1spec:containers:- name: nginximage: nginx:1.20imagePullPolicy: IfNotPresentports:- containerPort: 80
kubectl get pods
kubectl apply -f 05-ok.yaml
watch kubectl get pods
查看版本
kubectl exec -it nginxweb1-g44p9 -- nginx -v
kubectl exec -it nginxweb1-jjsjp -- nginx -v
kubectl exec -it nginxweb1-wr8h7 -- nginx -v
kubectl exec -it nginxweb1-zhqxj -- nginx -v
我们会发现只更新了2个pod,还有2个pod没有更新。
完成
总结
OpenKruise 通过增强 Kubernetes 的能力,提供了更灵活、高效的应用管理方式。它特别适用于需要高级更新策略、高可用性和大规模部署的场景,是对 Kubernetes 原生功能的强有力补充。
相关文章:
k8s学习--OpenKruise详细解释以及原地升级及全链路灰度发布方案
文章目录 OpenKruise简介OpenKruise来源OpenKruise是什么?核心组件有什么?有什么特性和优势?适用于什么场景? 什么是OpenKruise的原地升级原地升级的关键特性使用原地升级的组件原地升级的工作原理 应用环境一、OpenKruise部署1.安…...
上海亚商投顾:沪指缩量调整 PCB概念股持续爆发
上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 大小指数昨日走势分化,沪指全天震荡调整,创业板指午后涨超1%。消费电子板块全天强势&a…...
QT属性系统,简单属性功能快速实现 QT属性的简单理解 属性学习如此简单 一文就能读懂QT属性 QT属性最简单的学习
4.4 属性系统 Qt 元对象系统最主要的功能是实现信号和槽机制,当然也有其他功能,就是支持属性系统。有些高级语言通过编译器的 __property 或者 [property] 等关键字实现属性系统,用于提供对成员变量的访问权限,Qt 则通过自己的元对…...
【IEEE出版丨EI检索】2024新型电力系统与电力电子国际会议(NPSPE 2024)
2024新型电力系统与电力电子国际会议(NPSPE 2024)将于8月16日至18日在中国大连举行,本届大会致力于为相关领域的专家和学者提供一个探讨行业热点问题,促进科技进步,增加科研合作的平台。本届大会涵盖新型电力系统和电力…...
【Netty】nio阻塞非阻塞Selector
阻塞VS非阻塞 阻塞 阻塞模式下,相关方法都会导致线程暂停。 ServerSocketChannel.accept() 会在没有建立连接的时候让线程暂停 SocketChannel.read()会在没有数据的时候让线程暂停。 阻塞的表现就是线程暂停了,暂停期间不会占用CPU,但线程…...
ES 操作
1、删除索引的所有记录 curl -X POST "localhost:9200/<index-name>/_delete_by_query" -H Content-Type: application/json -d {"query": {"match_all": {}} }POST /content_erp_nlp_help/_delete_by_query { "query": { &quo…...
uniapp如何实现跳转
在 UniApp 中,页面跳转主要可以通过两种方式实现:使用 <navigator> 组件和调用 UniApp 提供的导航 API。以下是这两种方式的详细说明: 1. 使用 <navigator> 组件 <navigator> 组件允许你在页面上创建一个可点击的元素&am…...
Stable-Diffusion-WebUI 常用提示词插件
SixGod提示词插件 SixGod提示词插件可以帮助用户快速生成逼真、有创意的图像。其中包含,清空正向提示词”和“清空负向提示词、提示词起手式包含人物、服饰、人物发型等各个维度的提示词、一键清除正面提示词与负面提示词、随机灵感关键词、提示词分类组合随机、动…...
单片机 PWM输入捕获【学习记录】
前言 学习是永无止境的,就算之前学过的东西再次学习一遍也能狗学习到很多东西,输入捕获很早之前就用过了,但是仅仅是照搬例程没有去进行理解。温故而知新! 定时器 定时器简介 定时器的分类 高级定时器 通用定时器 基本定时器…...
3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)
前端异步编程规范 Promise介绍手写Promise(resolve,reject)手写Promise(then)Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类,可以翻…...
3.1. 马氏链-马氏链的定义和示例
马氏链的定义和示例 马氏链的定义和示例1. 马氏链的定义2. 马氏链的示例2.1. 随机游走2.2. 分支过程2.3. Ehrenfest chain2.4. 遗传模型2.5. M/G/1 队列 马氏链的定义和示例 1. 马氏链的定义 对于可数状态空间的马氏链, 马氏性指的是给定当前状态, 其他过去的状态与未来的预测…...
红利之外的A股底仓选择:A50
内容提要 华泰证券指出,当前指数层面下行风险不大,市场再入震荡期下,可关注三条配置线索:1)A50为代表的产业巨头;2)以家电/食饮/物流/出版为代表的稳健消费龙头,3)消费电…...
wondershaper 一款限制 linux 服务器网卡级别的带宽工具
文章目录 一、关于wondershaper二、文档链接三、源码下载四、限流测试五、常见报错1. /usr/local/sbin/wondershaper: line 145: tc: command not found2. Failed to download metadata for repo ‘appstream‘: Cannot prepare internal mirrorlist: No URLs.. 一、关于wonder…...
独孤思维:盲目进群,根本赚不到钱
01 我看有些伙伴,对标同行找写作素材和灵感的时候。 喜欢把对标文章发给ai提炼总结。 这个方法好是好,但是,有一个问题。 即,无法感受全文的细节。 更无法感受作者的情感和温度。 就好像电影《记忆大师》一样。 我提取了记…...
针对indexedDB的简易封装
连接数据库 我们首先创建一个DBManager类,通过这个类new出来的对象管理一个数据库 具体关于indexedDB的相关内容可以看我的这篇博客 indexedDB class DBManager{}我们首先需要打开数据库,打开数据库需要数据库名和该数据库的版本 constructor(dbName,…...
网络编程--网络理论基础(二)
这里写目录标题 网络通信流程mac地址、ip地址arp协议交换机路由器简介子网划分网关 路由总结 为什么ip相同的主机在与同一个互联网服务通信时不冲突公网ip对于同一个路由器下的不同设备,虽然ip不冲突,但是因为都是由路由器的公网ip转发通信,接…...
Python MongoDB 基本操作
本文内容主要为使用Python 对Mongodb数据库的一些基本操作整理。 目录 安装类库 操作实例 引用类库 连接服务器 连接数据库 添加文档 添加单条 批量添加 查询文档 查询所有文档 查询部分文档 使用id查询 统计查询 排序 分页查询 更新文档 update_one方法 upd…...
Node.js 入门:
Node.js 是一个开源、跨平台的 JavaScript 运行时环境,它允许开发者在浏览器之外编写命令行工具和服务器端脚本。以下是一些关于 Node.js 的基础教程: 1. **Node.js 入门**: - 了解 Node.js 的基本概念,包括它是一个基于 Chro…...
java8 List的Stream流操作 (实用篇 三)
目录 java8 List的Stream流操作 (实用篇 三) 初始数据 1、Stream过滤: 过滤-常用方法 1.1 筛选单元素--年龄等于18 1.2 筛选单元素--年龄大于18 1.3 筛选范围--年龄大于18 and 年龄小于40 1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex男 1.5 多条件筛…...
机器学习python实践——数据“相关性“的一些补充性个人思考
在上一篇“数据白化”的文章中,说到了数据“相关性”的概念,但是在统计学中,不仅存在“相关性”还存在“独立性”等等,所以,本文主要对数据“相关性”进行一些补充。当然,如果这篇文章还能入得了各位“看官…...
MySQL——触发器(trigger)基本结构
1、修改分隔符符号 delimiter $$ $$可以修改 2、创建触发器函数名称 create trigger 函数名 3、什么样在操作触发,操作哪个表 after :……之后触发 before :……之后触发 insert :……之后触发 update :……之后触…...
数字孪生定义及应用介绍
数字孪生定义及应用介绍 1 数字孪生(Digital Twin, DT)概述1.1 定义1.2 功能1.3 使用场景1.4 数字孪生三步走1.4.1 数字模型1.4.2 数字影子1.4.3 数字孪生 数字孪生地球平台Earth-2 参考 1 数字孪生(Digital Twin, DT)概述 数字孪…...
数据赋能(122)——体系:数据清洗——技术方法、主要工具
技术方法 数据清洗标准模型是将数据输入到数据清洗处理器,通过一系列步骤“清理”数据,然后以期望的格式输出清理过的数据。数据清洗从数据的准确性、完整性、一致性、惟一性、适时性、有效性几个方面来处理数据的丢失值、越界值、不一致代码、重复数据…...
【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——中
1. 某学校对入学的新生进行性格问卷调查(没有心理学家的参与),根据学生对问题的回答,把学生的性格分成了8个类别。请说明该数据挖掘任务是属于分类任务还是聚类任务?为什么?并利用该例说明聚类分析和分类分析的异同点。 解答: (a)该数据…...
2024年注册安全工程师报名常见问题汇总!
注册安全工程师报名 24年注册安全工程师报名已正式拉开序幕,报名时间为6月18日—7月10日,考试时间为10月26日—10月27日。 目前经有12个地区公布了2024年注册安全工程师报名时间: 注册安全工程师报名信息完善 根据注安报名系统提示&am…...
JRebel-JVMTI [FATAL] Couldn‘t write to C:\Users\中文用户名-完美解决
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 热部署下载参考博客解决第一步第二步第三步:第四步: 热部署下载 下载后启动报错:JRebel-JVMTI [FATAL] Couldn’t write to C:\…...
STM32基于DMA数据转运和AD多通道
文章目录 1. DMA数据转运 1.1 初始化DMA步骤 1.2 DMA的库函数 1.3 设置当前数据寄存器 1.4 DMA获取当前数据寄存器 2. DMA数据转运 2.1 DMA.C 2.2 DMA.H 2.3 MAIN.C 3. DMAAD多通道 3.1 AD.C 3.2 AD.H 3.3 MAIN.C 1. DMA数据转运 对于DMA的详细解析可以看下面这篇…...
安卓应用开发——Android Studio中通过id进行约束布局
在Android开发中,布局通常使用XML文件来描述,而约束(如相对位置、大小等)可以通过多种方式实现,但直接使用ID进行约束并不直接对应于Android的传统布局系统(如LinearLayout、RelativeLayout等)。…...
Elasticsearch过滤器(filter):原理及使用
Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 🚀本系列文章为个人学习…...
Docker配置与使用详解
一、引言 随着云计算和微服务的兴起,Docker作为一种轻量级的容器化技术,越来越受到开发者和运维人员的青睐。Docker通过容器化的方式,将应用程序及其依赖项打包成一个可移植的镜像,从而实现了应用程序的快速部署和扩展。本文将详…...
网站开发我们都能解决/朋友圈产品推广文案
【转】http://blog.csdn.net/shangqing1123/article/details/47661389 /** * 功能:给你一堆n个箱子,箱子宽wi,高hi,深di。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。 * 实现方法&am…...
怎么查看一个网站是谁做的/怎样做app推广
Python之建模数值逼近篇–最小二乘拟合介绍系数ak的确定函数rk(x)r_k(x)rk(x)的选取理解和区别样例介绍 曲线拟合问题的提法是,已知一组(二维)数据,即平面上的n个点(xi,yi)(x_{i},y_{i})(xi,yi),i1,2,…,n,xix_…...
wordpress添加新浪微博/百度关键词排名突然消失了
播星联合创始人梁达的视频号:视商梁达今年微信悄然进军短视频领域,强势推出视频号。它带来的13亿用户基础的巨大流量,强大的社交关系链,无疑对短视频市场产生了巨大冲击,是对流量格局的重塑,可以说是当下最新的风口。今天播星给大家带来…...
自己做的网站怎么爬数据库/crm软件
引言: Dos.Common是一个开发中的常用类库,如HttpHelper、LogHelper、CacheHelper、CookieHelper、MapperHelper等等。与Dos.WeChat、Dos.CMS等集成。官方网站:http://ITdos.com/Dos/Common/Index.html 开源中国:http://www.oschin…...
中山专业手机网站建设/seo推广多少钱
文章目录 项目介绍代码实现1、导入需要的库2、参数设置3、归一化4、定义滑窗函数5、取样本6、划分训练集和测试集7、得到 Dataset 类型数据集8、建立模型9、初始化优化器10、定义损失函数11、定义梯度下降函数12、模型训练项目介绍 在此文章中,主要是对分类凯斯西储大学轴承数…...
网站开发需要的技术人员有什么软件/武汉seo网站排名优化
java jupyter无论您在培训中遇到过障碍,无论是老师还是学生,我相信我们都有相同的经验:几个小时很难集中精力。 近年来,这种情况只会变得更糟,因为手机是分散注意力的巨大来源。 结果是最重要的部分是实践。 学生需要将…...