Kubernets Deployment详解

news2024/11/15 18:50:59

因为Pod生命周期是短暂的,一旦运行完成则立即回收,且涉及Pod的创建、自愈、删除等操作比较复杂,所以很少在Kubernetes中直接使用Pod。而是使用更高级的称为Controller(控制器)的抽象层,来完成对Pod的创建、调度及全生命周期的自动控制任务。所以从这个角度上来说,Controller可以看成是基于场景的对Pod运维的最佳实践。
这里首先介绍下Deployment,Deployment自动化的完成了Pod副本的部署、扩容和缩容、升级和回滚等运维能力。

Deployment概述

Deployment自动化的完成了Pod副本的部署、升级和回滚、扩容和缩容等运维能力。开发者只需在 Deployment声明文件中描述期望状态,然后 Deployment Controller 就会自动将 Pod 从实际状态改变到期望状态。更多 Controller的介绍可以参考官网。Deployment提供了运行Pod的能力,并且为Pod提供副本管理、升级和回滚、水平扩容和缩容等功能,一般用于运行无状态的应用

副本管理

最初Pod副本管理(副本数量始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的Pod来替代;如果副本数量不足,则会自动创建Pod)是由Replication Controller负责,这个控制器独立于所控制的Pod,并通过标签选择器控制目标Pod实例的创建和销毁。随着Kubernetes的发展,Replication Controller也出现了新的继任者——ReplicaSet,ReplicaSet进一步增强了标签选择器的灵活性。相比Replication Controller的标签选择器只能选择一个标签,ReplicaSet拥有集合式的标签选择器,可以选择多个Pod标签。而Deployment则是通过控制ReplicaSet实现对Pod的管理。相比ReplicaSet只能负责副本控制,Deployment还提供了升级和回滚、扩容和缩容等能力。
ReplicaSet使用示例如下:

apiVersion: v1
kind: ReplicaSet             # 指定资源类型
metadata:
  name: demo-replica-set
spec:
  replicas: 3                # 指定pod副本数量
  selector:                  # 可以不指定标签选择器内容,因为Kubernetes会自动更新该字段,显式声明的目的是为了方便理解
    matchLabels:
      tier: backend
    matchExpressions:
      - {key: tier, operator: In, values: [backend]}
  template:
    metadata:
      labels:
        app: demo-pod
        tier: backend
    spec:
      containers:
      - name: custom-iamge-001
        image: custom-image-name

在上述示例中,ReplicaSet通过spec.template来声明PodTemplate,而PodTemplate遵循Pod的Schema规范。也就是说,ReplicaSet会通过spec.template来创建Pod,并根据spec.replicas来控制Pod的数量,同时通过spec.selector来关联对应的Pod。
尽管ReplicaSet可以独立使用,但一般还是建议使用 Deployment 来自动管理 ReplicaSet。这主要有以下几方面的考虑:
(1) Deployment是ReplicaSet的增强。相比ReplicaSet,Deployment除了通过管理RelicaSet获得了副本管理的能力外,还支持升级和回滚、水平扩容和缩容等功能。
(2) 无需担心跟其他机制的不兼容问题。在创建 Deployment 资源对象之后,Deployment Controller 也默默创建了对应的ReplicaSet。对ReplicaSet或Replication Controller的兼容性问题,可以通过Deployment来实现透明管理。
Deployment、ReplicaSet、Pod之间是一种"层层控制"的关系,其拓扑图如下:
请添加图片描述
从上图可知,Deployment控制器实际管理的是ReplicaSet对象,而ReplicaSet管理的是Pod对象。这样,Deployment通过管理ReplicaSet,间接实现了对Pod对象的管理。使用示例如下:

apiVersion: v1
kind: Deployment                # 指定资源类型
metadata:
  name: demo-deployment
spec:
  selector:
    matchLabels:
      app: demo-app
  replicas: 2                   # 告知Deployment Controller运行2个与该模板匹配的 Pod
  template:
    metadata:
      labels:
        app: demo-app           # 定义Pod的label
    spec:
      containers:
      - name: demo-app          # 容器名称
        image: demo-app:1.0.0   # 容器镜像名称及版本
        ports:
        - containerPort: 80     # 声明的端口

在上述示例中,Deployment对象通过指定spec.replicas来指定需要运行的Pod对象的个数。然后ReplicaSet负责保证系统中Pod的个数等于指定个数。

水平扩容和缩容

