k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容
文章目录
- 一、基本介绍
- 二、应用程序生命周期
- 2.1 部署应用
- 2.2 应用升级
- 2.2.1 修改YAML文件升级(交互式)
- 2.2.2 命令指定镜像版本升级(免交互式)
- 2.2.3 调用vim升级
- 2.3 滚动升级
- 2.3.1 升级流程
- 2.4 应用回滚
- 2.4.1 查看历史发布版本
- 2.4.2 回滚到上一个版本
- 2.4.3 回滚到指定版本
- 2.4.4 验证升级时会访问到新、老两个版本
- 2.5 水平扩缩容
一、基本介绍
基本了解:
- Deployment是最常用的K8s工作负载控制器(Workload Controllers),实际项目部署调试中必用资源之一,所以必须要熟练掌握deploy资源的使用。
- 它是K8s的一个抽象概念,用于更高级层次对象,部署和管理Pod。
- 其他控制器还有DaemonSet、StatefulSet等,不同控制器针对不同的需求服务,比如网页服务、微服务、集群服务、监控服务等,在不同的场景使用可以达到不同的效果。
主要功能:
- 管理Pod和ReplicaSet
- 具有上线部署、副本设定、滚动升级、回滚等功能。
- 应用场景:网站、API、微服务。
deploy在项目中的使用情况:
- 项目的大概流程是,项目立项—>开发团队开发程序——>测试人员进行业务测试——>运维人员部署项目服务——>运维现场调试升级服务或服务回滚——>功能调试完毕,项目闭环
- 在整个流程中,deploy资源都会被高频率的使用到,所以我们需要掌握它的核心功能使用,如何部署应用?如何升级应用?又如何回滚版本?
二、应用程序生命周期
- 这里使用nginx服务来模拟在项目中如何对应用进行部署、升级和回滚。
- 模拟步骤:
- 先部署一个1.16版本的nginx服务。
- 将1.16版本升级到1.17版本,模拟升级。
- 将1.17版本回滚到1.16版本,模拟回滚。
2.1 部署应用
1.编写yaml文件。
[root@k8s-master bck]# cat web666.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: wen666namespace: test
spec:replicas: 3selector:matchLabels:app: wen666template:metadata:labels:app: wen666spec:containers:- name: webimage: nginx:1.16
---
apiVersion: v1
kind: Service
metadata:name: wen666namespace: test
spec:selector:app: wen666ports:- protocol: TCPport: 80targetPort: 80type: NodePort
2.导入yaml文件。
[root@k8s-master bck]# kubectl apply -f web666.yaml
3.查看暴露端口访问网页,此时的nginx版本是1.16。
2.2 应用升级
3种镜像升级方式:
- 修改yaml文件里镜像版本,再命令导入yaml即可升级,kubectl apply -f xxx.yaml
- 直接命令行指定镜像版本免交互式升级,kubectl set image deployment 【deployment名称】【容器名称】=nginx:1.17
- 使用系统编辑器打开,kubectl edit deployment deployment名称】
2.2.1 修改YAML文件升级(交互式)
1.修改yaml文件镜像版本为1.17
2.再次执行apply,导入yaml文件
[root@k8s-master bck]# kubectl apply -f web666.yaml
3.访问网页查看nginx版本为1.17版本。
2.2.2 命令指定镜像版本升级(免交互式)
1.命令升级,指定镜像版本,升级成1.18。
[root@k8s-master bck]# kubectl set image deployment wen666 -n test web=nginx:1.18
2.刷新网页,此时ginx版本为1.18。
2.2.3 调用vim升级
1.命令交互式升级。
[root@k8s-master bck]# kubectl edit deployment wen666 -n test
2.找到镜像版本,修改成1.19,保存升级。
3.访问网页,查看nginx版本为1.19
2.3 滚动升级
主流的发布方案:
- 滚动升级:滚动发布是指每次只升级一个或多个服务,升级完成后加入生产环境,不断执行这个过程,直到集群中的全部旧版本升级到新版本。
- 蓝绿升级:将目标服务器分为两组,先升级一组上线没问题后再升级另一组。
- 灰度升级:按照一定百分比升级,例如先升级10%,继续50%,最后剩下的40%。
共同特点:
- 新旧版本平滑过度,用户无感知。
- 以前都是瀑布式升级,一次性升级所有服务器上的服务会导致诸多问题,比如存在升级失败导致的灾难性的数据丢失、爆发性的流量激增导致用户体感降低,等等。
滚动升级模型图:
2.3.1 升级流程
实现原理:
- 我们对pod里的应用升级是使用deployment资源,过程中有个叫做副本集的replicaset资源去完成升级动作。
- 滚动升级时,先升级一小部分Pod,成功后再升级一部分Pod,最终完成所有Pod升级,整个过程始终有Pod在运行,从而保证了业务的连续性。
rs概念:
- replicaset,副本集,简称rs,主要维护Pod副本数量,不断对比当前Pod数量与期望Pod数量。
rs用途:
- deployment每次发布都会创建一个RS作为记录,用于实现滚动升级和回滚。
rs工作原理:
- rs是帮deploy管理pod容器的,对其监控、创建和删除。
- 当超过deploy.yaml里指定的目标容器数量时,则删除多余容器;当小于目标数量时,则创建容器。
滚动升级流程:
- 创建的deploy资源后,就会创建一个rs去维护其下的pod容器,所以升级之前就有一个rs。如下图,rs-1为原本就存在,rs-2为滚动升级时新创建的。rs-1下的3个pod都是正常运行,等待后面的升级,而rs-2刚开始创建时就只有一个正在运行的pod。
- 滚动升级时,先进入deploy阶段1,新生成一个rs-2,rs-2正常创建一个新pod,等这个新pod创建运行成功后,rs-1就缩减一个pod,此时rs-1就只有2个pod。
- 之后进入deploy阶段2,rs-2创建第2个新pod,此时rs-2共有2个pod,一个是刚刚升级完的pod正常运行,一个是正在创建的pod2,而rs-1会在rs-2成功创建第2个pod后再次缩减一个pod,此时rs-1就剩下1个pod。
- 接下来进入deploy阶段3,rs-2创建第3个新pod,创建运行成功后rs-1缩减最后一个pod,此时rs-1就没有pod,而rs-2就有3个新pod,滚动升级完成。
相关命令:
- kubectl get rs #查看RS记录。
- kubectl rollout history deployment 【deploy名称】 #版本对应RS记录。
1.新建一个应用,nginx1.17版本。
[root@k8s-master bck]# kubectl apply -f web666.yaml
2.将1.17版本升级到1.18版本。
[root@k8s-master bck]# kubectl set image deployment wen666 web=nginx:1.18
3.此时镜像版本为1.18,查看rs副本集会有2个,c9结尾代表1.18版本的,86结尾代表1.17版本。
4.将1.18版本升级到1.19版本。
[root@k8s-master bck]# kubectl set image deployment wen666 web=nginx:1.19
5.此时查看副本集RS记录,96结尾的是1.19版本。
6.查看升级流程版本记录。
wen666-696f688c86 # 初次部署1.17版本,3个副本。
wen666-5c899556c9 # 部署1.18版本。1.17 ————> 1.18升级流程:1、新建RS,wen666-5c899556c9,并设置副本为12、缩容RS,wen666-696f688c86, 副本数由3到23、扩容RS,wen666-5c899556c9,副本数由1到24、缩容RS,wen666-696f688c86, 副本数由2到15、扩容RS,wen666-5c899556c9,副本数由2到36、缩容RS,wen666-696f688c86, 副本数由1到0
7.验证rs版本
[root@k8s-master ~]# kubectl get rs
[root@k8s-master ~]# kubectl describe rs wen666-5c899556c9
8.此时1.19————>1.20,查看rs运转流程。若新建第一个pod没成功,则不会继续往下继续创建。
2.4 应用回滚
回滚用途:
- 当项目升级失败时,可以恢复到上一个正常版本。
常用命令:
- kubectl rollout history deployment/web # 查看历史发布版本
- kubectl rollout undo deployment/web # 回滚到上一个版本
- kubectl rollout undo deployment/web --to-revision=2 # 回滚历史指定版本
注意事项:
- 回滚是重新部署某一次部署时的状态,即当时版本所有配置
2.4.1 查看历史发布版本
1.查看发布历史版本记录。
[root@k8s-master ~]# kubectl rollout history deployment wen666
2.显示版本发布记录。
2.4.2 回滚到上一个版本
1.升级1.20版本时失败了。
2.回滚到上一个版本。
[root@k8s-master bck]# kubectl rollout undo deployment wen666
3.查看回滚RS记录流程。
2.4.3 回滚到指定版本
1.查看历史版本记录。
[root@k8s-master ~]# kubectl rollout history deployment wen666
2.查看rs版本对应关系。
[root@k8s-master ~]# kubectl describe $(kubectl get rs -o name)|egrep "revision:|Image:"
3.此时回滚到历史1.19版本。
[root@k8s-master ~]# kubectl rollout undo deployment wen666 --to-revision=3
4.访问网页验证
2.4.4 验证升级时会访问到新、老两个版本
- 版本升级时,会访问到新版本,也会访问到老版本。直到所有的Pod都被替换成新版本,所以会一直能访问到网页。
1.循环访问网页,注意查看版本。
[root@k8s-master ~]# for i in {1..1000} ;do sleep 1 ;curl -I http://192.168.130.145:32659;done
2.升级到1.21版本。
[root@k8s-master bck]# kubectl set image deployment wen666 web=nginx:1.21 --record=true
3.查看访问网页返回的版本,会存在老版本和新版本都能访问到的情况,直到所有的pod都跟换成新rs后,才会一直访问成新版本。
2.5 水平扩缩容
基本了解:
- 水平扩缩容就是对pod副本数量进行增加或减少,依次提高并发。
- pod副本数量是由yaml文件里的replicas值决定,若创建deploy时没有指定副本数则默认创建一个副本。
概念图:
1.给deploy副本增加到10个。
[root@k8s-master ~]# kubectl scale deploy wen666 -n test --replicas=10
2.给deploy副本减少到5个。
[root@k8s-master ~]# kubectl scale deploy wen666 -n test --replicas=5
相关文章:

k8s基础4——deployment控制器、应用部署、升级、回滚、水平扩容缩容
文章目录 一、基本介绍二、应用程序生命周期2.1 部署应用2.2 应用升级2.2.1 修改YAML文件升级(交互式)2.2.2 命令指定镜像版本升级(免交互式)2.2.3 调用vim升级 2.3 滚动升级2.3.1 升级流程 2.4 应用回滚2.4.1 查看历史发布版本2.…...

动态规划算法——40道leetcode实例入门到熟练
目录 t0.解题五部曲1.基础入门题目1.509. 斐波那契数2.70. 爬楼梯3.746. 使用最小花费爬楼梯4.62. 不同路径5.63. 不同路径 II6.343. 整数拆分7.96. 不同的二叉搜索树 2.背包问题1.01背包(二维数组实现)2.01背包(滚动数组实现)1.4…...

Nmap入门到高级【第十一章】
预计更新第一章. Python 简介 Python 简介和历史Python 特点和优势安装 Python 第二章. 变量和数据类型 变量和标识符基本数据类型:数字、字符串、布尔值等字符串操作列表、元组和字典 第三章. 控制语句和函数 分支结构:if/else 语句循环结构&#…...

配置本地Angular环境并使用VsCode调试Angular前端项目
配置本地Angular环境并使用VsCode调试Angular前端项目 配置本地Angular环境部署Node.Js本地环境配置一下环境变量 使用vscode调试Angular安装vscode 配置本地Angular环境 部署Node.Js本地环境 1 从官网下载node.js, 本文为(v16.13.0) 下载地址: https://nodejs.org/dist/v16.…...

