Deployment Controller详解(上)

上一篇在《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-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- 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.rhkb.cn/news/223322.html

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

相关文章

UE4移动端最小包优化实践

移动端对于包大小有着严苛的要求,然而UE哪怕是一个空工程打出来也有90+M,本文以一个复杂的工程为例,探索怎么把包大小降低到最小,我这里从200M+减少到了87M 一、工程简介 工程包含代码、插件、资源、iOS原生库工程。 二、按官方文档进行基础优化 官方文档 1、勾选U…

铭飞CMS cms/content/list接口存在SQL注入 附POC

@[toc] 铭飞CMS cms/content/list接口存在SQL注入 附POC 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用…

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…

研究论文 20231123-Genome Biology:零样本学习预测细基因表达顺式调控模式

Li, Yongge, et al. "CREaTor: zero-shot cis-regulatory pattern modeling with attention mechanisms." Genome Biology 24.1 (2023): 266. 2023年11月23日见刊 微信分享:Genome Biology | CREaTor: 零样本学习预测细胞类型特异的基因表达顺式调控模式…

STM32的以太网外设+PHY(LAN8720)使用详解(7):以太网数据接收及发送测试

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册 4.Wireshark1 以太网数据接收测试 1.1 以太网数据接收测试(轮询) 我们在主循环内轮询RX DMA描述符标志位查看是否接收到了数据,如果接收到了则将数据…

【Flutter】黑白图片

一、将图片处理成黑白图片 //第一种方法CachedNetworkImage(imageUrl: imageUrl,width: 80,height: 80,fit: BoxFit.cover,color: Colors.black,//目标颜色colorBlendMode: BlendMode.color,//颜色混合模式)//第二种方法ShaderMask(shaderCallback: (Rect bounds) {return Lin…

【Amazon 实验②】Amazon WAF功能增强之使用Cloudfront、Lambda@Edge阻挡攻击

文章目录 一、方案介绍二、架构图三、部署方案1. 进入Cloud9 编辑器,新打开一个teminal2. 克隆代码3. 解绑上一个实验中Cloudfront 分配绑定的防火墙4. 使用CDK部署方案5. CDK部署完成6. 关联LambdaEdge函数 四、方案效果 一、方案介绍 采用 LambdaEdge DynamoDB 架…

强化学习(五)-Deterministic Policy Gradient (DPG) 算法及公式推导

针对连续动作空间,策略函数没法预测出每个动作选择的概率。因此使用确定性策略梯度方法。 0 概览 1 actor输出确定动作2 模型目标: actor目标:使critic值最大 critic目标: 使TD error最大3 改进: 使用两个target 网络…

【IntelliJ IDEA】打开项目Git突然无法识别解决方案

这个问题也是我今天突然偶尔遇到的,当时没在意,项目打开之后又关闭,后来很久才又打开,发现项目明明有git版本控制的,咋突然开发工具右下角没有标识了,然后检查了一下git配置还报错了。 其实从图上我们可以看…

三相异步电机动态数学模型推导及矢量控制仿真

文章目录 **原文链接,点击跳转**三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接&#xff…

SpringBoot+SSM项目实战 苍穹外卖(7)(Spring Cache)

继续上一节的内容,本节实现缓存菜品、缓存套餐、添加购物车、查看购物车和清空购物车功能。 目录 缓存菜品缓存套餐(基于Spring Cache)EnableCaching、Cacheable、CachePut和CacheEvictSpring Cache实现缓存套餐 添加购物车查看购物车清空购物车 缓存菜品 用户端小…

【JMeter】JMeter添加插件

一、前言 ​ 在我们的工作中,我们可以利用一些插件来帮助我们更好的进行性能测试。今天我们来介绍下Jmeter怎么添加插件? 二、插件管理器 ​ 首先我们需要下载插件管理器jar包 下载地址:Install :: JMeter-Plugins.org 然后我们将下载下来…

yocto系列讲解[实战篇]93 - 添加Qtwebengine和Browser实例

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 概述集成meta-qt5移植过程中的问题问题1:virtual/libgl set to mesa, not mesa-gl问题2:dmabuf-server-buffer tries to use undecl…

[Angular] 笔记 6:ngStyle

ngStyle 指令: 用于更新 HTML 元素的样式。设置一个或多个样式属性&#xff0c;用以冒号分隔的键值对指定。键是样式名称&#xff0c;带有可选的 .<unit> 后缀&#xff08;如 ‘top.px’、‘font-style.em’&#xff09;&#xff0c;值为待求值的表达式&#xff0c;得到…

java SSM家庭财务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM家庭财务管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

达梦到达梦的外部链接dblink(DM-DM DBLINK)

一. 使用场景&#xff1a; 部链接对象&#xff08;LINK&#xff09;是 DM 中的一种特殊的数据库实体对象&#xff0c;它记录了远程数据库的连接和路径信息&#xff0c;用于建立与远程数据的联系。通过多台数据库主库间的相互通讯&#xff0c;用户可以透明地操作远程数据库的数…

关于游戏性能优化的技巧

关于游戏性能优化的技巧 游戏性能优化对象池Jobs、Burst、多线程间隔处理定时更新全局广播缓存组件缓存常用数据2D残影优化2D骨骼转GPU动画定时器优化DrawCall合批处理优化碰撞层优化粒子特效 游戏性能优化 好久没有在CSDN上面写文章了&#xff0c;今天突然看到鬼谷工作室技术…

一篇文章带你搞定CTFMice基本操作

CTF比赛是在最短时间内拿到最多的flag&#xff0c;mice必须要有人做&#xff0c;或者一支战队必须留出一块时间专门写一些mice&#xff0c;web&#xff0c;pwn最后的一两道基本都会有难度&#xff0c;这时候就看mice的解题速度了&#xff01; 说实话&#xff0c;这是很大一块&…

【C++】bind绑定包装器全解(代码演示,例题演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

【视觉实践】使用Mediapipe进行目标检测:杯子检测和椅子检测实践

目录 1 Mediapipe 2 Solutions 3 安装mediapipe 4 实践 1 Mediapipe Mediapipe是google的一个开源项目,可以提供开源的、跨平台的常用机器学习(machine learning,ML)方案。MediaPipe是一个用于构建机器学习管道</