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 update
 helm 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: nginxweb1
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginxweb1
  template:
    metadata:
      labels:
        app: nginxweb1
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        imagePullPolicy: IfNotPresent
        ports:
        - 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: nginxweb1
  namespace: default
spec:
  minReadySeconds: 30
  scaleStrategy:
    maxUnavailable: 1
  replicas: 5
  selector:
    matchLabels:
      app: nginxweb1
  template:
    metadata:
      labels:
        app: nginxweb1
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        imagePullPolicy: IfNotPresent
        ports:
        - 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: nginxweb1
  namespace: default
spec:
  minReadySeconds: 30
  scaleStrategy:
    maxUnavailable: 1
    podsToDelete:
    - nginxweb1-frcl2 # 可指定多个
  replicas: 4
  selector:
    matchLabels:
      app: nginxweb1
  template:
    metadata:
      labels:
        app: nginxweb1
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        imagePullPolicy: IfNotPresent
        ports:
        - 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: nginxweb1
  namespace: default
spec:
  minReadySeconds: 30
  updateStrategy: #添加更新策略
    type: InPlaceIfPossible
  scaleStrategy:
    maxUnavailable: 1
  replicas: 4
  selector:
    matchLabels:
      app: nginxweb1
  template:
    metadata:
      labels:
        app: nginxweb1
    spec:
      containers:
      - name: nginx
        image: nginx:latest #更换镜像版本
        imagePullPolicy: IfNotPresent
        ports:
        - 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: nginxweb1
  namespace: default
spec:
  minReadySeconds: 30
  updateStrategy: # 添加更新策略 
    type: InPlaceIfPossible
    partition: 2 # 保留旧版本pod数量
  scaleStrategy:
    maxUnavailable: 1
  replicas: 4
  selector:
    matchLabels:
      app: nginxweb1
  template:
    metadata:
      labels:
        app: nginxweb1
    spec:
      containers:
      - name: nginx
        image: nginx:1.20
        imagePullPolicy: IfNotPresent
        ports:
        - 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 原生功能的强有力补充。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

融资融券有哪些交易技巧,两融利率现在最低多少?4.0%!

融资融券交易技巧 授信额度技巧 当我们账户净资产有显著增长时,最好主动申请增加信用额度,这样在后面行情好转入资金需要进行更多融资融券交易时就不会受限于授信额度,避免因为临时申请增加额度而错过交易机会。 买入委托技巧 现金的折算率…

开发一个python工具,pdf转图片,并且截成单个图片,然后修整没用的白边及循环遍历文件夹全量压缩图片

今天推荐一键款本人开发的pdf转单张图片并截取没有用的白边工具 一、开发背景: 业务需要将一个pdf文件展示在前端显示,但是基于各种原因,放弃了h5使用插件展示 原因有多个,文件资源太大加载太慢、pdf展示兼容性问题、pdf展示效…

100V宽电压H62410A恒压芯片 24V降压5V 24V降压12V电源IC

H62410A是一款宽电压100V 内置MOS管的降压恒压芯片,适用于24V降压至5V或12V的应用场景。其内置100V耐压MOS和宽压8V-90V的输入范围,使得它能够在多种电压条件下稳定工作。同时,支持输出电压可调至3.3V,为不同设备提供了灵活的电源…

树莓派4B学习笔记11:PC端网线SSH连接树莓派

今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi) 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 版本是4.5.1: 今日学习使用网线连接树莓派,网线可以提供更…

Vue46-render函数

一、非单文件和单文件的main.js对比 1-1、非单文件的main.js 1-2、 单文件的main.js 将单文件的main.js中的render函数变成非单文件的main.js中的template形式,报如下错误: 解决方式: 二、解决方式 2-1、引入完成版的vue.js 精简版的vue&a…

TMS320F280049学习5:CPU timer中断

TMS320F280049学习5:CPU timer中断 文章目录 TMS320F280049学习5:CPU timer中断前言一、工程代码二、CPU timer时钟总结 前言 DSP的内部有3个CPU timer,分别是CUP timer0 / 1 / 2,传说CPU timer2一般在跑系统时用,类似…

【Unity】RPG2D龙城纷争(一)搭建项目、导入框架、前期开发准备

更新日期:2024年6月12日。 项目源码:后续章节发布 免责声明:【RPG2D龙城纷争】使用的图片、音频等所有素材均有可能来自互联网,本专栏所有文章仅做学习和教程目的,不会将任何素材用于任何商业用途。 索引 【系列简介】…

