Kubernetes Deployment:深度解析与应用实践(上)

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、引言

1、Kubernetes简介

2、Deployment的概念

3、Deployment如何管理Pod

二、Deployment基础

1、Deployment资源定义与组成

2、Deployment与Pod、ReplicaSet的关系

三、Deployment进阶

1、Deployment更新策略

2、Deployment回滚机制

3、Deployment扩缩容操作 


一、引言

1、Kubernetes简介

Kubernetes(通常缩写为K8s)是一个开源的容器编排平台,用于自动部署、扩展和管理容器化应用程序。它最初由Google开发,并于2014年发布为开源项目,现在由云原生计算基金会(CNCF)进行维护和发展。

2、Deployment的概念

Deployment是Kubernetes中的一种资源对象,它主要用于声明应用的期望状态,并通过控制器确保集群的实际状态与这个期望状态保持一致。在Deployment中,可以定义应用程序的期望状态,如Pod副本数量、Pod模板等,而Kubernetes会以受控的速率更改实际状态以匹配这个期望状态。

3、Deployment如何管理Pod

Deployment通过控制器(Controller)来管理Pod的创建、更新和删除,实现应用程序的自动化部署和管理。

  1. 创建Pod: 当创建一个Deployment资源时,控制器会根据Deployment规格中定义的模板创建Pod。模板中包含了容器镜像、环境变量、存储卷等配置信息,控制器会根据这些信息创建相应的Pod副本。
  2. 更新Pod: 当Deployment的规格发生变化(如副本数量变化、容器镜像更新等),或者应用程序需要进行更新时,控制器会自动地根据更新策略进行Pod的更新。通常情况下,Deployment会采用滚动更新(Rolling Update)策略,逐步替换旧版本的Pod副本,确保应用程序的可用性。
  3. 删除Pod: 当Deployment资源被删除时,或者由于其他原因需要删除Pod时,控制器会负责删除与该Deployment关联的所有Pod副本,以确保资源的清理和释放。
  4. 监控和维护Pod状态: 控制器会定期检查Deployment的状态,并根据实际情况更新Pod的状态信息。这包括正在运行的副本数量、可用副本数量、更新进度等。控制器会根据这些信息来保证Deployment的期望状态和实际状态一致,确保应用程序的健康运行。

 

二、Deployment基础

1、Deployment资源定义与组成

Deployment资源在Kubernetes中主要用于控制Pod的副本数量、更新和回滚等操作。它是Kubernetes中最常用的资源对象之一,为ReplicaSet和Pod的创建提供了一种声明式的定义方法。

在Deployment对象中,用户描述一个期望的状态,Deployment控制器则会按照一定的控制速率把实际状态改成期望状态。具体来说,通过定义一个Deployment控制器,会创建一个新的ReplicaSet控制器,再通过ReplicaSet来创建Pod。如果删除Deployment控制器,那么它下面对应的ReplicaSet控制器和Pod资源也会被删除。

Deployment资源的定义与组成主要包括以下几个方面:

  • 标签选择器:用于选择需要管理的Pod。标签选择器可以基于Pod的标签进行筛选,确保Deployment只作用于特定的Pod集合。
  • 期望副本数量:定义了希望集群中运行的Pod副本数量。Deployment控制器会确保这个数量的Pod处于运行状态,如果实际数量少于期望数量,则会创建新的Pod;如果实际数量多于期望数量,则会删除多余的Pod。
  • Pod模板:定义了Pod的配置信息,包括容器镜像、端口映射、环境变量等。Deployment控制器使用这个模板来创建新的Pod实例。

