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

【kubernetes】kubernetes中的Deployment使用

1 Why need Deployment?

K8S中Pod是用户管理工作负载的基本单位,Pod通常通过Service进行暴露,因此,通常需要管理一组Pod,RC和RS主要就实现了一组Pod的管理工作,其中,RC和RS的区别在于,RS提供更加高级的选择器(RS支持基于集合的选择符)。

在实际生产环境中,应用在初次部署完成后,当测试正常才会对外提供服务,之后就都是升级操作,而升级过程中,意味着删除老的Pod,并创建新的Pod。对于RS而言,如果需要升级Pod的镜像,可以使用kubectl edit修改RS中的Pod的镜像,或者直接修改RS的资源文件,然后执行kubectl apply,但是,这样做的话,会使得服务在短期内的不可用。虽然Service可以保证请求只路由到ready的Pod,并且RS会按照一定的策略删除老的Pod,然后再创建新的Pod,但是,在删除和创建的过程中可能无法保证服务的正常:无法保证永远有Pod在ready状态;无法保证有一定数量的Pod在处理请求。

为了解决服务更新的问题,K8S在RS的基础上提供了Deployment,它最大的特点是提供了滚动升级的能力,并且可以控制升级的速率,使得升级过程中可以正常提供服务,因此,通常都是使用Deployment,而不是RC或者RS。

2 Problem of ReplicaSet

设想一下,在只有RS的情况下,如何进行滚动升级,当然,在设计滚动升级流程之前必须要明确几个目标:

  • 升级过程中有固定数量的Pod提供服务
  • 为了保证服务不发生抖动,给定灰度的时间,可以减缓升级的速率
  • 如果升级过程中发现请求处理异常可以及时回退

为了实现这些目标,在只有RS的情况下,你可能会这么做(假设RS的replicas为3):

  • 用新的Pod的template创建新的RS,然后在RS的selector中新增标签,假设为A,并且RS的replicas设置为0
  • 在原来的RS的selector和Pod中都加一个标签,假设为B,这样的话,这些Pod就只被老的RS管理,并通过Service对外暴露
  • 将老的RS的replicas减1,新的RS的replicas加1,现在,old_replicas=2,new_replicas=1,并且由于A、B的存在,新老RS只管理各自的Pod,互不干扰,而这些Pod都可以被Service选择
  • 此时,Service的Pod同时有新老两个版本,这时候就可以通过监控查看成功率,如果没有问题,等待一段时间(相当于灰度时间)
  • 确认新的Pod没有问题,继续升级:老的RS的replicas继续减1,新的RS的replicas继续加1,现在old_replicas=1,new_replicas=2,继续关注监控指标
  • 继续升级:old_replicas=0,new_replicas=3,此时,所有的Pod都升级到了新版本

升级过程中总是有3个Pod提供服务,如果升级过程发现异常,可以直接修改old_replicas进行回退,同时,为了持续观察新的Pod的情况,在新的Pod创建完成后,不是立刻就对外提供服务,而是会等待一段时间,用于观察请求成功率,从而决定是否继续进行升级。

上面的过程比较复杂,而且灰度期间如果有问题,需要人工回滚,为了解决滚动更新的问题,K8S提供了Deployment,相比于ReplicaSet,它最大的优势就是滚动更新。

3 What is Deployment

从基础字段上看Deployment跟ReplicaSet没有任何区别,都是在Pod的基础上增加replicas字段,保证副本的数量,Deployment的主要功能也是保证副本的数量。但是,为了保证服务的可用性,相比于ReplicaSet,Deployment提供了滚动更新的能力。

Deployment提供的滚动更新跟上面的人工更新过程类似,也是创建额外的RS,然后修改新老RS的replicas值,然后再添加一些策略,例如,是全部一起更新,还是一个接一个的更新。

4 How to use Deployment

由于Deployment要创建多个Pod的副本,因此,Deployment中十分重要的字段就是PodTemplate和副本数:deployment.spec.template、deployment.spec.replicas。

剩下的字段基本都跟升级相关:

  • deployment.spec.progressDeadlineSeconds:当Deployment在一段时间内还没有升级成功,则会在deployment.status.conditions中的Progressing设置为False
  • deployment.spec.revisionHistoryLimit:保存用于回滚的历史版本数量,默认是10
  • deployment.spec.strategy:升级策略,这里有两种策略:Recreate、RollingUpdate。当deployment.spec.strategy.typeRollingUpdate时,表示滚动更新,并且可以设置deployment.spec.strategy.rollingUpdate.maxSurge(最大峰值,升级过程中可以创建出的超过预期pod数量的pod个数)和deployment.spec.strategy.rollingUpdate.maxUnavailable(最大不可用,升级过程中不可用的pod的数量,可以使用数字和百分比)。当deployment.spec.strategy.typeRecreate时,会干掉所有pod,当所有pod被干掉后,再创建新的pod。
