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

news2024/11/18 18:21:00

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

🏅个人专栏:《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的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

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

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

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

相关文章

Emacs之解除comment-region绑定C-c C-c快捷键(一百三十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

对一个时间序列中的每个元素按照指定精度位置四舍五入

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 对一个时间序列中的每个元素 按照指定精度位置四舍五入 Series.dt.round() 选择题 以下代码的输出结果中正确的是? import pandas as pd ts pd.Series(pd.date_range("2024-04-04 08:…

16 RGB-LCD 彩条显示

RGB TFT-LCD 简介 TFT-LCD 的全称是 Thin Film Transistor-Liquid Crystal Display&#xff0c;即薄膜晶体管液晶显示屏&#xff0c;它显示的每个像素点都是由集成在液晶后面的薄膜晶体管独立驱动&#xff0c;因此 TFT-LCD 具有较高的响应速度以及较好的图像质量。液晶显示器是…

使用pip安装geopandas(24.4更新)

geopandas是我们用Python进行地理分析常用的库&#xff0c;在数据处理、分析、制图等场景中有着极为广泛的应用&#xff0c;但是在安装过程中会出现各种问题。​geopandas的安装方式有很多&#xff0c;今天我们选取较为简单的pip来进行geopandas的安装。 ​首先&#xff0c;我…

动规训练2

一、最小路径和 1、题目解析 就是一个人从左上往做下走&#xff0c;每次只能往右或者往下&#xff0c;求他到终点时&#xff0c;路径上数字和最小&#xff0c;返回最小值 2、算法原理 a状态表示方程 小技巧&#xff1a;经验题目要求 用一个二维数组表示&#xff0c;创建一个…

【WEEK6】 【DAY3】MySQL函数【中文版】

2024.4.3 Wednesday 目录 5.MySQL函数5.1.常用函数5.1.1.数据函数5.1.2.字符串函数5.1.2.1.CHAR_LENGTH(str)计算字符串str长度5.1.2.2.CONCAT(str1,str2,...)拼接字符串str1 str2 ...5.1.2.3.INSERT(str,pos,len,newstr)把原文str第pos位开始长度为len的字符串替换成newstr5.…

vue3数据库中存头像图片相对路径在前端用prop只能显示路径或无法显示图片只能显示alt中内容的问题的解决

不想看前情可以直接跳到头像部分代码 前情&#xff1a; 首先我们是在数据库中存图片相对路径&#xff0c;这里我们是在vue的src下的assets专门建一个文件夹img存头像图片。 然后我们如果用prop"avatar" label"头像"是只能显示图片路径的&#xff0c;即lo…

CEF的了解

(14 封私信 / 80 条消息) CEF和Electron的区别是什么&#xff1f; - 知乎 (zhihu.com) Electron面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;不会C CEF面向的开发者&#xff1a;会用JavaScript,HTML,CSS&#xff0c;会C (14 封私信 / 80 条消息) liulun - …

代码随想录Day28:回溯算法Part4

Leetcode 93. 复原IP地址 讲解前&#xff1a; 这道题其实在做完切割回文串之后&#xff0c;学会了使用切割的方法来找到字符串的possible 子串之后&#xff0c;思路就会很快找到&#xff0c;细想一下其实无非也就是对given string然后进行切割&#xff0c;只是深度是固定的因…

【数据结构与算法】二叉搜索树和平衡二叉树

二叉搜索树 左子树的结点都比当前结点小&#xff0c;右子树的结点都比当前结点大。 构造二叉搜索树&#xff1a; let arr [3, 4, 7, 5, 2]function Node(value) {this.value valuethis.left nullthis.right null }/*** 添加结点* param root 当前结点* param num 新的结…

50道Java经典面试题总结

1、那么请谈谈 AQS 框架是怎么回事儿&#xff1f; &#xff08;1&#xff09;AQS 是 AbstractQueuedSynchronizer 的缩写&#xff0c;它提供了一个 FIFO 队列&#xff0c;可以看成是一个实现同步锁的核心组件。 AQS 是一个抽象类&#xff0c;主要通过继承的方式来使用&#x…

AI绘图:Stable Diffusion WEB UI 详细操作介绍:基础篇

接上一篇《AI绘图体验&#xff1a;Stable Diffusion本地化部署详细步骤》本地部署完了SD后&#xff0c;大家肯定想知道怎么用&#xff0c;接下来补一篇Stable Diffusion WEB UI 详细操作&#xff0c;如果大家还没有完成SD的部署&#xff0c;请参考上一篇文章进行本地化的部署。…

抽象类与接口(3)(接口部分)

❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&…

Spring Boot:Web开发之视图模板技术的整合

Spring Boot 前言Spring Boot 整合 JSPSpring Boot 整合 FreeMarkerSpring Boot 整合 ThymeleafThymeleaf 常用语法 前言 在 Web 开发中&#xff0c;视图模板技术&#xff08;如 JSP 、FreeMarker 、Thymeleaf 等&#xff09;用于呈现动态内容到用户界面的工具。这些技术允许开…

【css】使用display:inline-block后,元素间存在4px的间隔

问题&#xff1a;在本地项目中使用【display: inline-block】&#xff0c;元素间存在4px间隔。打包后发布到外网又不存在这个问题了。 归根结底这是一个西文排版的问题&#xff0c;英文有空格作为词分界&#xff0c;而中文则没有。 此时的元素具有文本属性&#xff0c;只要标签…

RUST语言函数的定义与调用

1.定义函数 定义一个RUST函数使用fn关键字 函数定义语法: fn 函数名(参数名:参数类型,参数名:参数类型) -> 返回类型 { //函数体 } 定义一个没有参数,没有返回类型的参数 fn add() {println!("调用了add函数!"); } 定义有一个参数的函数 fn add(a:u32)…

android framework 学习笔记(1)

学习资料&#xff1a;《Android Framework 开发揭秘》_哔哩哔哩_bilibili 什么是android framework 看图说话&#xff0c;android框架从上至下分为&#xff1a; 应用层(Application)&#xff0c;Java framework(Application Framework),Native framework. 包括Libraries 和 A…

vue弹出的添加信息组件中 el-radio 单选框无法点击问题

情景描述:在弹出的添加信息的组件中的form中有一个单选框,单选框无法进行点击切换 原因如下: 单选框要求有个默认值,因为添加和更新操作复用同一个组件,所以我在初始化时对相关进行了判定,如果为空则赋初始值 结果这样虽然实现了初始值的展示,但是就是如此造成了单选框的无法切…

电商技术揭秘一:电商架构设计与核心技术

文章目录 引言一、电商平台架构概述1.1 架构设计原则与架构类型选择1.2 传统电商平台架构与现代化架构趋势分析 二、高并发处理与负载均衡2.1 高并发访问特点分析与挑战2.2 负载均衡原理与算法选择 三、分布式数据库与缓存技术3.1 分布式数据库设计与一致性考量3.2 缓存策略与缓…

(4)(4.6) Triducer

文章目录 前言 1 安装triducer 2 故障排除 3 参数说明 前言 Triducer 集速度、温度和深度传感器于一体。埃文在这篇 ardupilot.org 博文底部提供了这些说明(Evan at the bottom of this ardupilot.org blog post)。 1 安装triducer 下面的示例提供了在 Pixhawk 上安装 tri…