示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80
  • apiVersion: apps/v1: 指定了使用的Kubernetes API版本,这里是apps/v1,表示使用Deployment资源的v1版本。
  • kind: Deployment: 定义了资源类型为Deployment,表明这是一个Deployment对象。
  • metadata: 包含了资源的元数据,包括名称(name)和标签(labels)。这里的名称是nginx-deployment,并且有一个标签app: nginx。
  • spec: 定义了Deployment的规格,包括了副本数量(replicas)、Pod选择器(selector)和Pod模板(template)。
  • replicas: 3:指定了希望创建的Pod副本数量为3个。
  • selector:用于选择要控制的Pod副本。这里指定了匹配标签app: nginx的Pod。
  • template:定义了Pod的模板,包括了Pod的元数据和规格。
  • metadata.labels: Pod模板中的标签,用于标识Pod属于哪个应用程序。这里的标签是app: nginx。
  • spec.containers: 定义了容器的规格,包括了容器的名称、镜像和端口等信息。
  • name: nginx:容器的名称为nginx。
  • image: nginx:latest:使用的容器镜像为最新版的NGINX。
  • ports.containerPort: 80:暴露容器的80端口,用于接收外部请求。

2、Deployment与Pod、ReplicaSet的关系

Deployment、Pod和ReplicaSet之间的关系可以看作是层层递进的管理关系。用户通过Deployment定义应用程序的期望状态,Deployment则通过管理ReplicaSet来实现这个状态,而ReplicaSet则负责具体管理Pod的创建、删除和更新操作。

Pod:

  • Pod是Kubernetes中可以创建和管理的最小可部署的计算单元。
  • 一个Pod可以包含一个或多个容器,这些容器共享存储、网络、以及怎样运行这些容器的声明。
  • Pod中的内容是并置的,即它们总是在同一个节点上调度和运行,共享相同的上下文环境。

ReplicaSet:

  • ReplicaSet是Pod类控制器的一种实现,它的主要目标是确保在任何时候集群中都有特定数量的Pod副本运行。
  • 根据用户定义的期望Pod数量和当前集群中实际运行的Pod数量,ReplicaSet会相应地创建或删除Pod,以确保满足期望状态。
  • 除了确保Pod数量,ReplicaSet还负责确保Pod的健康运行。如果检测到某个节点上的Pod运行出错或无法提供服务,ReplicaSet会请求调度器在其他节点上创建新的Pod。

Deployment:

  • Deployment是Kubernetes中用于声明式地管理Pod和ReplicaSet的高级资源对象。
  • 用户通过Deployment定义应用程序的期望状态,包括Pod模板和期望的副本数量等。
  • Deployment不直接管理Pod,而是管理ReplicaSet,再由ReplicaSet去管理Pod。这种方式提供了更高级别的抽象和更多的功能,如滚动更新和回滚。
  • 当Deployment的期望状态发生变化时(例如,更新了Pod模板或改变了副本数量),Deployment控制器会相应地更新ReplicaSet,再由ReplicaSet去创建或删除Pod,以实现期望状态。

三、Deployment进阶

1、Deployment更新策略

Kubernetes中的Deployment控制器支持两种主要的更新策略:滚动更新(RollingUpdate)和删除式更新(Recreate),也被称为单批次更新。默认情况下,Deployment使用的是滚动更新策略。

滚动更新(RollingUpdate):

  • 滚动更新策略允许在更新过程中一次仅更新一批Pod。当更新的Pod就绪后,再更新另一批,直到全部更新完成为止。
  • 这种策略实现了不间断服务的目标,因为总会有一定数量的Pod在提供服务。然而,在更新过程中,不同客户端得到的响应内容可能会来自不同版本的应用,导致新老版本共存的状态。
  • 滚动更新可以通过设置Deployment对象中的maxUnavailable和maxSurge字段来控制更新过程中的Pod数量。maxUnavailable表示在更新过程中允许的最大不可用Pod数量,而maxSurge则表示可以超过期望副本数的最大Pod数量。

 

删除式更新(Recreate):

  • 当更新策略设定为Recreate时,更新过程会先删除现在正在运行的Pod,等待它们完全终止后,再基于新的Pod模板创建新的ReplicaSet,并启动对应的Pod。
  • 这种更新方式会造成服务在一段时间内无法提供服务,因为所有的旧Pod都会被删除,而新的Pod还未就绪。
  • 由于其服务中断的弊端,删除式更新在生产环境中较少使用。

 

