K8S Deployment 使用 更新 回滚 扩容

news2025/1/16 20:01:21

K8S Deployments 使用 & 更新 & 回滚 & 扩容

K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一级的抽象,也具备更丰富的功能。Deployment对象不仅创建pod,还确保集群中始终运行正确数量的pod,处理可伸缩性,并持续处理pod的更新。所有这些活动都可以通过部署YAML中的字段进行配置。下面接下来就开始K8S Deployment的学习之旅吧。

Deployment 应用场景

以下是K8S Deployment典型的应用场景

  • 创建Deployment展示ReplicaSet - ReplicaSet在后台自动创建Pod,所以Deployment也会自动创建Pod,并检查Pod是否创建成功
  • 使用Deployment配置文件申明Pods状态 - Deployment管理Pods并将其迁移到新的ReplicaSet, 每个新的ReplicaSet都会更新Deployment版本信息
  • 更新Deployment - 如新版本Deployment状态不稳定,支持回滚到之前的版本,每次回滚都会更新Deployment版本信息
  • Deployment支持扩容,以支持更多的负载
  • 暂停/恢复更新Deployment - 当更新需要修改多处配置信息时,暂停更新,等待修改完毕,再恢复更新Deployment

Deployment Example

演示环境

  • OS 信息

    在这里插入图片描述

  • minikube 版本信息

    在这里插入图片描述

  • Kubectl 版本

    在这里插入图片描述

  • Dokcer 版本

    在这里插入图片描述

  • 启动minikube

    minikube start --driver=docker
    

配置文件

# 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

配置说明:

  • 根据**.metadata.name**字段配置值 ,创建名为 nginx-deployment的Deployment对象,该名称将作为ReplicaSet、Pod的前缀自动闯将这两种类型的对象
  • Deployment根据**.spec.replicas**自动创建ReplicaSet对象,并创建3个副本Pod
  • .spec.selector字段定义ReplicaSet如何匹配Pod,需要跟template.labels.app一致
  • template模板字段包含以下信息
    • 使用 .metadata.labels.app - 字段标记Pod
    • spec字段指示Pod运行的容器(名称为nginx) ,以及容器镜像
    • port容器端口

创建Deployment

kubectl apply -f nginx-deployment.yaml

在这里插入图片描述

运行状态

  • 查看Deployment运行状态

    # 创建成功后 使用以下命令查看deployment运行状态
    kubectl get deployments | grep nginx-deployment
    

    在这里插入图片描述

    如图片所示,自动创建了名为nginx-deployment 的 Deployments集群,副本数为3,上述中每个字段的含义如下

    • NAME - 列出默认命名空间集群中Deployment的名称
    • READY - 显示应用程序副本的数量
    • UP-TO-DATE - 显示已经达到期望状态的副本数量
    • AVAILABLE - 显示集群中应用程序可用的副本数量,正常情况下应该跟期望值一致,Pod在创建过程中可能会少于期望值
    • AGE - 显示应用程序运行时长
  • 使用rollout命令 查看Deployment创建状态

    kubectl rollout status deployment/nginx-deployment
    

    在这里插入图片描述

  • 查看Deployment自动创建的ReplicSet 信息

    kubectl get rs | grep nginx
    

    在这里插入图片描述

    注意:ReplicSet对象的名称前缀跟Deployment定义中的一致

  • 查看Deployment底层的Pod信息

    kubectl get pods --show-labels | grep nginx-deployment
    

    在这里插入图片描述

    请注意,Pod后面携带的Hash值 - 7fb96c846b跟Deployment对应ReplicaSet对象的Hash值一致,他们之间由此产生关联。

更新 Deployment

仅当Deployment配置文件中的Pod模板(.spec.template)更改时,才会触发Deployment更新操作。例如Pod模板中的镜像文件更改,触发Deployment更新。

更新镜像版本

  • 将之前nginx的镜像版本从 nginx:1.14.2 升级到 nginx:1.16.1

    kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1
    

    在这里插入图片描述

    此外还可以使用以下命令升级Deployment

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

    另外还可以使用以下命令,直接修改Deployment

    
    

    在这里插入图片描述

    找到镜像版本信息的位置,修改为更高级的版本进行更新Deployment,修改完毕之后,shell控制台输出如下

    deployment.apps/nginx-deployment edited
    

更新过程

kubectl describe deploy nginx-deployment

使用以上命令,查看Deployment对象的详细创建过程

在这里插入图片描述

仔细查看Events信息,可以分析出Deployment 创建过程

  1. 第一次直接创建了3个副本的ReplicaSet
  2. 更新Deployment时,启动一个新的ReplicaSet
  3. 将旧ReplicaSet的三个副本减掉一个 对应 to 2 from 3
  4. 更新操作启动第二个ReplicaSet副本,此时新版本ReplicaSet变成2 to 2 from 1
  5. 将旧ReplicaSet的存活的2个副本减掉一个 对应 to 1 from 2
  6. 更新操作启动第三个ReplicaSet副本,此时新版本ReplicaSet变成2 to 3 from 2
  7. 将旧ReplicaSet的存活的1个副本减掉一个 对应 to 0 from 1

