Deployment Controller详解(上)

news2025/2/1 6:52:08

上一篇在《Kubectl 部署无状态应用》中介绍了如何使用 Deployment 部署五个 hello world 实例时,我们并没有详细探讨 Deployment Controller 的各项功能。因此,本文将深入介绍 Deployment Controller 的作用以及它能够完成的任务。

本文来自官方文档梳理:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

1. 什么是 Deployment?

Deployment 为 Pod 和 Replica Set(下一代 Replication Controller)提供声明式更新。

只需要在 Deployment 中描述您想要的目标状态是什么,Deployment controller 就会帮您将 Pod 和 ReplicaSet 的实际状态改变到您的目标状态。您可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。

  • 定义 Deployment 来创建 Pod 和 ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续 Deployment

写到这,想起当年在某节打工时的一个场景:研发上线时,可以选择是否对当前服务进行扩缩容、按照比例对服务进行灰度、回滚服务等等。

是的,这一系列的功能,背后就是Deployment Controller在起作用。

创建Deployment

上一篇中使用了官方提供的node example例子。在本文中,此次将使用nginx镜像进行演示。

以下是部署的示例。它创建一个 ReplicaSet 来启动三个nginxPod:

vim nginx-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
  1. 执行:
kubectl apply -f nginx-deployment.yaml
  1. 查看Deployment 是否已创建:
kubectl get deployments
------
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment      3/3     3            3           2m2s
  1. 要查看Deployment 创建的ReplicaSet,可以运行:
kubectl get rs
------
NAME                            DESIRED   CURRENT   READY   AGE
nginx-deployment-86dcfdf4c6     3         3         3       4m10s
  1. 要查看为每个 Pod 自动生成的标签,可以运行:
kubectl get pods --show-labels
------
NAME                                  READY   STATUS    RESTARTS   AGE     LABELS
nginx-deployment-86dcfdf4c6-2tdlj     1/1     Running   0          6m19s   app=nginx,pod-template-hash=86dcfdf4c6
nginx-deployment-86dcfdf4c6-jqs52     1/1     Running   0          6m19s   app=nginx,pod-template-hash=86dcfdf4c6
nginx-deployment-86dcfdf4c6-vhpsv     1/1     Running   0          6m19s   app=nginx,pod-template-hash=86dcfdf4c6

2. 更新部署

注意:当且仅当 Deployment 的 Pod 模板(即.spec.template)发生更改(例如,模板的标签或容器映像更新)时,才会触发 Deployment 的推出。其他更新(例如扩展部署)不会触发部署。

  1. 将nginx Pod 从nginx:1.14.2更新成nginx:1.16.1
kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1

或者使用kubectl edit deployment/nginx-deployment来对文件手动进行更改。

  1. 查看部署状态

运行kubectl get rs可以看到 Deployment 通过创建新的 ReplicaSet 并将其扩展到 3 个副本,以及将旧的 ReplicaSet 缩减到 0 个副本来更新 Pod。

输出类似于:

NAME                            DESIRED   CURRENT   READY   AGE
nginx-deployment-848dd6cfb5     3         3         3       3m10s
nginx-deployment-86dcfdf4c6     0         0         0       12m
  • 下次想要更新这些Pod时,只需再次更新Deployment的Pod模板即可。
  • 部署可确保更新时只有一定数量的 Pod 处于关闭状态。默认情况下,它确保至少有 75% 的所需 Pod 数量处于运行状态(最多 25% 不可用)。
  • 部署还确保仅创建高于所需 Pod 数量的一定数量的 Pod。默认情况下,它确保最多 125% 的所需 Pod 数量处于启动状态(最大激增 25%)。
  • 例如,如果你仔细观察上面的 Deployment,你会发现它首先创建了一个新的 Pod,然后删除了一个旧的 Pod,并创建了另一个新的 Pod。在出现足够数量的新 Pod 之前,它不会杀死旧 Pod;并且在杀死足够数量的旧 Pod 之前,它不会创建新 Pod。它确保至少有 3 个 Pod 可用,并且总共最多有 4 个 Pod 可用。如果部署有 4 个副本,Pod 的数量将在 3 到 5 之间。
  1. 查看部署详细信息

kubectl describe deployments


