当前位置: 首页 > news >正文

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.11master012cpu双核4G100G
192.168.10.12worker012cpu双核4G100G
192.168.10.13worker022cpu双核4G100G

版本 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 中&#xff0c;页面跳转主要可以通过两种方式实现&#xff1a;使用 <navigator> 组件和调用 UniApp 提供的导航 API。以下是这两种方式的详细说明&#xff1a; 1. 使用 <navigator> 组件 <navigator> 组件允许你在页面上创建一个可点击的元素&am…...

Stable-Diffusion-WebUI 常用提示词插件

SixGod提示词插件 SixGod提示词插件可以帮助用户快速生成逼真、有创意的图像。其中包含&#xff0c;清空正向提示词”和“清空负向提示词、提示词起手式包含人物、服饰、人物发型等各个维度的提示词、一键清除正面提示词与负面提示词、随机灵感关键词、提示词分类组合随机、动…...

单片机 PWM输入捕获【学习记录】

前言 学习是永无止境的&#xff0c;就算之前学过的东西再次学习一遍也能狗学习到很多东西&#xff0c;输入捕获很早之前就用过了&#xff0c;但是仅仅是照搬例程没有去进行理解。温故而知新&#xff01; 定时器 定时器简介 定时器的分类 高级定时器 通用定时器 基本定时器…...

3.1、前端异步编程(超详细手写实现Promise;实现all、race、allSettled、any;async/await的使用)

前端异步编程规范 Promise介绍手写Promise&#xff08;resolve&#xff0c;reject&#xff09;手写Promise&#xff08;then&#xff09;Promise相关 API实现allraceallSettledany async/await和Promise的关系async/await的使用 Promise介绍 Promise是一个类&#xff0c;可以翻…...

3.1. 马氏链-马氏链的定义和示例

马氏链的定义和示例 马氏链的定义和示例1. 马氏链的定义2. 马氏链的示例2.1. 随机游走2.2. 分支过程2.3. Ehrenfest chain2.4. 遗传模型2.5. M/G/1 队列 马氏链的定义和示例 1. 马氏链的定义 对于可数状态空间的马氏链, 马氏性指的是给定当前状态, 其他过去的状态与未来的预测…...

红利之外的A股底仓选择:A50

内容提要 华泰证券指出&#xff0c;当前指数层面下行风险不大&#xff0c;市场再入震荡期下&#xff0c;可关注三条配置线索&#xff1a;1&#xff09;A50为代表的产业巨头&#xff1b;2&#xff09;以家电/食饮/物流/出版为代表的稳健消费龙头&#xff0c;3&#xff09;消费电…...

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 我看有些伙伴&#xff0c;对标同行找写作素材和灵感的时候。 喜欢把对标文章发给ai提炼总结。 这个方法好是好&#xff0c;但是&#xff0c;有一个问题。 即&#xff0c;无法感受全文的细节。 更无法感受作者的情感和温度。 就好像电影《记忆大师》一样。 我提取了记…...

针对indexedDB的简易封装

连接数据库 我们首先创建一个DBManager类&#xff0c;通过这个类new出来的对象管理一个数据库 具体关于indexedDB的相关内容可以看我的这篇博客 indexedDB class DBManager{}我们首先需要打开数据库&#xff0c;打开数据库需要数据库名和该数据库的版本 constructor(dbName,…...

网络编程--网络理论基础(二)

这里写目录标题 网络通信流程mac地址、ip地址arp协议交换机路由器简介子网划分网关 路由总结 为什么ip相同的主机在与同一个互联网服务通信时不冲突公网ip对于同一个路由器下的不同设备&#xff0c;虽然ip不冲突&#xff0c;但是因为都是由路由器的公网ip转发通信&#xff0c;接…...

Python MongoDB 基本操作

本文内容主要为使用Python 对Mongodb数据库的一些基本操作整理。 目录 安装类库 操作实例 引用类库 连接服务器 连接数据库 添加文档 添加单条 批量添加 查询文档 查询所有文档 查询部分文档 使用id查询 统计查询 排序 分页查询 更新文档 update_one方法 upd…...

Node.js 入门:

Node.js 是一个开源、跨平台的 JavaScript 运行时环境&#xff0c;它允许开发者在浏览器之外编写命令行工具和服务器端脚本。以下是一些关于 Node.js 的基础教程&#xff1a; 1. **Node.js 入门**&#xff1a; - 了解 Node.js 的基本概念&#xff0c;包括它是一个基于 Chro…...

java8 List的Stream流操作 (实用篇 三)

目录 java8 List的Stream流操作 (实用篇 三) 初始数据 1、Stream过滤&#xff1a; 过滤-常用方法 1.1 筛选单元素--年龄等于18 1.2 筛选单元素--年龄大于18 1.3 筛选范围--年龄大于18 and 年龄小于40 1.4 多条件筛选--年龄大于18 or 年龄小于40 and sex男 1.5 多条件筛…...

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中&#xff0c;说到了数据“相关性”的概念&#xff0c;但是在统计学中&#xff0c;不仅存在“相关性”还存在“独立性”等等&#xff0c;所以&#xff0c;本文主要对数据“相关性”进行一些补充。当然&#xff0c;如果这篇文章还能入得了各位“看官…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...