kubectl create deployment --image=nginx my-nginx

上述语句创建了一个nginx的deployment,副本数和升级策略都是用的默认值:replcas=1,maxSurge=25%,maxUnavailable=25%。

4.1 Deployment相关资源和字段解释
kubectl get deploy my-nginx

上述命令可与查看该deployment,输出的结果中有三个重要字段:

  • READY:就绪的pod数量,
  • UP-TO-DATE:pod的定义与deployment中的Pod模板相同的pod的个数
  • AVAILABLE:可用的pod数量
4.2 Deployment的升级

Deployment通常通过更新镜像进行升级:

kubectl set image deploy my-nginx nginx=nginx:1.9.1
kubectl annotate deploy my-nginx kubernetes.io/change-cause="set nginx to 1.9.1"

上述语句先更新my-nginx这个Deployment的nginx容器的镜像,再使用annotate设置变更的原因,最后可以使用kubectl rollout status deploy my-nginx查看更新状态。

执行kubectl describe deploy my-nginx可以查看更新过程:

请添加图片描述

同时可以查看历史版本:

请添加图片描述

这里的CHANGE-CAUSE就是上面设置的annotate,另外,这里需要注意的是,这里只会保存不重复的版本,如果用两个镜像交替更新,这里只会保存两个版本。

4.3 Deployment的回滚

当升级过程中出现问题,如果是升级过程就卡主了,例如,pod没起来,或者拉取镜像失败,老的pod不会被干掉,此时也不会有啥问题。如果是程序的bug造成的问题,通过监控或者其他方式验证发现了问题,可以对Deployment进行回滚。

kubectl rollout undo deploy my-nginx

此时,deployment会回到上个版本,并且在rollout history中可以看到之前的版本换到了最新版本,版本号加1:

请添加图片描述

当然,也可以回滚到指定版本:

kubectl rollout undo deploy my-nginx --to-revision=3
4.4 Deployment的手动缩放

当pod数量不够或者过多时,可以手动修改Deployment的replicas配置:

kubectl scale deploy my-nginx --replicas=3

收到将Deployment的副本数设置为3。

5 小结

Deployment作为k8s中无状态部署的最常用的资源,所有的业务逻辑层的高可用和负载均衡都会用它来部署。当Deployment资源已经创建后,可以通过kubectl set imagekubectl scale更新镜像和副本数,还能够使用kubectl rollout undo进行回滚,同时,可以使用kubectl rollout history查看历史版本。

相关文章:

【kubernetes】kubernetes中的Deployment使用

1 Why need Deployment? K8S中Pod是用户管理工作负载的基本单位,Pod通常通过Service进行暴露,因此,通常需要管理一组Pod,RC和RS主要就实现了一组Pod的管理工作,其中,RC和RS的区别在于,RS提供更…...

百度2024校招机器学习、数据挖掘、自然语言处理方向面试经历

本文介绍2024届秋招中,百度的机器学习/数据挖掘/自然语言处理工程师岗位一面的面试基本情况、提问问题、代码题目等。 8月初参与了百度提前批的机器学习/数据挖掘/自然语言处理工程师岗位面试,所在部门是搜索方向的。一面结束之后就知道凉了,…...

RabbitMQ原理(二):SpringAMQP编程

文章目录 3.SpringAMQP3.1.导入Demo工程3.2.快速入门3.1.1.消息发送3.1.2.消息接收3.1.3.测试3.3.WorkQueues模型3.3.1.消息发送3.3.2.消息接收3.3.3.测试3.3.4.能者多劳3.3.5.总结3.4.交换机类型3.5.Fanout交换机3.5.1.声明队列和交换机3.5.2.消息发送3.5.3.消息接收3.5.4.总结…...

什么是SQL注入(SQL Injection)?如何预防它

什么是 SQL 注入(SQL Injection)?如何预防它? SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在应用程序的输入中插入恶意SQL代码来执行未经授权的数据库操作。SQL注入攻击可能导…...

metrology

创建模型:create_metrology_model 设置图像大小:set_metrology_model_image_size 添加测量模型:add_metrology_object_rectangle2_measure 设置对象参数:set_metrology_object_param 设置模型参数:set_metrology_model…...

UE学习记录06----根据Actor大小自适应相机位置

背景: staticMesh 会根据业务需要随时变化,然后通过staticMesh的大小自适应相机位置,捕捉画面用来预览该模型,使模型在画布中不会太大导致显示不全,也不会太小 参考: UE实现相机聚焦物体功能_右弦GISer的…...

