K8s Deployment 滚动更新、金丝雀发布、自定义钩子、生命周期解析

🐇明明跟你说过:个人主页

🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅

🔖行路有良友,便是天堂🔖

目录

一、Deployment的高级特性

1、滚动更新

2、金丝雀发布

3、自定义钩子 

4、生命周期管理

二、Deployment常见问题与解决方案

1、Deployment更新失败处理

2、Pod调度失败与资源限制

三、总结


一、Deployment的高级特性

1、滚动更新

Kubernetes(K8s)的滚动更新是一种更新策略,用于无缝地更新应用程序的部署,而不会中断现有用户的服务。滚动更新通过逐步替换现有的Pod实例来实现,确保新版本的Pod在部署过程中逐步上线,同时监控应用程序的健康状态,并在需要时回滚到旧版本。

滚动更新的工作原理主要基于Deployment资源内的spec.strategy.type设定。当设置为RollingUpdate时,Kubernetes会根据spec.strategy.rollingUpdate.maxUnavailablespec.strategy.rollingUpdate.maxSurge的定义来执行更新。

  • maxUnavailable设定了在更新过程中能有多少Pod处于不可用状态。这个值可以是一个绝对值(例如,最多可以有1个Pod不可用),也可以是一个百分比(例如,最多可以有25%的Pod不可用)。
  • maxSurge则决定了在更新过程中,可以额外创建的Pod数量上限。这个值同样可以是一个绝对值或百分比。它允许在更新过程中,超出预期的Replica数量,以便更快地替换旧的Pod实例。

 

滚动更新步骤如下:

  1. 创建一个Deployment来管理Pod的创建和更新。在这个Deployment中,可以指定要使用的镜像和其他配置参数。
  2. 使用kubectl命令执行滚动更新。例如,可以通过kubectl set image deployment/my-app my-app=my-app:2.0.0命令将my-app的镜像更新为my-app:2.0.0,并触发滚动更新过程。
  3. Kubernetes会开始逐步替换旧的Pod实例。它会先按照maxSurge创建新的Pod实例,然后按照maxUnavailable逐渐杀死旧的Pod实例。在这个过程中,服务的可用性得到保证,因为始终有足够的Pod实例在运行以处理请求。
  4. 可以使用kubectl命令来监控滚动更新的进度,确保更新过程顺利进行。
  5. 如果滚动更新出现问题,可以回滚到之前的版本,以确保服务的稳定性。

 

2、金丝雀发布

金丝雀发布的由来:17 世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感。空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;当瓦斯含量超过一定限度时,虽然人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为瓦斯检测指标,以便在危险状况下紧急撤离。

金丝雀发布(又称灰度发布、灰度更新):金丝雀发布一般先发1台,或者一个小比例,例如2%的服务器,主要做流量验证用,也称为金丝雀 (Canary) 测试 (国内常称灰度测试)。

 

金丝雀发布(Canary Release)是一种部署策略,用于逐步将新版本的应用程序引入生产环境,以降低部署风险并确保应用程序的稳定性。金丝雀发布通过逐步将新版本的应用程序引入生产流量,然后监控其性能和稳定性,以便在出现问题时快速回滚。以下是金丝雀发布的一般步骤:

  1. 准备新版本:首先,您需要准备新版本的应用程序,并在Kubernetes中创建一个新的Deployment资源来部署该版本。新版本的应用程序可能包含新功能、性能优化或bug修复等改进。
  2. 创建金丝雀Deployment:在Kubernetes中创建一个新的Deployment资源,用于金丝雀发布。这个Deployment资源通常包含新版本的应用程序,并且可以根据需要配置特定的副本数量和Pod策略。
  3. 设置流量分配规则:在金丝雀Deployment资源中,您可以配置流量分配规则,将一部分生产流量引导到新版本的应用程序。您可以使用Kubernetes的服务资源或Ingress资源来配置流量路由规则,将一部分流量发送到金丝雀Deployment,而将其他流量发送到旧版本的Deployment。
  4. 逐步增加流量:一旦设置了流量分配规则,Kubernetes会逐步将生产流量引导到金丝雀Deployment中的新版本。您可以根据需要逐步增加流量的比例,例如从5%开始,然后逐步增加到10%、20%等。
  5. 监控性能和稳定性:在引入生产流量的过程中,您需要监控新版本的应用程序的性能和稳定性。您可以使用监控工具、日志记录和警报系统等来监控应用程序的指标,并在出现问题时及时采取措施。
  6. 快速回滚:如果发现新版本的应用程序存在严重问题,您可以通过调整流量分配规则,将流量立即回滚到旧版本的Deployment。Kubernetes的滚动更新和回滚功能可以确保金丝雀发布过程的安全性和可靠性。

 

3、自定义钩子 

