Kubernetes 深入浅出系列 | 容器编排与作业调度之Deployment

news2024/12/23 13:46:52

目录

    • 概述
    • Deployment 的更新原理
    • 实验

概述

Kubernetes 中,Deployment 控制器是用于管理应用程序生命周期的核心对象。Deployment 通过管理 ReplicaSet 来间接控制 Pod,确保在任何时刻都能维持指定数量的 Pod 副本。这种间接管理使得 Deployment 功能比 ReplicaSet 更加强大,可以支持如滚动更新、回滚等。

Deployment 的主要功能包括:

  1. 自动部署和滚动更新:支持对应用的无缝更新,保证在更新过程中系统的高可用性。
  2. 回滚:允许用户回退到之前的版本,确保在部署过程中出现问题时可以迅速恢复。
  3. 自愈能力:自动检测和修复 Pod 的故障,确保指定数量的 Pod 始终运行。
  4. 版本控制:Deployment 能够跟踪应用的历史版本,便于管理和查看不同版本的差异。

Deployment 的资源清单:

apiVersion: apps/v1  # 版本号 
kind: Deployment  # 类型 
metadata:  # 元数据 
  name: nginx-deployment  # Deployment名称 
  namespace: default  # 所属命名空间 
  labels:  # 标签 
    controller: deploy 
spec:  # 详情描述 
  replicas: 3  # 副本数量 
  revisionHistoryLimit: 3  # 保留历史版本,默认为10 
  paused: false  # 暂停部署,默认是false 
  progressDeadlineSeconds: 600  # 部署超时时间(秒),默认是600 
  strategy:  # 策略 
    type: RollingUpdate  # 滚动更新策略 
    rollingUpdate:  # 滚动更新设置 
      maxSurge: 30%  # 最大额外可以存在的副本数,可以为百分比,也可以为整数 
      maxUnavailable: 30%  # 最大不可用状态的 Pod 的最大值,可以为百分比,也可以为整数 
  selector:  # 选择器,通过它指定该控制器管理哪些 Pod 
    matchLabels:  # Labels匹配规则 
      app: nginx-pod 
    matchExpressions:  # Expressions匹配规则 
      - {key: app, operator: In, values: [nginx-pod]} 
  template:  # 模板,当副本数量不足时,会根据下面的模板创建 Pod 副本 
    metadata: 
      labels: 
        app: nginx-pod 
    spec: 
      containers: 
      - name: nginx 
        image: nginx:1.15 # 镜像版本可以根据需要调整,确保是有效的版本
        ports: 
        - containerPort: 80  # 对外暴露的端口号

Deployment 的更新原理

  • 触发更新的条件:仅当 Deployment 的 Pod 模板(spec.template)发生变化时(例如容器镜像更新、标签变更等),才会触发更新操作。其他变动,如扩缩容操作,并不会导致更新触发(创建新的 ReplicaSet)。

  • 更新过程

    1. 创建新的 ReplicaSet:当 Deployment 的模板发生变化时,Kubernetes 会创建一个新的 ReplicaSet。
    2. 准备就绪后替换旧 ReplicaSet:新的 ReplicaSet 准备就绪后,Kubernetes 会逐步替换旧的 ReplicaSet,但不会立即删除它。旧的 ReplicaSet 会根据 revisionHistoryLimit 的设置保留指定数量的版本,以便进行回滚操作。

此机制确保了应用更新时的平滑过渡,不会影响系统的稳定性。

实验

kubectl create deployment nginx --image=nginx --dry-run=client -o yaml>nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.15
        name: nginx

kubectl expose deployment nginx --target-port=80 --port=80 --type=NodePort
浏览器访问地址加端口
在这里插入图片描述
nginx版本1.15.12
滚动升级:
Kubectl edit deployment nginx
kubectl set image deployment/web web=nginx:1.18 --record 可以保留记录,回滚时方便识别
更新后,有两个rs

[root@k8s-master ~]# kubectl get rs 
NAME               DESIRED   CURRENT   READY   AGE
nginx-54f8f9f495   3         3         3       22m
nginx-6f68f97d6b   0         0         0       3h19m
[root@k8s-master ~]# kubectl describe rs nginx-54f8f9f495 |grep -A 5 Event
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  25m   replicaset-controller  Created pod: nginx-54f8f9f495-jnbv2
  Normal  SuccessfulCreate  25m   replicaset-controller  Created pod: nginx-54f8f9f495-g9ttt
  Normal  SuccessfulCreate  25m   replicaset-controller  Created pod: nginx-54f8f9f495-cc4vf
[root@k8s-master ~]# kubectl describe rs nginx-6f68f97d6b |grep -A 5 Event
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulDelete  26m   replicaset-controller  Deleted pod: nginx-6f68f97d6b-t2h4x
  Normal  SuccessfulDelete  26m   replicaset-controller  Deleted pod: nginx-6f68f97d6b-6rnc4
  Normal  SuccessfulDelete  26m   replicaset-controller  Deleted pod: nginx-6f68f97d6b-52qsq