100ASK_全志V853-PRO开发板支持人形检测和人脸识别
1.前言 V853 芯片内置一颗 NPU核,其处理性能为最大 1 TOPS 并有 128KB 内部高速缓存用于高速数据交换,支持 OpenCL、OpenVX、android NN 与 ONNX 的 API 调用,同时也支持导入大量常用的深度学习模型。本章提供一个例程,展示如何使…...

简单实现基于UDP与TCP的回显服务器
目录 前言UDP 版的回显服务器需要用到的 api服务端客户端UDP 版本的字典客户端和字典服务器 TCP 版的回显服务器需要用到的 api服务器客户端对服务器进行改进(使用线程池)TCP 版本的字典客户端和字典服务器 前言 我们写网络程序, 主要编写的是应用层代码. 真正要发送这个数据,…...

家用洗地机有什么推荐的吗?家用洗地机哪款好
洗地机是创新、高效的清洁工具,其具有高性能的清洁能力和卓越的操作体验。与传统的清洁工具相比,洗地机可以迅速而彻底地打扫地面,降低清洁时间和人力成本,让我们在工作之余不用花费大量的时间和精力去打扫卫生,下面就…...

深度学习与文本聚类:一篇全面的介绍与实践指南
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...

AP5153 线性降压恒流驱动芯片 2.5A
AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路, 调节该外接电阻就可以调节 输出电流,输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…...
Unity物理系统脚本编程(下)
一、修改物理材质 Unity对物体表面材料的性质做了件化处理,仅有5种常用属性: Dynamic Friction(动态摩擦系数)Static Friction(静态摩擦系数)Bounciness(弹性系数)Friction Combine…...