在生产环境中,经常会遇到某个服务需要扩容的场景,也可能会遇到由于资源紧张或者工作负载降低而需要减少服务实例数量的场景。此时可以利用Deployment的水平扩容和缩容的能力来完成这些工作。
Kubernetes对Pod的扩缩容操作提供了手动和自动两种模式,手动模式通过运行kubectl scale命令或通过修改Deployment中Pod副本数量的方式实现。自动模式则需要用户根据某个性能指标或者自定义业务指标,并指定Pod副本数量的范围,系统将自动在这个范围内根据性能指标的变化进行调整。自动扩缩模式可以通过Horizontal Pod Autoscaler(HPA) 控制器实现,有兴趣的同学可以自行学习。这里重点介绍下手动模式。
使用kubectl scale deployment命令指定Pod副本的数量,可以实现Pod的水平扩容或缩容。示例如下:

kubectl scale deployment demo-deployment --replicas 10

上述命令将demo-deployment管理的Pod扩容到10个(之前定义的是3个)。
也可以通过

$ kubectl edit deployment/demo-deployment
deployment "demo-deployment" edited

执行kubectl edit后,会自动打开一个文本编辑器(Linux下默认是vim),通过修改spec.replicas来实现Pod的水平扩容或缩容。
水平扩展/收缩的实现原理非常简单,Deployment Controller只需要修改它所控制的ReplicaSet的Pod副本个数就可以了。比如,把这个值从3改成 10,那么Deployment所对应的RepllcaSet Controller就会根据修改后的值自动创建—个新Pod。反之,就是水平缩容。

升级和回滚

在生产环境中,需要对服务进行不中断升级(如增加页面特性或修复已知缺陷等)。此外,如果在升级的过程中出现意外,就需要快速的回退到之前的版本。以上两个场景的运维能力可以通过Deployment的升级和回滚能力实现。

升级

当集群中的某个服务需要升级时,需要停止目前与该服务相关的所有Pod,然后下载新版本镜像并创建新的Pod。如果集群规模比较大,则这个工作变成了一个挑战,而且先全部停止然后逐步升级的方式会导致较长时间的服务不可用。Kubernetes提供了滚动升级功能来解决上述问题。
如果Pod是通过Deployment创建的,则用户可以在运行时修改Deployment的Pod定义(spec.template)或镜像名称,并应用到 Deployment对象上,系统即可完成Deployment的rollout动作,rollout可被视为Deployment的自动更新或者自动部署动作。
这里将正在运行同一个应用的多个Pod的版本交替地逐一升级的过程称之为滚动更新。可以通过更新Deployment的Pod模板或容器镜像的名称来触发滚动更新。滚动更新示意图如下:
请添加图片描述
可以看到,滚动升级的过程就是旧ReplicaSet中管理Pod减少,以及新ReplicaSet中管理Pod增加的过程。
可以使用kubectl rollout status命令查看Deployment的更新过程:

$ kubectl rollout status deployment/demo-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "demo-deployment" successfully rolled out

Deployment的控制器实际上控制的是ReplicaSet的数目,以及每个ReplicaSet的属性。一个应用的版本对应的正是一个ReplicaSet。这个版本应用的Pod数量则由ReplicaSet通过ReplicaSet Controller来保证。这样就实现了应用版本和ReplicaSet一一对应的设计。

回滚

如果在Deployment升级过程中出现意外,比如写错新镜像的名称、新镜像还没被放入镜像仓库里、新镜像的配置文件发生不兼容性改变、新镜像的启动参数不对,以及因可能更复杂的依赖关系而导致升级失败等,就需要回退到之前的旧版本,这时就可以用到Deployment的回滚功能了。
只需要执行kubectl rollout undo命令,就能把整个Deployment回滚到上一个版本。

$ kubectl rollout undo deployment/demo-deployment
deployment "demo-deployment" rolled back

如果想回滚到更早之前的版本,可以先使用kubectl rollout history命令查看每次Deployment变更对应的版本。在创建Deployment时指定 --record参数,就可以创建这些版本时执行的kubectl命令被记录下来。这个操作的输出示例如下所示:

$ kubectl rollout history deployment/demo-deployment
deployments "demo-deployment":
REVISION    CHANGE-CAUSE
1           kubectl create -f https://kubernetes.io/docs/demo-deployment.yaml --record
2           kubectl set image deployment/demo-deployment demo-app=demo-app:1.0.0
3           kubectl set image deployment/demo-deployment demo-app=demo-app:0.0.1

