k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

news2025/5/20 10:21:02

金丝雀部署简介:

1、基本概念

金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发布范围,最终完成全量更新。
名称来源:源于煤矿工人用金丝雀检测瓦斯泄漏的做法 —— 通过观察少量样本的反应,提前发现潜在风险。

2、核心流程与特点
(一)核心流程
  1. 准备阶段
    • 同时运行 ** 旧版本(稳定版本)新版本(待发布版本)** 的应用服务。
    • 配置路由规则,将少量用户流量(如 5%)导向新版本,其余流量仍指向旧版本。
  2. 监控与验证
    • 实时监控新版本的性能指标(如响应时间、错误率、资源利用率)和用户反馈(如功能异常、界面问题)。
    • 若发现严重问题,立即将流量切回旧版本(回滚);若验证通过,逐步增加新版本流量(如 10%、20%……)。
  3. 全量发布
    • 当新版本通过所有验证且流量占比达到 100% 时,完成部署,下线旧版本服务。
(二)关键特点
优点缺点
1. 风险隔离:仅少量用户受潜在问题影响,降低故障波及范围。
2. 精准验证:在真实环境中验证功能,提前发现兼容性、性能等问题。
3. 灵活回滚:支持快速切换回旧版本,减少停机时间。
1. 复杂度高:需维护新旧版本并存的环境,增加部署和监控成本。
2. 流量分配难度大:需精确控制流量比例,避免因流量不均导致验证偏差。
3. 适用场景有限:不适合需要用户状态强一致的场景(如交易系统)。
3、适用场景
  1. 功能迭代验证:如前端界面优化、新功能试点,通过小范围用户反馈迭代改进。
  2. 性能测试:在生产环境中测试新版本对服务器、数据库的负载影响。
  3. 灰度发布:与 A/B 测试结合,向不同用户群体展示不同版本,对比效果后再全量发布。
  4. 微服务架构:在分布式系统中,对单个服务进行金丝雀部署,降低整体变更风险。

部署思路:

在生产上先进行少量更新如有10个v1.0的Pod正在稳定运行,此时设置一个滚动更新为v2.0, 更新之后立马停止更新,此时有11个Pod正在运行,此时如果用户访问正常那么就全量开启滚动更新,否则就进行回退。

一、金丝雀部署-打补丁升级步骤

在 Kubernetes 中,rollout resumerollout pause是用于控制 Deployment、StatefulSet 或 DaemonSet 滚动更新过程的两个重要命令。它们允许你暂停正在进行的更新,进行检查或修改,然后恢复更新过程,提供了对滚动更新的精细控制。

1、滚动更新概念:

(一)、rollout pause:暂停滚动更新

1. 基本功能
  • 暂停当前进行中的滚动更新,使 Deployment 停止创建或更新 Pod。
  • 保留已更新的 Pod,但不会继续更新剩余的 Pod。
  • 允许修改更新参数(如镜像版本、环境变量),而不会触发新的滚动更新。
2. 适用场景
  • 在更新过程中进行中间检查(如验证部分 Pod 的运行状态)。
  • 需要临时调整更新策略(如减慢更新速度)。
  • 在更新关键应用前,预留时间进行人工确认。
3. 示例命令

bash

kubectl rollout pause deployment/my-app
4. 注意事项
  • 暂停后,Deployment 的状态会显示为ProgressingPaused: true
  • 只有 Deployment 支持暂停 / 恢复操作, ReplicaSet 和 ReplicationController 不支持。

(二)、rollout resume:恢复滚动更新

1. 基本功能
  • 继续被暂停的滚动更新,按照最新的配置继续创建或更新 Pod。
  • 应用暂停期间的配置修改,但不会触发新的滚动更新版本。
2. 适用场景
  • 在中间检查完成后,继续更新过程。
  • 在调整更新参数(如maxSurgemaxUnavailable)后,恢复更新。
3. 示例命令

bash

kubectl rollout resume deployment/my-app
4. 注意事项
  • 恢复后,Deployment 会继续使用暂停时的滚动更新策略(如spec.strategy)。
  • 如果在暂停期间修改了不允许的字段(如selector),可能导致更新失败。

(三)、典型工作流程示例

场景:更新应用并验证中间状态
  1. 启动滚动更新

    bash

    kubectl set image deployment/my-app app=my-app:v2
    
  2. 暂停更新(例如,当 50% 的 Pod 更新完成时):

    bash

    kubectl rollout pause deployment/my-app
    
  3. 验证中间状态

    bash

    kubectl get pods  # 检查已更新Pod的运行状态
    kubectl describe deployment/my-app  # 查看Deployment状态
    
  4. 调整参数(可选):

    bash

    kubectl patch deployment/my-app -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1}}}}'
    
  5. 恢复更新

    bash

    kubectl rollout resume deployment/my-app
    