容器技术的发展
容器技术的发展 近年来,随着计算机硬件、网络以及云计算等技术的迅速发展,云原生的概念也越来越受到业界人士的广泛关注,越来越多的应用场景开始拥抱云原生,其中容器技术的发展起着至关重要的作用。本章将介绍容器技术的基础知识…...
Python Flask request中常见存储参数的介绍
Python Flask request中常见存储参数的介绍 首先从flask模块中导入请求对象: from flask import requestrequest.form 通过method属性可以操作当前请求方法,通过使用form属性处理表单数据(本质也是得到一个字典,如果传输的是字…...

php+vue网盘系统的设计与实现
该网盘系统的开发和设计根据用户的实际情况出发,对系统的需求进行了详细的分析,然后进行系统的整体设计,最后通过测试使得系统设计的更加完整,可以实现系统中所有的功能,在开始编写论文之前亲自到图书馆借阅php书籍&am…...

[前端]深浅拷贝
一、回顾变量类型 基础类型 boolean(bool) number string null undefined 引用类型 object function array 基本类型与引用类型的存储 基本类型一般存储在 栈 (栈小) 栈一旦确认 大小就固定 可能会造成溢出栈一般是先进后出用于存储…...

文章纠错免费软件-文字校对软件免费下载
自动校对稿件的软件 自动校对稿件的软件是一种基于自然语言处理(Natural Language Processing, NLP)和机器学习(Machine Learning)技术的工具,可以较为准确地检测和纠正文本中出现的语法、拼写、标点符号以及其他笔误…...

【Redis】Redis缓存雪崩、缓存穿透、缓存击穿(热key问题)
目录 一、缓存穿透 1、概念 2、解决办法 1.缓存空对象 2.布隆过滤 二、缓存雪崩 1、概念 2、解决办法 1.给key设置随机的过期时间TTL 2.业务添加多级缓存 3.利用集群提供服务可用性 4.缓存业务添加降级限流 三、缓存击穿 1、概念 2、解决办法 1.互斥锁 2.逻辑…...
为什么很多程序员喜欢linux系统?
a> Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松…...

Bean 作用域和生命周期
✏️作者:银河罐头 📋系列专栏:JavaEE 🌲“种一棵树最好的时间是十年前,其次是现在” 目录 lombok的使用案例引入作用域定义singleton单例作用域prototype原型作用域(多例作用域)request请求作用域session会话作用域ap…...
PMP考试常见13个固定套路
一、变更批准之后 变更批准后要做三件事: 1、在变更日志中记录 2、通知相关干系人 3、更新项目管理计划 二、风险的情景题 1、先判断风险识别了,还是风险发生了。 2、若是风险识别,按风险管理程序走; 3、若是风险发生,则应采取应急措施…...

Leecode101 ——对称二叉树
对称二叉树:Leecode 101 leecode 101 对称二叉树 根据题目描述,首先想清楚,对称二叉树要比较的是哪两个节点。对于二叉树是否对称,要比较的是根节点的左子树与根节点的右子树是不是相互翻转的,其实也就是比较两个树,…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...