然后,就可以在kubectl rollout undo命令行最后加上目标版本号,来回滚到指定版本了。这个指令的用法如下:

$ kubectl rollout undo deployment/demo-deployment --to-revision=2
deployment "demo-deployment" rolled back

这样,Deployment Controller还会按照滚动更新的方式完成对Deployment的降级操作。

暂停与恢复

如果对Deployment进行的每—次更新操作都会生成一个新的ReplicaSet对象,这可能会带来一定程度的资源浪费。因为可能存在需要对Deployment多次更新的操作,但是期望只生成一个ReplicaSet的情况。针对这种情况,可以使用Deployment的暂停与恢复功能。
首先,在更新Deployment前先执行一次kubectl rollout pause命令。用法 如下:

$ kubectl rollout pause deployment/demo-deployment
deployment "demo-deployment" paused

kubectl rollout pause命令的作用是让指定的Deployment进入暂停状态。接下来就可以使用kubectl edit或者kubectl set image等命令来修改这个Deployment了。注意,此时修改Deployment不会触发新ReplicaSet的生成。
等到对Deployment的修改操作都完成后,只需再执行kubectl rollout resume命令,就可以把这个Deployment恢复。

$ kubectl rollout resume deploy demo-deployment
deployment "demo-deployment" resumed

这样,对Deployment进行的所有修改最后都只会触发一次滚动更新。
需要说明的是,尽管使用Deployment的暂停和恢复功能可以一定程度减少ReplicaSet的生成,但是随着修改次数的增加,ReplicaSet的数量还是会线性的增长。为了控制ReplicaSet的数量,可以通过Deployment对象的spec.revisionHistoryLimit字段限制Deployment保留的"历史版本"个数。不建议将其值设置为0,因为这会导致无法再进行回滚操作。

参考

《Kubernetes权威指南 从Docker到Kubernetes实践全接触》 龚正 吴治辉 闫健勇 编著
《深入剖析Kubernetes》 张磊 著
https://lib.jimmysong.io/kubernetes-handbook/controllers/deployment/ Deployment
https://kubernetes.io/docs/concepts/architecture/controller/ Controllers
https://lib.jimmysong.io/kubernetes-handbook/controllers/replicaset/ ReplicationController 和 ReplicaSet
https://kubernetes.io/zh-cn/docs/tasks/run-application/run-stateless-application-deployment/ 使用 Deployment 运行一个无状态应用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何解决服务器端口被占用的问题,减少带来的影响

在现代网络环境中,服务器扮演着至关重要的角色,其稳定性和安全性对企业的正常运营具有重要意义。然而,服务器端口被占用的问题却时常困扰着企业网络管理员。本文将深入探讨服务器端口被占用的影响,并提出相应的解决方案。 一、服务…

linux ubuntu下面好用的录屏截图工具kazam 简单好用

kazam可以录屏,可以截图。 安装 apt install kazam使用 开始录制 ctrlmetashiftR 停止: ctrlmetashiftF 保存位置 ~/Videos KKVIEW:一键远控手机电脑

深圳工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

在当今数字化时代,工业制造业正面临着巨大的变革。随着技术的不断进步,工业元宇宙的概念逐渐成为推动工业制造业数字化转型的重要力量。深圳作为中国的高科技之都,在这方面走在了前列,积极探索工业元宇宙的应用,赋能新…

JUC Future 与 ForkJoin