由此可知,更新Deployment对象会启动新的ReplicaSet,等待启动完成后,会自动停用旧版本的ReplicaSet。在升级过程中采用先启动后停用的方式,能够始终保持ReplicaSet期望的副本数。

更新策略

默认情况下,K8S会保留10个旧ReplicaSet版本,以方便回滚。超过10个以上的ReplicaSet将会被系统回收。可以使用spec.revisionHistoryLimit设置保留ReplicaSet的个数,设置为0时,不保留历史记录。

.spec.strategy.type参数设置会影响Deployment的更新机制

  • Recreate - 先删除旧的Pod,再创建新的Pod
  • RollingUpdate - 滚动更新,默认值,可以通过指定 maxUnavailable 、maxSurge来控制更新过程
    • .spec.strategy.rollingUpdate.maxUnavailable 指定回滚更新时,最大不可用的Pod数量,默认25%,简单理解为一部分更新
    • .spec.strategy.rollingUpdate.maxSurge 可以超过期望值的最大Pod数,可选字段,默认为25%

.spec.minReadySeconds 可选参数,指定新建的Pod在没有任何容器崩溃情况下视为就绪- Ready状态的最小时间,单位为秒,默认为0,即一旦创建Pod,则被视为可用

回滚Deployment

当部署不稳定、新版本发布失败时,用户可能需要回滚Deployment,继续使用旧版本Deployment提供服务。默认情况下所有回滚信息都会保存在系统中,目的是方便随时回滚.

当且仅当Deployment关联的Pod对象 (.spec.template) 发生变化时,Deployment才会创建新的版本信息。其他操作,如扩容伸缩操作并不会更新版本信息。因此也就意味着,回滚操作只需要回滚Deployment对象关联的Pod即可。

更新失败

  • 假设您需要将nginx的版本从nginx:1.16.1回滚到nginx:1.161,可以使用如下命令进行回滚
kubectl set image deployment/nginx-deployment nginx=nginx:1.161 

在这里插入图片描述

  • 验证更新状态
kubectl rollout status deployment/nginx-deployment

在这里插入图片描述

如图片所示,此次更新失败。

  • 检查ReplicaSet更新状态
kubectl get rs

在这里插入图片描述

新版本的ReplicaSet对象创建失败。

  • 检查Pod状态
kubectl get pods

在这里插入图片描述

如图片所示,Pod启动失败的原因是镜像拉取失败(由于不存在对应版本镜像)。

系统回滚

  • 首先检查回滚版本信息
kubectl rollout history deployment/nginx-deployment

在这里插入图片描述

我们更新了三次,最后一个是失败的。

  • 查看回滚版本详细信息
kubectl rollout history deployment/nginx-deployment --revision=2

在这里插入图片描述

  • 回滚到上一个版本
 kubectl rollout undo deployment/nginx-deployment

在这里插入图片描述

  • 回滚到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=1
  • 检查Deployment信息
kubectl describe deployment nginx-deployment

在这里插入图片描述

如上图所示,Deployment中的镜像版本变成了最初的1.14.2,至此回滚成功。

扩容Deployment

手动扩容

当公司业务流程变大,需要更多的节点来处理新增的流量,此时需要将系统进行扩容。K8S Deployment扩容的方式非常简单,只需要使用以下命令即可进行扩容

kubectl scale deployment/nginx-deployment --replicas=10

在这里插入图片描述

扩容成功后,检查下Deployment的副本数量

kubectl get deploy

在这里插入图片描述

自动扩容

Deployment 还支持根据服务器运行情况进行扩容

# 当cpu超过80%的时候,进行扩容,副本数量最低10个,最高不超过15个
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80

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

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

相关文章

Esp8266+TFT太空人天气时钟

开源项目,只对动手能力有要求,有现成程序 b站演示视频: https://www.bilibili.com/video/BV1ND4y1W7oS/?spm_id_from333.999.0.0 效果图 模块和接线方法 使用ESP8266-12F模块,4M空间。OLED使用1.3寸IPS 240*240点阵彩屏,ST7789…

【Java集合】ArrayList源码分析

目录 一、ArrayList介绍 1.1 简介 1.2 继承体系 二、源码剖析 2.1 成员属性 2.2 构造方法 2.2.1 带int类型的构造方法:ArrayList(int initialCapacity) 2.2.2 无参构造方法:ArrayList() 2.2.3 Collection型构造方法:ArrayList(Collection c) …

flink规则引擎设计思路

在日常工作中我们经常收到一些诸如此类需求:“用户给点击了开屏广告,给用户下发私信”、“用户进入了推荐线,但在60秒内没有任何点击操作,弹框引导用户选择感兴趣的内容”、“用户点赞了某位作者的两篇以上的内容,但并…

C++入门----缺省参数和函数重载