Go-Python-Java-C-LeetCode高分解法-第八周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 本文部分内容来自网上搜集与个人实践。如果任何信息存在错误,欢迎…...

数据结构--并查集

一、并查集的概念 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。 最裸并查集: 合并元素a和元素b 所在的集合。查询元素a和元素b 是否属于同一组。是否在一个…...

Leetcode 224. 基本计算器

文章目录 题目代码&#xff08;10.1 首刷看解析&#xff09; 题目 Leetcode 224. 基本计算器 代码&#xff08;10.1 首刷看解析&#xff09; class Solution { public:int calculate(string s) {stack<int> sk; // 存储正负号sk.push(1);int sign 1;int res 0;int i…...

Linux基础命令汇总

用户管理 su 切换用户&#xff1a;su 用户名 logname 显示当前用户的登录用户名&#xff1a;logname useradd 创建用户&#xff1a;useradd 用户名创建用户时指定用户的主组&#xff1a;useradd -g 组名 用户名 usermod 添加附属组&#xff1a;usermod -G 组…...

JAVA 获得特定格式时间

0 背景 我们有时要获取时间&#xff0c;年月日时分秒周几&#xff0c;有时要以特定的格式出现。这时就要借助 SimpleDateFormat 或者 DateTimeFormatter。有时要某个月份有多少天需要借助 Calendar。所以有必要了解一些知识。 1 SimpleDateFormat simpledateFormat 线程不安全…...

问题: 视频颜色问题,偏绿

参考 什么是杜比视界&#xff1f; - https://www.youtube.com/watch?vldXDQ6VlC7g 【哈士亓说】07&#xff1a;HDR、杜比视界究竟是个啥&#xff1f;为什么这个视频还不是HDR视频&#xff1f; - https://www.youtube.com/watch?vrgb9Xg3cJns 正文 视频应该是 杜比视界 电…...

智能文字识别技术——AI赋能古彝文保护

前言 人工智能在古彝文古籍保护方面具有巨大的潜力和意义。通过数字化、自动化和智能化的手段&#xff0c;可以更好地保护和传承古彝文的文化遗产&#xff0c;促进彝族文化的传承和发展。 文章目录 前言一、古彝文是什么&#xff1f;1.1古彝文的背景1.2古彝文古籍保护背景 二、…...

Linux压缩和解压命令大全:tar、gzip和zip完整教程

文章目录 linux中的压缩和解压命令简介什么是压缩和解压为什么要使用压缩和解压命令压缩命令tar命令创建.tar文件压缩目录压缩多个文件或目录 gzip命令压缩文件压缩后删除原文件压缩整个目录 zip命令创建.zip文件压缩文件或目录设置压缩级别 解压命令tar命令解压.tar文件解压到…...

Vue3 reactive和ref详解

reactive Vue3.0中的reactive reactive 是 Vue3 中提供的实现响应式数据的方法。在 Vue2 中响应式数据是通过 defineProperty 来实现的&#xff0c;在 Vue3 中响应式数据是通过 ES6 的 Proxy来实现的。reactive 参数必须是对象 (json / arr)如果给 reactive 传递了其它对象 默…...

jvs-rules(规则引擎)和jvs智能bi(自助式数据分析)9.22更新内容

规则引擎更新功能 新增: 1.新增节点匹配筛选 用于做多个条件的数据筛选&#xff0c;以便将符合条件的数据传递给下一个节点进行处理&#xff0c;通常用于实现复杂的查询逻辑。 2.复合变量节点新增判断条件选项说明 用户可以根据自己的需求&#xff0c;为复合变量节点添加不…...

Leetcode算法题练习(一)

目录 一、前言 二、移动零 三、复写零 四、快乐数 五、电话号码的字母组合 六、字符串相加 一、前言 大家好&#xff0c;我是dbln&#xff0c;从本篇文章开始我就会记录我在练习算法题时的思路和想法。如果有错误&#xff0c;还请大家指出&#xff0c;帮助我进步。谢谢&…...

Xilinx FPGA 7系列 GTX/GTH Transceivers (5)-- Aurora 8b10b 信号传输实战--小试牛刀

第一节:Xilinx FPGA 7系列 GTX/GTH Transceivers (1)–了解了GTX硬件的基础知识 第二节:IBERT GTX --通过Ibert IP测试链路通信 第三节:aurora 8b10b single lane 4byte–学习官方历程 第四节:aurora 8b10b single lane 4byte–修改官方例子,发收递增数。 GTX/GTH Transc…...

第三章:最新版零基础学习 PYTHON 教程(第七节 - Python 运算符—Python 成员身份和身份运算符)