这里可以看到,当第一次创建Deployment时,它创建了一个ReplicaSet(nginx-deployment-86dcfdf4c6),并直接将其扩展到3个副本。当更新 Deployment 时,它创建了一个新的 ReplicaSet (nginx-deployment-848dd6cfb5) 并将其扩展到 1 并等待它出现。然后将旧的 ReplicaSet 缩小到 2 个,将新的 ReplicaSet 扩大到 2 个,这样每次都至少有 3 个 Pod 可用,最多创建 4 个 Pod。然后,它使用相同的滚动更新策略继续扩展和缩小新旧 ReplicaSet。最后,新的 ReplicaSet 中将有 3 个可用副本,而旧的 ReplicaSet 会缩小到 0。

3. 回滚部署

假设在更新部署时犯了拼写错误,将nginx:1.16.1写成了nginx:1.161

kubectl set image deployment/nginx-deployment nginx=nginx:1.161

执行kubectl rollout status deployment/nginx-deployment来验证执行过程。

此时,可以 Ctrl-C 停止掉,执行kubectl get rs

查看创建的 Pod,您会发现新 ReplicaSet 创建的 1 个 Pod 陷入了镜像拉取循环。

kubectl get pods

注意:部署控制器会自动停止错误的部署,并停止扩展新的副本集。这取决于maxUnavailable指定的rollingUpdate 参数。Kubernetes 默认将该值设置为 25%。

要解决此问题,您需要回滚到之前稳定的 Deployment 版本。

1. 首先,检查此 Deployment 的历史修订
kubectl rollout history deployment/nginx-deployment


CHANGE-CAUSE在创建时,从部署注释复制kubernetes.io/change-cause到其修订版本。此处,本文并没有进行注释,因此CHANGE-CAUSE显示none。

CHANGE-CAUSE可以通过使用注释部署方式指定消息:

kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to 1.16.1"
2. 查看每个修订的详细信息
kubectl rollout history deployment/nginx-deployment --revision=2
3. 回滚到以前的修订

撤消当前的修改并回滚到以前的修订版

kubectl rollout undo deployment/nginx-deployment

或者

kubectl rollout undo deployment/nginx-deployment --to-revision=2

再次执行kubectl get deployment nginx-deployment查看是否回滚。

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

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

相关文章

CAS机制

Java中提供了很多原子操作类来保证共享变量操作的原子性。这些原子操作的底层原理都是使用了CAS机制。在使用一门技术之前,了解这个技术的底层原理是非常重要的,所以本篇文章就先来讲讲什么是CAS机制,CAS机制存在的一些问题以及在Java中怎么使…

浅谈测试自动化selenium之POM模式

基于本人也是一个初学者,在运用POM模式的时候记录一下自己的学习笔记。 如果你是大神,那么可以略过,如果你是初学者,希望对你有帮助。 本文阐述了以下几个问题: 什么叫POM模式 为什么要用POM模式 POM模式的思想 POM模…

前端案例—antdDesign的Select多选框组件加上全选功能