在Kubernetes中,Deployment资源提供了一种称为“钩子”的机制,允许在部署过程的不同阶段执行自定义操作。这些钩子可用于执行各种任务,例如在容器启动之前或之后运行脚本、初始化数据库、执行数据迁移等。Deployment资源支持以下几种钩子:

  • PostStart钩子:在容器启动后立即执行。这通常用于执行容器启动后的初始化任务,例如等待其他服务启动、注册服务到服务发现系统等。
  • PreStop钩子:在容器关闭之前执行。这通常用于执行容器关闭前的清理任务,例如保存数据、关闭连接、发送信号给其他进程等。

 

示例: 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example
  template:
    metadata:
      labels:
        app: example
    spec:
      containers:
      - name: example-container
        image: nginx:latest
        ports:
        - containerPort: 80
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container started'"]
          preStop:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container stopping'"]

在上面的示例中,我们为名为example-container的容器配置了PostStart和PreStop钩子。PostStart钩子在容器启动后执行命令 echo 'Container started',而PreStop钩子在容器关闭之前执行命令echo 'Container stopping'。

4、生命周期管理

在Kubernetes中,Deployment资源的生命周期管理涉及创建、更新和销毁部署的过程。

  1. 创建Deployment:首先,需要定义一个Deployment资源,并指定所需的副本数、Pod模板、更新策略等信息。创建Deployment后,Kubernetes将自动启动Pod副本并监视它们的状态。
  2. 更新Deployment:如果需要更新应用程序的版本或配置,可以通过更新Deployment资源来实现。可以修改Deployment资源的Pod模板或标签选择器,然后应用这些更改。Kubernetes将根据更新策略逐步将新的Pod副本部署到集群中,并确保新旧版本的Pod副本同时存在一段时间,以确保平滑的过渡。
  3. 监控Deployment:在Deployment部署过程中,可以通过Kubernetes Dashboard、kubectl命令行工具或自定义监控系统来监控Deployment的状态。可以查看Deployment的副本数、可用性、健康状态等指标,以确保部署的顺利进行。
  4. 回滚Deployment:如果更新部署后发现问题,可以通过回滚Deployment来恢复到之前的稳定状态。Kubernetes支持回滚操作,可以指定要回滚到的特定版本或回滚到上一个成功的版本。
  5. 销毁Deployment:当不再需要某个Deployment资源时,可以将其从集群中删除。删除Deployment资源将同时删除与之关联的所有Pod副本和其他相关资源。

 

二、Deployment常见问题与解决方案

1、Deployment更新失败处理

1. 检查更新配置:

  • 首先,确认更新的Deployment配置文件是否正确。检查是否有语法错误、字段缺失或配置不当的地方。
  • 特别注意镜像名称、标签、端口、环境变量等关键配置是否准确无误。

2. 查看事件和日志:

  • 使用kubectl describe deployment <deployment-name>命令查看Deployment的详细信息,包括事件和状态。
  • 检查Pod的状态和事件,使用kubectl get pods和kubectl describe pod <pod-name>命令获取更多信息。
  • 查看Pod的日志,使用kubectl logs <pod-name>命令,这有助于发现应用层面的错误或异常。

3. 检查资源配额和限制:

  • Kubernetes允许管理员为每个namespace设置资源配额,包括CPU、内存等资源。如果Pod使用的资源超出了配额限制,更新可能会失败。
  • 使用kubectl describe quota命令查看配额的使用情况,确保更新后的Pod不会超出限制。

4. 检查网络问题:

  • 网络问题可能导致Pod无法拉取镜像或与其他服务通信。
  • 检查集群的网络配置,确保Pod可以访问所需的镜像仓库和服务。

5. 检查存储和持久卷:

  • 如果Deployment使用了持久卷(PersistentVolumes),确保相关的存储配置正确,并且持久卷可用。
  • 检查持久卷的状态和事件,使用kubectl get pv和kubectl describe pv <pv-name>命令。

6. 检查就绪探测和存活探测:

  • 如果Deployment配置了就绪探测(Readiness Probe)或存活探测(Liveness Probe),确保探测逻辑正确。
  • 不当的探测配置可能导致Pod无法正确启动或过早被杀死。

7. 回滚更新:

  • 如果更新失败且无法立即解决,可以考虑回滚到之前的版本。
  • 使用kubectl rollout undo deployment <deployment-name>命令可以回滚到上一个版本。

 

2、Pod调度失败与资源限制