(四)、常见问题与注意事项

1. 暂停后资源占用
  • 暂停期间,旧版本和新版本的 Pod 可能同时存在,需确保集群有足够资源。
2. 状态查看
  • 使用以下命令查看暂停状态:

    bash

    kubectl get deployments.apps my-app -o jsonpath='{.status.conditions[?(@.type=="Progressing")].message}'
    

    输出示例:

    plaintext

    Deployment is paused and will not progress further until resumed
    
3. 版本控制
  • 暂停 / 恢复操作不会创建新的 Rollout 版本(revision),所有修改会应用到当前进行中的更新。
4. 超时处理
  • 如果更新长时间暂停,可能触发ProgressDeadlineExceeded条件,需通过kubectl rollout restart重启更新。

(五)、与其他 Rollout 命令的对比

命令功能描述
rollout pause暂停滚动更新,允许修改配置而不触发新的更新。
rollout resume恢复被暂停的滚动更新。
rollout status查看滚动更新的状态(是否完成、进度百分比)。
rollout history查看滚动更新的历史版本。
rollout undo回滚到上一个稳定版本或指定版本。
rollout restart重启 Deployment,触发新一轮滚动更新(常用于配置刷新)。

(六)、总结

rollout pauserollout resume为 Kubernetes 滚动更新提供了灵活的控制机制,特别适合需要精细验证或调整的生产环境。通过暂停更新,你可以在关键阶段进行人工干预,确保变更安全;通过恢复更新,你可以继续完成变更流程,实现平滑过渡。合理使用这两个命令,有助于提升集群稳定性和发布效率。

2、滚动更新实现步骤

步骤一:运行v1.0版本的pod

v1.0版本的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-de
  namespace: de
  labels:
    app: nginx-de
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values: [nginx-de]
  template:
    metadata:
      name: nginx-de
      namespace: de
      labels:
        app: nginx-de
    spec:
      containers:
        - name: nginx-de
          imagePullPolicy: IfNotPresent
          image: registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0
          ports:
            - containerPort: 80
          startupProbe:
            httpGet:
              path: /
              port: 80
            successThreshold: 1
            initialDelaySeconds: 15

步骤二:打补丁修改系统默认的更新策略

可用和不可用都是25%

修改更新策略:

#触发更新就停止滚动更新
 kubectl patch deploy nginx-de -n de  -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

 修改之后:变成了允许超出预期的Pod数量最大值为1个。

  1. maxSurge: 1
    此参数表明在滚动更新期间,允许超出预期 Pod 数量的最大值为 1 个。打个比方,要是预期的 Pod 数量设定为 3 个,那么在更新过程中,最多会有 4 个 Pod 同时运行。

  2. maxUnavailable: 0
    该参数意味着在滚动更新时,处于不可用状态的 Pod 数量上限为 0。也就是说,在更新期间,所有预期的 Pod 都必须保持可用状态。

步骤三 :执行v2.0版本镜像的更新

kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && kubectl rollout pause deploy nginx-de  -n de

  • 在打补丁时出现异常处理情况:
情况一: 直接回退到上一个版本

此时想回退到上一个版本:

操作步骤一:执行回滚命令会出现报错

 kubectl rollout undo  deploy nginx-de -n de

此时执行报错rollout undo命令会报错,因为是暂停了滚动更新需要回退之前得开启被暂停掉的更新!!!

操作步骤二:按照提示操作

解决方法:

执行:


#步骤一:先执行被暂停的滚动更新,再执行回滚的动作
kubectl rollout resume deploy nginx-de -n de && kubectl rollout undo deploy nginx-de -n de

#步骤二:查看回滚状态是否正常
 kubectl rollout status deploy nginx-de -n de

情况二:出现报错修改配置参数

上述出现拉取镜像错误的信息,那么我们现在要将正确的镜像信息配置

操作步骤一:先删除之前报错的pod

步骤二:先执行继续回滚的动作再执行修改镜像配置的动作再执行暂停滚动更新动作

#步骤一:删除失败的镜像信息

 kubectl delete pod  nginx-de-bbd87f74d-2s6d5 -n de

#步骤二:执行更新镜像信息
kubectl rollout resume deploy nginx-de -n de && \
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && \
kubectl rollout pause deploy nginx-de -n de

#步骤三:验证
while true;do curl 10.96.62.230;done

步骤四:配置一个svc用于检测测试结果

apiVersion: v1
kind: Service
metadata:
  name: nginx-de
  namespace: de
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx-de

金丝雀部署打补丁结果:

出现了4个Pod,其中1个为最新的v2.0版本,其他的为v1.0版本

测试:

[root@master deployment]# kubectl get svc -n de
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx-de   ClusterIP   10.96.62.230   <none>        80/TCP    3m49s
[root@master deployment]#
[root@master deployment]#
[root@master deployment]# while true;do curl 10.96.62.230;done

步骤五:操作异常回滚

情况一:灰度更新正常(继续开启滚动更新)

停止滚动更新目的是要看生产上有没有出现异常,如果没有异常再继续更新

继续滚动更新:

kubectl rollout resume deploy nginx-de -n de

测试更新结果:

情况二:灰度更新异常(回滚)

停止滚动更新目的是要看生产上有没有出现异常,如果有异常直接进行回滚操作

#回滚到上个版本
kubectl rollout undo deployment/nginx-de -n de

二、历史版本控制与规范

(一)、使用--record参数进行版本记录

1、--record参数使用方法
#执行yaml
kubectl apply -f  deployment.yaml --record

#打补丁
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' --record

#查看历史版本
kubectl rollout history deploy nginx-de -n de

2、使用--record参数记录版本号的弊端

注意:如果有一个在版本升级少加了--record,那么记录中会沿用上一个版本的的记录 这样容易在版本回退的时候造成误解。

如:

执行新的更新命令不带--record

#执行命令不带--record
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v1.0"}]}}}}'

(二)、自定义版本更新规范(适用于生产环境的版本控制)

1、操作步骤

 将要更新的yaml格式设置为:xx.yaml-年-月-日-姓名-版本,再对这个新的xx.yaml-年-月-日-姓名-版本进行yaml文件进行操作

如下:

cp deployment.yaml deployment.yaml-2025-05-13-yb-nginx:v2.0

 

kubectl apply -f  deployment.yaml-2025-05-13-yb-nginx\:v2.0 --record

 

(三)、配置deploy.spec.revisionHistoryLimit(保留多少版本的历史记录)

如果使用这种当时可用将etcd中的rs记录给去掉,这个就不会造成资源消耗了。

revisionHistoryLimit 参数配置保留多少版本的历史记录:

kubectl explain deploy.spec.revisionHistoryLimit

三、回滚到指定的版本信息

 1、查看版本的历史记录加--record参数

kubectl rollout history deployment/nginx-de -n de

2、添加--to-revision=0参数回退到指定版本

2.1、查看kubectl rollout undo参数
#查看回滚的参数
kubectl rollout undo --help

2.2、--to-revision回退到指定版本
命令格式:

kubectl rollout  undo --to-revision=版本编号

目前版本是v2.0,回退到v1.0

步骤一:查看v1.0对应的版本编号 
kubectl rollout history deploy nginx-de -n de

步骤二:根据查出来的版本编号回退到指定的版本
#查出来的v1.0对应的历史版本号为3
kubectl rollout undo deploy nginx-de -n de --to-revision=3

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

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

相关文章

Google设置app-ads.txt

问题&#xff1a; 应用上架后admob后台显示应用广告投放量受限&#xff0c;需要设置app-ads.txt才行。 如何解决&#xff1a; 官方教程: 看了下感觉不难&#xff0c;创建一个txt&#xff0c;将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…

docker安装rockerMQ

参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址&#xff1a; https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…

交叉引用、多个参考文献插入、跨文献插入word/wps中之【插入[1-3]、连续文献】

我们在写论文时&#xff0c;需要插入大量参考文献。 有时&#xff0c;一句话需要引用多个文献&#xff0c;如&#xff1a;[1-3]或者[1,3,4]这种形式多个文献插入、跨文献插入。 在上一篇文章中&#xff0c;我们提到可以直接打“-”或者“&#xff0c;”&#xff0c;但是word导出…

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲

PLC双人舞&#xff1a;ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析&#xff1a;施耐德PLC与AB PLC的互联互通 在现代工业自动化中&#xff0c;设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关&#xff0c;将施耐德P…

缺乏团队建设活动,如何增强凝聚力?

当一个团队缺乏系统性的建设活动时&#xff0c;成员之间容易产生疏离感、误解与信任缺失&#xff0c;最终影响整体执行力和目标达成。要有效增强团队凝聚力&#xff0c;应从设计高参与感的团队活动、结合业务与人文目标、营造持续共创的文化机制、推动跨层级协作互动等层面着手…

力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素

这道题直接用最笨的办法来做的&#xff0c;用递归来做&#xff0c;我们定义一个全局变量vector<int> element&#xff0c;然后使用中序遍历&#xff0c;每当碰到一个非空节点就将其加入到向量中&#xff0c;这样依赖当向量中的元素小于k时&#xff0c;就返回0&#xff0c…

Linux面试题集合(5)

把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时&#xff0c;搜寻ab字符 /ab 用more和less如何查看文件 more&#xff1a; CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …

python动漫论坛管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…

Web 技术与 Nginx 网站环境部署