前端案例—antdDesign的Select多选框组件加上全选功能。 实现效果如下: Select 组件里有这个属性,可以利用这个对下拉菜单进行自定义。 const handleChange (e, value) > {setSelectState(e.target.checked)let arr productOptions?productOption…

AI绘画中CLIP文本-图像预训练模型

介绍 OpenAI 在 2021 年提出了 CLIP(Contrastive Language–Image Pretraining)算法,这是一个先进的机器学习模型,旨在理解和解释图像和文本之间的关系。CLIP 的核心思想是通过大规模的图像和文本对进行训练,学习图像…

口碑好的国产主食冻干猫粮品牌有哪些?盘点十大放心猫粮国产名单

冻干猫粮可以帮助猫咪摄入更多的水分,因为冻干是高蛋白质的食物,当猫咪吃了冻干猫粮后,会感到口渴,从而更主动地去喝水。对于那些不喜欢喝水的猫咪,可以将冻干复水后再喂给它们,这样也可以增加猫咪的水分摄…

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一:管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式(GPIO_MODE_AF_PP)!!!,注意:复用开漏模式软件仿真时无波形。 步骤二:编译程序。 ①点击编译按钮。 …

【泛型中K T V E? Object等分别代表什么含 义】

✅ 泛型中K T V E? Object等分别代表什么含义 ✅ 典型解析✅代码示例 ✅ 典型解析 E - Element (在集合中使用,因为集合中存放的是元素) T-Type (Java 类) K- Key (键) V - Value (值) N - Number (数值类型) ? - 表示不确定的iava类型 (无限制通配符类型) …

机器学习:手撕 AlphaGo(一)

图 1-1: AphaGo 结构概览 1. 前言 AlphaGo 是一个非常经典的模型,不论从影响力还是模型设计上。它的技术迭代演进路径:AlphaGo,AlphaGoZero,AlphaZero,MuZero 更是十分精彩。相信有很多同学因为听了 AlphaGo 的故事对…

中国化妆品头部企业环亚集团携美肤宝、法兰琳卡、滋源、肌肤未来等“新朋友”加入实在智能数智生态圈

广州环亚化妆品科技股份有限公司(以下简称“环亚集团”)是一家综合性美容化妆品高新技术企业,旗下拥有美肤宝、法兰琳卡、滋源、肌肤未来等多个品牌,产品涵盖洁肤护肤、洗护发、身体护理、精油等多个领域。在中国、澳大利亚、美国…

upset 绘制

好久没有更新,今天来一个upset图的绘制 1.1 安装包 #绘制upset的包现在看来有三个 ## UpSet ### 最基本的upsetR包,使用方便,但是扩展不方便 devtools::install_github("hms-dbmi/UpSetR") ## complex-upset ### UpSet的升级款 支持ggplot2 devtools::install_git…

Multi-value PBS

参考文献: [CIM19] Carpov S, Izabachne M, Mollimard V. New techniques for multi-value input homomorphic evaluation and applications[C]//Topics in Cryptology–CT-RSA 2019: The Cryptographers’ Track at the RSA Conference 2019, San Francisco, CA, …

【C#】TimeSpan

文章目录 概述属性时间计算拓展来源 概述 TimeSpan结构:表示一个时间间隔。 它含有以下四个构造函数: TimeSpan(Int64)将 TimeSpan结构的新实例初始化为指定的刻度数。(DateTime.Tick:是计算机的一个计时周期,单位是一百纳秒&…

饥荒Mod 开发(十七):手动保存和加载,无限重生

饥荒Mod 开发(十六):五格装备栏 饥荒Mod 开发(十八):Mod 添加配置选项 饥荒游戏会自动保存,本来是一个好的机制,但是当角色死亡的时候存档会被删除,又要从头开始,有可能一不小心玩了很久的档就直接给整没了…

计算机网络——物理层概述(二)

前言: 前面已经对计算机网络的概述有了一个简单的认识与了解了,什么是计算机网络,为什么学习计算机网络,计算机网络的概念与体系结构我们已经有了一个初步的认识与了解,现在我们要对计算机网络中的物理层进行一个学习与…

基于YOLOv8深度学习的智能玉米害虫检测识别系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

C语言的scanf输入函数的介绍分享

各位少年: 我来分享一个输入函数,scanf函数 是输入的函数,scanf(“参数1”,参数2);好,我们接着看代码的例子 int main() { int score0; printf("请输入成绩:"); scanf("%d",&sco…

关于YOLOv5的训练,GPU单卡、多卡设置,加速训练

yolov5毫无疑问是目前目标检测框架中非常准确快速的检测框架之一,在工业界和学术界应用广泛,其优势不言而喻。 在模型训练或推理时,我们都想快速完成,特别是数据量很大的时候,效率就是非常迫切需要提升的。这里简单介…

【MAC、IOS】charles抓包配置教程,亲测有效

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

Python并行编程详解:发挥多核优势的艺术

更多资料获取 📚 个人网站:ipengtao.com 在当今计算机时代,充分发挥多核处理器的性能是提高程序运行效率的关键。Python作为一门强大的编程语言,提供了多种并行编程工具和库。本文将深入介绍Python中的并行编程,探讨如…

再也不怕合照缺人,Anydoor为图片编辑开了一道「任意门」

原文:再也不怕合照缺人,Anydoor为图片编辑开了一道「任意门」 「能不能把这张图里的产品,都放到另一张图的桌子上?」 面对这样的要求,设计师肯定会脑瓜嗡嗡的。 把指定物品放进另一张图片不像贴张贴纸一样简单&#x…