当Pod调度失败时,可以考虑以下几个方面进行排查和解决:

  • 检查节点资源:首先,检查集群中的节点资源情况,包括CPU、内存等资源的使用情况。使用kubectl describe node命令可以查看节点的资源使用情况和容量。
  • 查看Pod资源请求和限制:检查Pod的资源请求和限制是否与节点的资源容量相匹配。可以通过kubectl describe pod命令查看Pod的资源请求和限制配置。
  • 调整资源配置:如果Pod的资源请求过高或者资源限制过低,可能会导致调度失败。可以根据实际情况调整Pod的资源配置,确保资源请求和限制合理。
  • 添加节点:如果集群中的节点资源已经饱和,考虑添加新的节点来扩容集群。使用更强大的节点或者增加节点数量可以提高集群的容量和性能。
  • 排查其他问题:除了资源限制外,还可能有其他原因导致Pod调度失败,例如节点标签不匹配、网络配置问题等。可以查看Pod的事件记录和日志,进一步排查问题并解决。

 

三、总结

在本文中,我们深入探讨了Kubernetes Deployment的滚动更新、金丝雀发布、自定义钩子以及生命周期管理的关键概念和实践。这些机制共同构成了Kubernetes强大且灵活的部署策略,使得开发者能够高效、安全地管理容器化应用。

滚动更新机制允许我们在不中断服务的情况下,逐步替换旧的Pod实例为新的Pod实例。这种渐进式的更新方式减少了更新过程中可能出现的风险,并确保了服务的连续性和可用性。通过配置适当的更新策略,我们可以控制更新过程中的最大不可用Pod数量和最大额外Pod数量,从而平衡更新速度和稳定性。

金丝雀发布则是一种更为谨慎的发布策略,它通过将新版本的应用先部署到一小部分用户或节点上,以验证新版本的稳定性和性能。这种策略允许我们在生产环境中逐步引入新功能或修复,同时保持大部分用户的体验不受影响。通过逐步扩大新版本的应用范围,我们可以逐渐暴露和解决问题,确保最终全面上线的成功。

自定义钩子为我们在Deployment的生命周期中提供了额外的控制手段。通过定义前置和后置钩子,我们可以在Pod创建、更新或删除之前或之后执行自定义的操作,如数据备份、配置加载等。这使得我们能够更灵活地应对各种复杂的部署需求,并确保应用在不同阶段都能正确执行所需的操作。

最后,生命周期管理涵盖了Deployment从创建到删除的整个过程。通过合理地配置和管理Deployment对象,我们可以确保应用在整个生命周期中都能保持稳定的运行状态,并能够在需要时快速地进行扩缩容、回滚等操作。这不仅提高了应用的可用性和可靠性,也降低了维护成本和风险。

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Kubernetes的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!   

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

harmonyOS的客户端存贮

什么是客户端存贮 在harmonyOS中,客户端存贮是指将数据存贮在本地设备以供应用程序使用; 注: 和feaureAblity搭配使用,content上下文的获取依赖该API如下: // 引入: import featureAbility from ohos.ability.featureAbility;// 使用: let content featureAbility.getConten…

STM32串口认识

常用函数介绍 串口发送/接收函数 HAL_UART_Transmit(); 串口发送数据&#xff0c;使用超时管理机制&#xff08;即在发送成功前一直阻塞&#xff0c;相当于有个delay&#xff08;&#xff09;在卡住主函数&#xff09; HAL_UART_Receive(); 串口接收数据&#xff0c;使用超时…

极简云验证 download.php 文件读取漏洞复现

0x01 产品简介 极简云验证是一款开源的网络验证系统&#xff0c;支持多应用卡密生成&#xff1a;卡密生成 单码卡密 次数卡密 会员卡密 积分卡密、卡密管理 卡密长度 卡密封禁 批量生成 批量导出 自定义卡密前缀等&#xff1b;支持多应用多用户管理&#xff1a;应用备注 应用版…

Android JNI基础

目录 一、JNI简介1.1 什么是JNI1.2 用途1.3 优点 二、初探JNI2.1 新建cpp\cmake2.2 build.gradle配置2.3 java层配置2.4 cmake和c 三、API详解3.1 JNI API3.1.1 数据类型3.1.2 方法 3.2 CMake脚本 四、再探JNI 一、JNI简介 1.1 什么是JNI JNI&#xff08;Java Native Interfa…

开源软件技术社区方案

开源软件技术社区是一个由开发者、贡献者、用户和维护者组成的共享平台&#xff0c;主要目的是打造技术、软件产品良性互动、开源技术安全可控的软件生态环境&#xff0c;实现可复用应用或服务的快速部署与使用、完成资源与能力的高度共享、促进社区成员的共建共赢&#xff0c;…

面试复盘1 - 测试相关(实习)

写在前&#xff1a;hello&#xff0c;大家早中晚上好~这里是西西&#xff0c;最近有在准备测试相关的面试&#xff0c;特此开设了新的篇章&#xff0c;针对于面试中的问题来做一下复盘&#xff0c;会把我自己遇到的问题进行整理&#xff0c;除此之外还会进行对一些常见面试题的…

什么是异地组网?