这里写目录标题 一. Web基础域名和DNS域名的概念域名的结构域名结构类型 Hosts文件Hosts文件的作用修改Hosts文件 DNS域名注册 网页与HTML网页概述HTML概述HTML基本标签HTML语法规则HTML文件结构 网站和主页Web1.0 与 Web2.0 静态网页与动态网页静态网页动态网页动态网页语言 H…

FP8精度革命:Hopper架构下大模型训练的误差传播控制方法

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、FP8为何成为大模型训练的新范式&#xff1f; 1.1 算力需求与精度演进的矛盾 当前大语言…

手动制做一个Transformer

本文来自I made a transformer by hand . 一直以来&#xff0c;笔者对 transformer 的注意力机制、qkv的理解都浮于表面&#xff0c;当然也不是说我看完 I made a transformer by hand 后理解有多深入&#xff0c;但确实加深了我对相关概念的理解&#xff0c;故搬运此文章&…

已解决——如何让网站实现HTTPS访问?

一、申请SSL证书 SSL证书是HTTPS实现的关键&#xff0c;它由受信任的证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;用于验证网站的身份并加密数据传输。以下是申请SSL证书的常见步骤&#xff1a; 选择证书类型 根据网站的需求和预算&#xff0c;选择合适的SSL证书…

WebRTC技术EasyRTC嵌入式音视频通信SDK助力智能电视搭建沉浸式实时音视频交互

一、方案概述​ EasyRTC是一款基于WebRTC技术的开源实时音视频通信解决方案&#xff0c;具备低延迟、高画质、跨平台等优势。将EasyRTC功能应用于智能电视&#xff0c;能够为用户带来全新的交互体验&#xff0c;满足智能电视在家庭娱乐、远程教育、远程办公、远程医疗等多种场…

小乌龟git中的推送账户、作者账户信息修改

文章目录 修改git文档作者信息修改git推送用户信息参考文献 修改git文档作者信息 小乌龟中的用户信息为&#xff1a;作者信息&#xff0c;并非推送用户。 上边用户信息&#xff0c;修改的是文件的作者信息。如果想要修改git服务中记录的推送用户信息需要修改推送用户信息。 …

Kubernetes MCP服务器(K8s MCP):如何使用?

#作者&#xff1a;曹付江 文章目录 1、什么是 Kubernetes MCP 服务器&#xff1f;1.1、K8s MCP 服务器 2、开始前的准备工作2.1. Kubernetes集群2.2. 安装并运行 kubectl2.3. Node.js 和 Bun2.4. &#xff08;可选&#xff09;Helm v3 3、如何设置 K8s MCP 服务器3.1. 克隆存储…

R²AIN SUITE 亮相第九届智能工厂高峰论坛

2025年5月16日&#xff0c;在圆满落幕的第九届智能工厂高峰论坛上&#xff0c;上海比孚信息科技有限公司携自主研发的 RAIN SUITE 企业AI应用中台解决方案亮相展会。本次论坛以"从互联工厂到智慧工厂"为主题&#xff0c;吸引了400余位行业专家、制造企业代表及产业链…

深入理解仿函数(Functors):从概念到实践

文章目录 1. 什么是仿函数&#xff1f;2. 仿函数与普通函数的区别3. 标准库中的仿函数4. 仿函数的优势4.1 状态保持4.2 可定制性4.3 性能优势 5. 现代C中的仿函数5.1 Lambda表达式5.2 通用仿函数 6. 仿函数的高级应用&#xff08;使用C2020标准库及以上版本&#xff09;6.1 函数…

InternLM 论文分类微调实践(XTuner 版)

1.环境安装 我创建开发机选择镜像为Cuda12.2-conda&#xff0c;选择GPU为100%A100的资源配置 Conda 管理环境 conda create -n xtuner_101 python3.10 -y conda activate xtuner_101 pip install torch2.4.0cu121 torchvision torchaudio --extra-index-url https://downloa…

PC:使用WinSCP密钥文件连接sftp服务器

1. 打开winscp工具&#xff0c;点击“标签页”->“新标签页” 2. 点击“高级"->“高级” 3. 点击"验证"->“选择密钥文件” 选择ppk文件&#xff0c;如果没有ppk文件选择pem文件&#xff0c;会自动生成ppk文件 点击确定 4. 输入要连接到的sftp服务器的…

1688正式出海,1688跨境寻源通接口接入,守卫的是国内工厂资源

在1688平台的跨境招商直播中&#xff0c;许多想要进入跨境市场的初学者商家纷纷提问&#xff1a;货通全球的入口在哪里&#xff1f;小白商家应该如何操作&#xff1f;商品为何上传失败&#xff1f; 从表面上看&#xff0c;这似乎是1688平台在拓展海外市场的一次积极“进攻”。…