示例: 

apiVersion: apps/v1
kind: Deployment
metadata:name: example-deployment
spec:replicas: 3selector:matchLabels:app: exampletemplate:metadata:labels:app: examplespec:containers:- name: example-containerimage: nginx:lateststrategy:type: RollingUpdaterollingUpdate:maxSurge: 1maxUnavailable: 1

在上面的例子中,使用了 RollingUpdate 策略,并且定义了 maxSurgemaxUnavailable 参数来控制滚动更新过程中新旧 Pod 的数量。

  • strategy:指定了部署的更新策略。
  • type: RollingUpdate:选择了滚动更新策略,即通过逐步更新来保证服务的可用性。
  • rollingUpdate:定义了滚动更新的参数。
  • maxSurge: 1:指定了允许的最大超出副本数,在更新过程中最多可以同时创建的额外副本数。这里设置为 1,表示允许超出副本数的最大数量为 1。
  • maxUnavailable: 1:指定了允许的最大不可用副本数,在更新过程中最多可以同时不可用的副本数。这里设置为 1,表示允许不可用的最大数量为 1。

2、Deployment回滚机制

Kubernetes中的Deployment控制器提供了回滚机制,允许在更新应用程序版本后出现问题时,快速回退到先前的版本。这一机制确保了应用程序的稳定性和可靠性。

回滚操作主要依赖于Deployment控制器记录的历史版本信息。当执行更新操作时,Deployment控制器会保存更新前的状态作为历史版本。如果更新后的版本出现问题,可以通过回滚操作将Deployment和Pod的状态恢复到之前的历史版本。

Deployment的回滚机制可以按照以下步骤进行:

  1. 查看历史版本:使用kubectl命令行工具可以查看Deployment控制器的历史版本信息。通过执行命令  kubectl rollout history deployment <deployment-name>,可以列出指定Deployment的所有历史版本记录。
  2. 选择回滚目标:根据历史版本信息,选择一个要回滚到的目标版本。可以选择最近的版本,或者指定一个特定的历史版本。
  3. 执行回滚操作:使用kubectl命令行工具执行回滚操作。可以通过 kubectl rollout undo deployment <deployment-name> --to-revision=<revision> 命令来回滚到指定的历史版本。其中,<revision>是要回滚到的目标版本的版本号。

在执行回滚操作时,Deployment控制器会根据所选择的目标版本信息,将Pod的状态和配置回滚到该版本的状态。这包括Pod的镜像、环境变量、卷挂载等配置。回滚操作会逐步替换当前运行的Pod,以确保服务的连续性。

3、Deployment扩缩容操作 

Deployment扩缩容操作主要涉及到调整应用程序的副本数量,以满足不同场景下的需求。在Kubernetes中,可以通过编辑Deployment的配置文件或使用kubectl命令行工具来实现扩缩容操作。

手动扩缩容


手动扩缩容通常涉及编辑Deployment的YAML配置文件。可以通过修改replicas字段来调整期望的Pod副本数量。例如,如果想要将副本数量从3扩展到5,可以编辑Deployment的YAML文件,将replicas字段的值从3更改为5,然后应用这个更改。

示例:

apiVersion: apps/v1  
kind: Deployment  
metadata:  name: my-deployment  
spec:  replicas: 5 # 修改这里来调整副本数量  selector:  matchLabels:  app: my-app  template:  metadata:  labels:  app: my-app  spec:  containers:  - name: my-container  image: my-image:latest

应用更改后,Kubernetes将根据新配置创建或删除Pod,以达到期望的副本数量。

自动扩缩容


除了手动扩缩容外,Kubernetes还支持基于HorizontalPodAutoscaler(HPA)的自动扩缩容。HPA可以根据Pod的CPU利用率或其他自定义指标来自动调整Deployment的副本数量。