DSP教学实验箱_数字图像处理_操作教程:5-1 图像旋转

一、实验目的 学习图像旋转的原理,掌握图像的读取方法,并实现图像旋转。 二、实验原理 图像旋转 图像的旋转是指以图像的某一点为原点以逆时针或顺时针旋转一定的角度。其本质是以图像的中心为原点,将图像上的所有像素都旋转一个相同的角…

PHP邮箱验证码功能优化的策略?怎么配置?

PHP邮箱验证码服务怎么样?如何保障邮箱的安全性? PHP邮箱验证码是验证用户身份的常见方法之一,它通过向用户注册的邮箱发送一次性验证码来确认用户的身份。然而,为了确保这一过程既安全又用户友好,需要一些优化策略来…

hadoop/hive/DBeaver启动流程

hadoop 启动 cd到指定目录下 cd /opt/module/hadoop-3.3.0/sbin/启动文件 ./start-all.shjps一下,查看显示的内容 应该显示以下内容 NameNode SecondaryNameNode DataNode ResourceManager NodeManager如果缺少namenode,那么执行 rm -rf /tmp/hadoo…

flink1.12.0学习笔记(一)-部署与入门

flink1.12.0学习笔记(1)-部署与入门 1-1-Flink概述 Flink诞生 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期, Flink 是做 Batch 计算的,但在 2014 年, StratoS…

Linux_应用篇(19) V4L2 摄像头应用编程

ALPHA/Mini I.MX6U 开发板配套支持多种不同的摄像头,包括正点原子的 ov5640(500W 像素)、ov2640(200W 像素)以及 ov7725(不带 FIFO、 30W 像素)这三款摄像头,在开发板出厂系统上&…

30岁想自学PLC转变职业规划,行业空间如何?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「PLC的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!30岁想自学PLC转变职业规划是…

ollama模型CPU轻量化部署

一、定义 ollama 定义环境部署demo加载本地模型方法基本指令关闭开启ollamaollama 如何同时 运行多个模型, 多进程ollama 如何分配gpu修改模型的存储路径 二、实现 ollama 定义 ollama 是llama-cpp 的进一步封装,更加简单易用,类似于docker. 模型网址…

HTTP协议版本历程

HTTP协议的发展历程 版本推出年份当前状态HTTP/0.91991年已过时HTTP/1.01996年已过时HTTP/1.11997年标准HTTP/2.02015年标准HTTP/3.02022年标准 HTTP/0.9 HTTP/0.9非常简单,并不涉及数据包传输,通过请求和响应的交换达成通信,请求由单行指…

深度解析量水堰:结构、分类与设计要点

量水堰,作为水工测量中的关键设施,其精确度和多样性对于水位和流量的测量至关重要。其工作原理基于通过堰顶断面上的进水口,将水位引导至堰体内部,从而实现水位和流量的平衡。量水堰通常采用高强度、耐久的材料构建,如…

ABBYY Finereader 15中文版安装包下载及安装教程

​ABBYY FineReader 是一款功能强大的 OCR(Optical Character Recognition)软件,可以将扫描的文档转换为可编辑的文本文件。它不仅可以识别文本,还可以识别表格、图像和布局,使得文档的转换更加准确和方便。 安 装 包 …

考试系统提供源码能做什么?

考试系统提供源码,无疑为现代教育领域注入了新的活力。源码,作为软件开发的基石,其开放与共享的特性使得考试系统具备了前所未有的灵活性和可定制性。那么,考试系统提供源码究竟能做什么呢?本文将详细探讨其多重功能与…

如何警用root用户登录ssh

使用tail指令,可以动态查看日志信息。 (tail -f /var/log/secure或messages) 使用>符号,可以清空日志内容,不删除文件本身。 禁用root用户为以下步骤: 首先使用useradd创建用户(可以修改为其…

不可思议!这款 Python 库竟然能自动生成GUI界面:MagicGUI

目录 什么是MagicGUI? ​编辑 MagicGUI的工作原理 安装MagicGUI 创建你的第一个GUI ​编辑 其他案例 输入值对话框 大家好,今天我们来聊一聊一个非常有趣且实用的Python库——MagicGUI。这个库可以让你用最少的代码,快速创建图形用户…