可以看到旧的rs删除了三个pod,新的rs创建了三个pod。
Describe nginx看看是为什么?

[root@k8s-master ~]# kubectl describe deploy  nginx  |grep -A 10 Event
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  29m   deployment-controller  Scaled up replica set nginx-54f8f9f495 to 1
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled down replica set nginx-6f68f97d6b to 2 from 3
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled up replica set nginx-54f8f9f495 to 2 from 1
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled down replica set nginx-6f68f97d6b to 1 from 2
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled up replica set nginx-54f8f9f495 to 3 from 2
  Normal  ScalingReplicaSet  28m   deployment-controller  Scaled down replica set nginx-6f68f97d6b to 0 from 1

结果发现两个rs交替删除创建,使得deployment滚动更新
回滚:
rs保留了镜像版本
查看历史版本

[root@k8s-master ~]# kubectl rollout history deployment nginx
deployment.apps/nginx 
REVISION  CHANGE-CAUSE
1         <none>#1.15
2         <none>#当前版本1.16

回滚到上个版本:
kubectl rollout undo deployment nginx
回滚后可以看到1.15版本的rs创建了3个pod

[root@k8s-master ~]# kubectl get rs
NAME               DESIRED   CURRENT   READY   AGE
nginx-54f8f9f495   0         0         0       57m
nginx-6f68f97d6b   3         3         3       3h55m
[root@k8s-master ~]# kubectl describe rs nginx-6f68f97d6b |grep  -A 10 Event
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulDelete  60m    replicaset-controller  Deleted pod: nginx-6f68f97d6b-t2h4x
  Normal  SuccessfulDelete  60m    replicaset-controller  Deleted pod: nginx-6f68f97d6b-6rnc4
  Normal  SuccessfulDelete  59m    replicaset-controller  Deleted pod: nginx-6f68f97d6b-52qsq
  Normal  SuccessfulCreate  4m29s  replicaset-controller  Created pod: nginx-6f68f97d6b-k95xz
  Normal  SuccessfulCreate  4m28s  replicaset-controller  Created pod: nginx-6f68f97d6b-mdgtw
  Normal  SuccessfulCreate  4m27s  replicaset-controller  Created pod: nginx-6f68f97d6b-dzfpn

回滚其实用的很少,一般都是直接改镜像,重新apply,一些厂商也是直接调接口“apply”镜像就好

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

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

相关文章

网络练级宝典-> UDP传输层协议

目录 传输层 端口号 端口号和进程的关系 UDP协议 UDP协议格式 UDP数据封装&#xff1a; UDP数据分用&#xff1a; 面向数据报 UDP的缓冲区 UDP的缺点 基于UDP的应用层协议 传输层 端口号 我们知道端口号对应的其实就是一个进程的pid&#xff0c;在操作系统中二者的…

Ubuntu22.04系统源码编译OpenCV 4.10.0(包含opencv_contrib)

因项目需要使用不同版本的OpenCV&#xff0c;而本地的Ubuntu22.04系统装了ROS2自带OpenCV 4.5.4的版本&#xff0c;于是编译一个OpenCV 4.10.0&#xff08;带opencv_contrib&#xff09;版本&#xff0c;给特定的项目使用&#xff0c;这就不用换个设备后重新安装OpenCV 了&…

获取联通光猫的管理员密码

缘起&#xff1a;联通给免费更换了一个新的光猫&#xff0c;烽火的光路由&#xff0c;一个WAN口&#xff0c;4个LAN口&#xff0c;带USB接口&#xff0c;欣欣然接受。但是呢&#xff0c;发现以前的管理员密码CUAdmin不能用了。经过一系列查询&#xff0c;借助别人的经验&#x…

残差网络连接,使得输入与输出的尺寸一样

def forward(self, x):out self.layer1(x)out self.layer2(out)# 使用插值将输入x上采样至与layer2输出相同的尺寸x F.interpolate(x, size(out.size(2), out.size(3)), modebilinear, align_cornersFalse)# 确保x的通道数与out匹配x x[:, :out.size(1), :, :] # 选择前ou…

计算机网络原理之HTTP与HTTPS

一、前言 为了理解HTTP&#xff0c;我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络&#xff08;包括互联网&#xff09;是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信&#xff0c;双方必须基于相同的方法。比如&#…

实验三:Mybatis-动态 SQL

目录&#xff1a; 一 、实验目的&#xff1a; 通过 mybatis 提供的各种标签方法实现动态拼接 sql 二 、预习要求&#xff1a; 预习 if、choose、 when、where 等标签的用法 三、实验内容&#xff1a; 根据性别和名字查询用户使用 if 标签改造 UserMapper.xml使用 where 标签进行…

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息&#xff1a; 简介&#xff1a; 本文的背景是基于人类语言理解的组合性特征&#xff0c;即语言处理本质上是层次化的&#xff1a;语法规则将词级别的意义组合成更大的成分的意义&…

C++STL容器vector容器大小相关函数