要启用自动扩缩容,需要创建一个HPA资源对象,并指定目标Deployment、最小副本数、最大副本数以及扩缩容的阈值。HPA控制器会定期检查Pod的指标,并根据当前指标与阈值的比较结果来调整Deployment的副本数量。

 💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!   

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 内核优化简笔 - 高并发的系统

简介 Linux 服务器在高并发场景下&#xff0c;默认的内核参数无法利用现有硬件&#xff0c;造成软件崩溃、卡顿、性能瓶颈。 当然&#xff0c;修改参数只是让Linux更好软件的去利用已有的硬件资源&#xff0c;如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候&am…

动态规划入门(数字三角形模型)

备战2024年蓝桥杯&算法学习 -- 每日一题 Python大学A组 试题一&#xff1a;摘花生 试题二&#xff1a;最低通行费用 试题三&#xff1a;方格取数 试题四&#xff1a;传纸条 试题一&#xff1a;摘花生 【题目描述】 Hello Kitty想摘点花生送给她喜…

基于SSM的“任务发布接收平台”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“任务发布接收平台”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 前台界面 收藏界面 留言管理界面 任务管理界面 订…

操作系统—读者-写者问题及Peterson算法实现

文章目录 I.读者-写者问题1.读者-写者问题和分析2.读者—写者问题基本解法3.饥饿现象和解决方案总结 II.Peterson算法实现1.Peterson算法问题与分析(1).如何无锁访问临界区呢&#xff1f;(2).Peterson算法的基本逻辑(3).写对方/自己进程号的区别是&#xff1f; 2.只包含意向的解…

Android手势密码–设置和校验功能的实现代码

效果图如下&#xff0c;大家感觉不错请参考实现代码 具体代码如下所示&#xff1a; private void setGesturePassword() {toggleMore.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {Overridepublic void onCheckedChanged(CompoundButton button…

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09;修复优…

基于springboot+vue+Mysql的教学视频点播系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

史上最强 PyTorch 2.2 GPU 版最新安装教程

一 深度学习主机 1.1 配置 先附上电脑配置图&#xff0c;如下&#xff1a; 利用公司的办公电脑对配置进行升级改造完成。除了显卡和电源&#xff0c;其他硬件都是公司电脑原装。 1.2 显卡 有钱直接上 RTX4090&#xff0c;也不能复用公司的电脑&#xff0c;其他配置跟不上。…

知识图谱简介:探索知识的宇宙

知识图谱简介&#xff1a;探索知识的宇宙 一、引言 在这个由数据驱动的世界里&#xff0c;信息呈现出爆炸式的增长&#xff0c;人们对于管理和利用这些庞大数据量的需求也随之增长。知识图谱以其独特的方式&#xff0c;成为了整合和利用这些信息的有力工具。它不仅有助于组织杂…

补充知识

补充知识1 内存的本质是对数据的临时存储 内存与磁盘进行交互时&#xff0c; 最小单位是4kb叫做页框(内存)和页帧(磁盘) 也就是&#xff0c; 如果我们要将磁盘的内容加载到内存中&#xff0c; 可是文件大小只有1kb&#xff0c; 我们也要拿出4kb来存他&#xff0c; 多余的就直…

01 Python进阶:正则表达式

re.match函数 使用 Python 中的 re 模块时&#xff0c;可以通过 re.match() 函数来尝试从字符串的开头匹配一个模式。以下是一个简单的详解和举例&#xff1a; import re# 定义一个正则表达式模式 pattern r^[a-z] # 匹配开头的小写字母序列# 要匹配的字符串 text "h…

【QingHub】企业级应用开发管理

QingHub 企业级应用开发设计器是QingHub Studio的一个核心模块&#xff0c;它可以实现应用搭建、团队管理&#xff0c;共享开发&#xff0c;可以快速接入API接口&#xff0c;复杂功能可以通过自定义脚本快速实现业务逻辑。打通前端开发与后台业务逻辑一体化。通过可视化的方式&…