文章目录 Runable 和 CallableFuture^1.5^FutureTask^1.5^示例 Fork/Join^1.7^ForkJoinPool^1.7^ 线程池任务的类型实例化方式 ForkJoinTask^1.7^示例执行 ForkJoinTask 任务的几个方法 Runable 和 Callable FunctionalInterface public interface Runnable {public abstract …

C语言从入门到入坟

前言 1.初识程序 有穷性 在有限的操作步骤内完成。有穷性是算法的重要特性,任何一个问题的解决不论其采取什么样的算法,其终归是要把问题解决好。如果一种算法的执行时间是无限的,或在期望的时间内没有完成,那么这种算法就是无用…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式,以相关技术概念为起点,实际环境搭建,程序部署为终点,从0到1的实操演示的学习方式,一步一步,保姆级的方式学习k8…

黑马程序员——javase进阶——day02——关键字,接口,代码块,枚举

目录: Java中的关键字 static关键字final关键字Java中的权限修饰符代码块 构造代码块静态代码块接口 接口的介绍接口的定义和特点接口的成员特点接口的案例接口中成员方法的特点枚举随堂小记 继承方法重写抽象类模板设计模式staticfinal权限修饰符接口回顾上午内容…

【云原生】Docker网络模式和Cgroup资源限制

目录 一、Docker 网络实现原理 二、Docker 的网络模式 #网络模式详解: 第一种:host模式 第二种:bridge模式 第三种:container模式 第四种:none模式 第五种:自定义网络 三、Cgroup资源控制 第一种&a…

帆软数据决策系统——用户名或密码错误解决方案

今天在公司调试本地大屏效果效果,死活登录不上数据决策系统。 附上截图: 解决方案: 找到本地FineReport设计器的安装路径,例如:D:\commonsoftware\FineReport_11.0\setup\FineReport_11.0\webapps\webroot\WEB-INF\em…

利用STM32CubeMX和Keil模拟器,3天入门FreeRTOS(4.1) —— 静态创建队列

前言 (1)FreeRTOS是我一天过完的,由此回忆并且记录一下。个人认为,如果只是入门,利用STM32CubeMX是一个非常好的选择。学习完本系列课程之后,再去学习网上的一些其他课程也许会简单很多。 (2&am…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐|技术作者 视频检索,俗称“找片儿”,即通过输入一段文本,找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展,「视频检索」越来越成为用户和视频平…

PyQtGraph 之PlotCurveItem 详解

PyQtGraph 之PlotCurveItem 详解 PlotCurveItem 是 PyQtGraph 中用于显示曲线的图形项。以下是 PlotCurveItem 的主要参数和属性: 创建 PlotCurveItem 对象 import pyqtgraph as pg# 创建一个 PlotCurveItem curve pg.PlotCurveItem()常用的参数和属性 setData(…

jQuery实现选择方法和保护信息方法

最近呢!一直在学习jQuery语法,也没时间发布文章,现在学的差不多了,先跟大家分享下学习感受吧!JavaScript学过后,再学习jQuery语法,应该是简单的,但我总是容易把它们搞混,…

day16打卡

day16打卡 104. 二叉树的最大深度 递归法时间复杂度:O(N),空间复杂度:O(N) class Solution { public:int maxDepth(TreeNode* root) {if(root nullptr) return 0;return 1 max(maxDepth(root->left), maxDepth(root->right));} };…

蓝牙----蓝牙消息传输_GATT服务发现

蓝牙消息传输_GATT服务发现 1.主机和从机GATT服务的发现2.通知的使用 1.主机和从机GATT服务的发现 GATT服务的发现由主机执行,一共三个阶段  1.处理交换 MTU 请求和响应,启动对 Simple Service 服务的发现。 if (discState BLE_DISC_STATE_MTU){// MT…

C语言之指针的地址和指向的内容总结(八十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Tomcat_项目部署局域网可访问方法

Tomcat_项目部署局域网可访问方法 前提假设tomcat已经正确安装部署,项目已经部署。 1. win+r运行ipconfig/all,查看wlan的IPv4地址。 2. 修改Tomcat配置文件Server.xml,修改以下两处为:以上查找本地IP地址。

动手学深度学习7 线性回归+基础优化算法

线性回归基础优化算法 1. 线性回归1. 模型1. 房价预测--一个简化的模型2. 拓展到一般化线性模型3. 线性模型可以看做是单层神经网络 2. 预测1. 衡量预估质量2. 训练数据3. 求解模型4. 显示解5. 总结 2. 基础优化算法1. 梯度下降2. 小批量随机梯度下降3. 总结练习 3. 线性回归的…

基于物联网设计的水稻田智能灌溉系统(STM32+华为云IOT)

一、项目介绍 随着科技的不断发展和人们生活水平的提高,农业生产也逐渐向智能化、高效化的方向发展。水稻作为我国主要的粮食作物之一,其生长过程中的灌溉管理尤为重要。传统的灌溉方式往往依赖于人工观察和控制,不仅效率低下,而…

【AD-阻塞卡顿感-捕捉功能】移动布线、移动元器件时有很强的阻塞卡顿感,移动不到想要的地方

现象如下: 解决办法: 出现这种问题是因为AD的捕捉功能设置不对,我这边设置的是全部选择,所以出现了这种阻塞卡顿感。把选项全部取消,阻塞感就消失了。 取消后的现象: 至于原理上为什么会这样&#xff0…