在当今互联网普及的背景下&#xff0c;异地组网已成为许多企业和个人日常工作中不可或缺的一部分。异地组网的核心目的是实现不同地区间的快速、高效的局域网连接。在这个过程中&#xff0c;延迟&#xff08;即网络数据传输的时间延迟&#xff09;是一个关键影响因素。我们来看…

还得是抖音,字节推出竖屏视频理解数据集,入选CVPR2024

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 短视频在当下社交媒体逐渐成为主导的视频格式。传统视频处理技术和研究一般都专注于横屏视频…

【快速解决】python缺少了PyQt5模块的QtMultimedia子模块

目录 问题描述 问题原因 解决方法 成功示范 问题描述 Traceback (most recent call last): File "d:\桌面\python项目\DesktopWords-master\main.py", line 4, in <module> from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent ModuleNotFoundEr…

Unity自定义icon

Unity自定义icon 1. 新建文件夹 OfficeFabricIconSet2. 新建Iconset3. 新建子文件夹Textures并添加icon图片4. 向iconset添加Quad Icons5. 最终效果 教程来源处&#xff1a; https://365xr.blog/build-your-own-button-icon-set-for-microsoft-hololens-2-apps-with-mrtk-using…

stm32之基本定时器的使用

在上文我们使用到了HAL库的自带的延时函数&#xff0c;HAL_Delay&#xff08;&#xff09;&#xff1b;我们来看一下函数的原型 __weak void HAL_Delay(uint32_t Delay) {uint32_t tickstart HAL_GetTick();uint32_t wait Delay;/* Add a freq to guarantee minimum wait */…

程序员为什么不能一次性写好,需要一直改Bug?

程序员为什么不能一次性写好&#xff0c;需要一直改Bug&#xff1f; 我有一问&#xff1a; 你为什么不上清华呢&#xff0c;高考答满分不就行了&#xff1f; 程序员在软件开发过程中可能会遇到需要不断修改Bug的情况&#xff0c;这主要是由以下几个原因造成的&#xff1a; 复杂…

5.3.1 配置交换机 SSH 管理和端口安全

5.3.1 实验1:配置交换机基本安全和 SSH管理 1、实验目的 通过本实验可以掌握&#xff1a; 交换机基本安全配置。SSH 的工作原理和 SSH服务端和客户端的配置。 2、实验拓扑 交换机基本安全和 SSH管理实验拓扑如图所示。 交换机基本安全和 SSH管理实验拓扑 3、实验步骤 &a…

FreeBSD下如何进行添加路由等配置?

FreeBSD系统可以当作一台路由器来使用&#xff0c;实际上当年路由器刚刚出来的时候&#xff0c;有很大一部分就是用主机安装FreeBSD来提供路由功能的。 路由的基础知识 路由&#xff0c;就是计算机网络中决定数据包从源地址到目的地址路径的一种传输过程。路由表&#xff0c;就…

基于Springboot学生考勤管理系统

采用技术 基于Springboot学生考勤管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 功能清单 系统登录注册 系统登录 学生注册 管理员功能模…

【C+ +】第一个C+ + 项目的创建及namespace命名空间解释C++中的输入输出

目录 1.创建第一个c项目 1.1项目创建 1.2 .cpp源文件建立 1.3 第一个c程序hello world对比c语言hello world 2.命名空间 2.1 C关键字 2.2 命名空间---解决c语言中的命名冲突 2.2.1 namespace命名空间用法 2.2.2 &#xff1a;&#xff1a; 预作用限定符 2.2.3 命名空间的嵌套…

VSCode常用修改默认设置(settings.json)

❓ 问题1 我现在在vscode中鼠标选中某个单词&#xff0c;相同的单词都会自动出现一个高亮背景色&#xff0c;我需要怎么关闭这个功能呢&#xff1f; ⚠️ 注意 selectionHighlight 这个是鼠标双击后的高亮匹配&#xff0c;可以保留默认开启的配置&#xff0c;不用去改它。 …

【Redis基础篇】详细讲解Redis

这篇文章让你详细了解Redis的相关知识&#xff0c;有代码讲解以及图片剖析&#xff0c;让你更轻松掌握 制作不易&#xff0c;感觉不错&#xff0c;请点赞收藏哟 &#xff01;&#xff01;&#xff01; 目录 1 redis基础 1.1 定义 1.2 SQL和NOSQL不同点 1.3 特征 1.4 Redis…

Electron 打包自定义NSIS脚本为安装向导增加自定义页面增加输入框

Electron 打包工具有很多&#xff0c;如Electron-build、 Electron Forge 等&#xff0c;这里使用Electron-build&#xff0c;而Electron-build使用了nsis组件来创建安装向导&#xff0c;默认情况nsis安装向导不能自定义安装向导界面&#xff0c;但是nsis提供了nsis脚本可以扩展…