C入门第一讲: 文章目录C入门第一讲:1.C关键字(C98)2.命名空间2.1命名空间的定义3.C的输入和输出4.缺省参数4.1缺省参数的概念4.2缺省参数的分类4.2.1全缺省参数4.2.2半缺省参数5.函数重载5.1函数重载的概念5.2C支持函数重载的原理…

在 SpringBoot 中 初步使用 MyBatis

这篇文章简单介绍如何初步使用MyBatis框架。MyBatis官网:mybatis – MyBatis 3 | 简介。本文中介绍MyBatis使用在SpringBoot中,Spring帮我们进行了管理,省去了获取sql的步骤。 什么是 MyBatis? MyBatis 是一款优秀的持久层框架&a…

XAML控件宽度为另一控件的一半、静态属性绑定、ObjectDataProvider

控件上当某些数据需要根据其他数据的变化而变化 很多时候,想让某个控件的宽度或者高度是另一个已有控件的一半,一开始打算使用ObjectDataProvider来实现,因为在控件上当某些数据需要根据其他数据的变化而变化时,可以使用ObjectDa…

Selenium实战【滑动验证码破解】【JAVA爬虫】

简介本文主要讲解,利用之前所学到的java selenium如何实战操作,浏览器控制鼠标,模拟人工操作滑动验证码。这里需要用javacv 的代码知识,用于计算图像中滑块需要移动的距离。实战目标网站:https://dun.163.com/trial/jigsaw操作流程…

【Java入门】Java注释和关键字

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java入门 💬个人格言:不断的翻越一座又一…

mycat个人详谈

项目背景 现在业务想实现不同的用户分别看到不同的数据库,领导说用mycat中间件试试。没有接触过这个东西,刚拿到手直接头皮发麻,现在搞定了,索性就记录一下 Mycat数据库分库分表中间件 简介 阿里大牛开发的开源免费产品&#x…

设计模式——抽象工厂模式

文章目录1. 抽象工厂模式的定义2. 抽象工厂模式的类图3. 抽象工厂模式的作用4. 抽象工厂模式的实现1. 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品&a…

OAuth 2.0简介

OAuth就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的、一定权限的令牌(token),用来代替密码,供第三方应用使用。 流程 1.第三方客户端要求用…

【欧姆龙控制器NX1系列调研】

欧姆龙控制器NX1系列调研NX系列 NX1 CPU单元NX系列-EtherNet/IP耦合器单元NX系列-系统单元NX系列通信接口单元NX系列数字输入单元NX系列模拟量输入单元NX系列模拟量输出入单元NX系列 高速模拟量模块NX系列IO-Link 主站单元温度控制/温度输入单元位置接口单元NX系列 安全控制单元…

【algorithm】算法基础课---排序算法(附笔记 | 建议收藏)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:AcWing算法学习笔记 💬总结:希望你看完…

CSS入门四、浮动

零、文章目录 文章地址 个人博客-CSDN地址:https://blog.csdn.net/liyou123456789个人博客-GiteePages:https://bluecusliyou.gitee.io/techlearn 代码仓库地址 Gitee:https://gitee.com/bluecusliyou/TechLearnGithub:https:…

mybatis参数配置和日志详解

生命周期和作用域是至关重要的,因为错误的使用会导致非常严重的并发问题 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的,SqlSessionFactory的实例可以通过 SqlSessionFactoryBuilder 获得,而 SqlSessionFactoryBuild…

【stl容器--实践操作】

目录:前言一、string(一)初始化 、 赋值 、 拼接(二)单个字符的访问和修改[]、at()(三)插入和删除insert 、erase(四)查找和替换find、rfind、replace(五&…

代码随想录-47-101. 对称二叉树

目录前言题目1.递归思路2. 本题思路分析:3. 算法实现4. pop函数的算法复杂度5. 算法坑点前言 在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。 代码随想录此题链接 题目…

FileNotFoundError: [Errno 2] No such file or directory VSCode Python插件的工作路径

文章目录1 前言2 Python主进程工作路径3 解决参考1 前言 在VSCode中&#xff0c;你是否遇到这样的情况 Traceback (most recent call last):File "......*.py", line 1, in <module>with open(filepath, r) as f: FileNotFoundError: [Errno 2] No such file…

提面优秀成功上岸浙大MBA的一点经验——专业管理思维很重要

本人的学历背景比较一般&#xff0c;就是个普通一本&#xff0c;但大学时为了挣学分&#xff0c;参加了不少的活动&#xff0c;还考了教师资格证&#xff0c;并且还去山区支教过3个月&#xff0c;支教一开始也是为了学分&#xff0c;但是通过与孩子们的相处&#xff0c;其实自己…

http相关(更新中)

概念 HTTP&#xff08;hypertext transport protocol&#xff09;协议也叫超文本传输协议&#xff0c;这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。HTTPS更安全&#xff1b;无状态&#xff0c;cookie解决了无状态的问题 请求过程 客户端发送给服务器的称为“…