Python 提供了两个成员资格运算符来检查或验证值的成员资格。它测试序列(例如字符串、列表或元组)中的成员资格。 in 运算符: “in”运算符用于检查序列中是否存在字符/子字符串/元素。如果在序列中找到指定元素,则求值为 True,否则求值为 False。例如, CSDNforCSDN 中…...

【Java 基础篇】Java 注解详解

在 Java 编程中&#xff0c;注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它提供了关于程序代码的额外信息。注解不直接影响程序的执行&#xff0c;但可以在运行时提供有关程序的信息&#xff0c;或者让编译器执行额外的检查。 本文将详细介绍 Java 注解的…...

别再死记硬背Sarsa公式了!用Python手搓一个‘胆小’的迷宫探索AI(附完整代码)

用Python打造胆小如鼠的迷宫AI&#xff1a;Sarsa算法实战图解 当你在迷宫中小心翼翼地贴着墙走&#xff0c;生怕掉进陷阱时——恭喜&#xff0c;你已经理解了Sarsa算法的核心思想。今天我们不谈枯燥的数学公式&#xff0c;而是用Python构建一个会"瑟瑟发抖"的迷宫探索…...

避坑指南:C# ComboBox那些容易踩的坑(SelectedIndexChanged的诡异事件)

C# ComboBox开发避坑实战&#xff1a;SelectedIndexChanged的7个隐秘陷阱与解决方案 下拉框控件ComboBox看似简单&#xff0c;却暗藏诸多让开发者抓狂的"坑"。我曾在一个仓储管理系统中&#xff0c;因为ComboBox的异常行为连续加班三晚——数据绑定时的SelectedInde…...

如何守护.NET应用源代码安全?Obfuscar开源混淆方案深度解析

如何守护.NET应用源代码安全&#xff1f;Obfuscar开源混淆方案深度解析 【免费下载链接】obfuscar Open source obfuscation tool for .NET assemblies 项目地址: https://gitcode.com/gh_mirrors/ob/obfuscar 在数字化时代&#xff0c;.NET应用程序面临着严峻的源代码安…...

Java面试如何突击?核心知识点有哪些?该如何准备拿下offer?

一、Java 面试核心知识点&#xff08;按考察优先级排序&#xff09;1. Java 基础面向对象&#xff1a;封装、继承、多态&#xff08;重载与重写&#xff09;、抽象类与接口的区别。String 系列&#xff1a;String 不可变性、StringBuilder 与 StringBuffer 的区别、常量池。集合…...

EVE舰船配置神器Pyfa全攻略:从新手到专家的实战指南

EVE舰船配置神器Pyfa全攻略&#xff1a;从新手到专家的实战指南 【免费下载链接】Pyfa Python fitting assistant, cross-platform fitting tool for EVE Online 项目地址: https://gitcode.com/gh_mirrors/py/Pyfa 在EVE Online的浩瀚宇宙中&#xff0c;每一位舰长都需…...

bully使用教程

bully是一款用于破解Wi-Fi Protected Setup&#xff08;WPS&#xff09;的工具&#xff0c;主要通过暴力破解WPS PIN码来获取无线网络的访问权限。WPS是一种简化Wi-Fi设备连接的协议&#xff0c;由于其设计缺陷&#xff0c;使得通过暴力破解PIN码来获取网络密钥成为可能。bully…...

AI神器10秒搞定网申,求职效率翻倍

投简历填表单填到崩溃?这个AI神器帮你10秒搞定网申,海投效率直接拉满! 秋招春招跑过招聘季的朋友,一定都懂这种窒息感: 好不容易筛好了目标公司,点开招聘官网,迎面而来就是几十项的简历表单。姓名、电话、邮箱、教育经历从高中填到大学、实习经历要写清每段的起止时间…...

5分钟极速部署!Billion Mail容器化方案助力邮件营销升级 [特殊字符]

5分钟极速部署&#xff01;Billion Mail容器化方案助力邮件营销升级 &#x1f680; 【免费下载链接】BillionMail Billion Mail is a future open-source email marketing platform designed to help businesses and individuals manage their email campaigns with ease 项目…...

突破3大技术瓶颈:抖音音乐批量下载工具的创新解决方案

突破3大技术瓶颈&#xff1a;抖音音乐批量下载工具的创新解决方案 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作领域&#xff0c;音频素材的获取与管理已成为制约生产力的关键因素。特别是当…...

CasRel开源镜像部署教程:适配低显存(12GB)GPU的轻量级方案

CasRel开源镜像部署教程&#xff1a;适配低显存&#xff08;12GB&#xff09;GPU的轻量级方案 1. 前言&#xff1a;为什么选择这个方案 如果你正在处理文本数据&#xff0c;想要自动提取人物、地点、事件之间的关系&#xff0c;那么关系抽取技术就是你需要的工具。CasRel作为…...