目录 前言 主要参考 vector::size vector::max_size vector::resize vector::capacity vector::empty vector::reserve vector::shrink_to_fit 共勉 前言 本文将讨论STL容器vector中与迭代器相关的函数&#xff0c;模板参数T为int类型。 主要参考 cpluscplus.com 侯…

后端-编辑按钮的实现

编辑一共要实现两步&#xff1a; 1.点击编辑蹦出来一个弹窗&#xff0c;此时需要回显&#xff0c;根据id查出来这条数据 2.修改某些值之后点击保存的时候调用修改的接口 根据id查询的时候正常操作 修改值的时候要注意一些问题 mapper层的Employee和impl层的接收实体不一样

Spring Boot漫画之家:漫画爱好者的数字图书馆

2 系统开发环境 2.1 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#xff0c;便于结构的分离&…

RISC-V 汇编语言

安装RISCV工具链 riscv-gnu-toolchain工具链和模拟器安装记录 - 知乎 (zhihu.com) riscv-gnu-toolchain工具链分elf-gcc、linux-gnu-gcc两个版本&#xff0c;以及对应的32位和64位版本。两个版本的主要区别是&#xff1a; riscv32-unknown-elf-gcc、riscv64-unknown-elf-gcc…

长沙市的科技查新机构有哪些

中南大学图书馆科技查新站&#xff1a; 中南大学图书馆科技查新站成立于2003年12月&#xff0c;中南大学图书馆科技查新站作为教育部首批批准的科技查新工作站之一&#xff0c;具备了在全国范围内开展科技查新工作的专业资质。 长沙理工大学科技查新工作站&#xff1a; 长沙理…

Spring Data Elasticsearch

简介说明 spring-data-elasticsearch是比较好用的一个elasticsearch客户端&#xff0c;本文介绍如何使用它来操作ES。本文使用spring-boot-starter-data-elasticsearch&#xff0c;它内部会引入spring-data-elasticsearch。 Spring Data ElasticSearch有下边这几种方法操作El…

【Web】AlpacaHack Round 7 (Web) 题解

Treasure Hunt flag在md5值拼接flagtxt的文件里&#xff0c;如 d/4/1/d/8/c/d/9/8/f/0/0/b/2/0/4/e/9/8/0/0/9/9/8/e/c/f/8/4/2/7/e/f/l/a/g/t/x/t 访问已经存在的目录状态码是301 访问不存在的目录状态码是404 基于此差异可以写爆破脚本 这段waf可以用url编码绕过 做个lab …

【数字电路与逻辑设计】实验五 4人表决器

文章总览&#xff1a;YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验五 4人表决器 一、实验内容二、设计过程&#xff08;一&#xff09;设置变量&#xff08;二&#xff09;真值表&#xff08;三&#xff09;表达式 三、源代码&#xff08;一&#xff09;代码说明&…

解决Tomcat运行时错误:“Address localhost:1099 is already in use”

目录 背景: 过程&#xff1a; 报错的原因&#xff1a; 解决的方法&#xff1a; 总结&#xff1a; 直接结束Java.exe进程&#xff1a; 使用neststat -aon | findstr 1099 命令&#xff1a; 选择建议&#xff1a; 背景: 准备运行Tomcat服务器调试项目时&#xff0c;程序下…

【C++】刷题强训(day13)--牛牛冲钻五、最长无重复字数组、重排字符串

目录 1、牛牛冲钻五 1. 题目 1.2 思路 1.3 代码实现 2、最长无重复子数组 2.1 题目 2.2 思路 2.3 程序实现 3、重排字符串 3.1 题目 3.2 思路 3.3 代码实现 刷题汇总&#xff1a;传送门&#xff01; 1、牛牛冲钻五 1. 题目 1.2 思路 由题可知&#xff0c;赢一局则…

Kafka单机及集群部署及基础命令

目录 一、 Kafka介绍1、kafka定义2、传统消息队列应用场景3、kafka特点和优势4、kafka角色介绍5、分区和副本的优势6、kafka 写入消息的流程 二、Kafka单机部署1、基础环境2、iptables -L -n配置3、下载并解压kafka部署包至/usr/local/目录4、修改server.properties5、修改/etc…

在做题中学习(78):数组中第K个最大元素

解法&#xff1a;快速选择算法 说明&#xff1a;堆排序也是经典解决topK问题的算法&#xff0c;但时间复杂度为&#xff1a;O(NlogN) 而将要介绍的快速选择算法的时间复杂度为: O(N) 先看我的前两篇文章&#xff0c;分别学习&#xff1a;数组分三块&#xff0c;随机选择基准…

学习记录,正则表达式, 隐式转换

正则表达式 \\&#xff1a;表示正则表达式 W: 表示一个非字&#xff08;不是一个字&#xff0c;例如&#xff1a;空格&#xff0c;逗号&#xff0c;句号&#xff09; W: 多个非字 基本组成部分 1.字符字面量&#xff1a; 普通字符&#xff1a;在正则表达式中&#xff0c;大…