金丝雀发布(灰度发布)介绍 及 声明式管理方法简介

news2024/11/19 19:32:38

目录

一   应用发布策略

1,滚动发布(k8s默认)

2,蓝绿发布

3,金丝雀发布

二    金丝雀发布(Canary Release) (灰度发布)

1,金丝雀发布图解

2, 金丝雀发布部署过程

2,1  准备命名空间和 pod

2.2 更新deployment的版本,并配置暂停deployment

2.3 pod隔离 

2.31 将旧版本nginx  与 之前的svc 绑定

2.32 将新版本nginx  与 新的svc 绑定

2.4 测试pod 隔离是否成功

2.5  恢复更新,查看更新状态

2.6  查看更新完成最后状态

三   声明式管理方法

1, 基本介绍

2, 命令介绍


一   应用发布策略

1,滚动发布(k8s默认)

(一个一个去更新)

2,蓝绿发布

一套业务,两个版本

维护两个相同的生产环境(蓝环境和绿环境)。新版本首先部署到非活跃环境(比如蓝环境),完成部署并验证无误后,通过切换路由或负载均衡器配置,将流量从旧环境(绿环境)无缝转移到新环境。

3,金丝雀发布

逐步将新版本部署到一部分用户或服务器上,监控性能和错误率。如果一切正常,逐渐扩大新版本的覆盖范围,直至完全替换旧版本。

二    金丝雀发布(Canary Release) (灰度发布)

1,金丝雀发布图解

如图,某服务当前版本为 v1,现在新版本 v2 要上线。为确保流量在服务升级过程中平稳无损,采用金丝雀发布方案,逐步将流量从老版本迁移至新版本。

2, 金丝雀发布部署过程

2,1  准备命名空间和 pod
kubectl create ns wyq
# 创建ns

kubectl create deployment nginx01   --image=nginx:1.14  --port=80  --replicas=4   -n wyq
#  用deployment 控制器创建4个pod

kubectl expose deployment nginx01  --port=80 --target-port=80 --name=nginx01 --type=NodePort   -n wyq
# 对外暴露

查看 准备环境

他们都是由 同一个叫nginx01   的deployment 控制器创造出来的。

所以标签都是一样的

2.2 更新deployment的版本,并配置暂停deployment
kubectl set image deployment nginx01 nginx=nginx:1.20.1 -n wyq && kubectl rollout pause deployment nginx01 -n wyq

更新deployment的版本
kubectl set image 
#用于更新 Kubernetes 资源(如 Deployment、StatefulSet 等)中的容器镜像。
deployment nginx01
#指定要更新的 Deployment 的名称为 nginx01
nginx=nginx:1.20.2  
#指定要更新的容器名称为 nginx,并将其镜像设置为 nginx:1.20.2。
-n wyq
#指定命名空间为 wyq
 
 暂停更新
kubectl rollout pause deployment nginx01 -n wyq
#这个命令用于暂停wyq 命名空间中的 nginx01 Deployment 的滚动更新。
 
kubectl rollout pause
#用于暂停 Kubernetes Deployment 的滚动更新。
deployment nginx01
#指定要暂停滚动的 Deployment 的名称为 nginx01
-n wyq
#指定命名空间为 wyq

查看此时的状态

可以看到pod 由4个变成了6个  由于新生成的pod 不是原来deployment 产生的,所以标签不一致

可以看到流量会分配到 新旧版本的nginx 上

2.3 pod隔离 

流量控制:为了实现金丝雀发布,需要控制流量,使得只有一小部分用户或流量能够访问到新版本的应用程序。

使用Service的selector和labels来选择性地路由流量到不同的Deployment。可以创建一个新的Service,其selector只匹配新版本的Pods,然后将一小部分流量路由到这个Service。

说白了就是 创建一个新的svc 暴露端口,并将新版本的nginx和 新的svc绑定,将老版本的nginx和 老的svc绑定 。 这样就能做到 pod 隔离,相当于把旧版的Pod与新版本的Pod实例进行了分割,而后再通过关注新版本的性能和稳定性,来确保新版本能够正常运行。在确定新版本的pod实例能够正常使用,且没有漏洞时,再恢复更新

2.31 将旧版本nginx  与 之前的svc 绑定

删除原来的svc ,用yaml 文件生成新的svc (nginx01)   绑定旧版本的nginx

apiVersion: v1
kind: Service
metadata:
  namespace: wyq
  labels:
    app: nginx01
  name: nginx01
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 32428
  selector:
    pod-template-hash: 695cdcd7c8
  type: NodePort

指定nodePort: 32428      (注意这个端口要和之前的一样!方便客户访问

重点:

selector: #键值对标签选择器,用于确定哪些Pod应该被包含在Service的后端集合中

pod-template-hash: "695cdcd7c8" #这里填 旧版本nginx 的标签

 执行yaml 文件   生成svc

2.32 将新版本nginx  与 新的svc 绑定

用yaml 文件生成新的svc (nginx02)   绑定新版本的nginx

apiVersion: v1
kind: Service
metadata:
  namespace: wyq
  labels:
    app: nginx01
  name: nginx02
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 31244
  selector:
    pod-template-hash: 6fc9f9b648
  type: NodePort

 执行yaml 文件   生成svc (nginx02) 绑定新版本nginx

查看现在的环境

完成上述操作,相当于把旧版的Pod与新版本的Pod实例进行了分割,而后再通过关注新版本的性能和稳定性,来确保新版本能够正常运行。在确定新版本的pod实例能够正常使用,且没有漏洞时,再恢复更新

2.4 测试pod 隔离是否成功

访问旧版本的32428 端口   流向只会去向旧版本

访问旧版本的31244 端口   流向只会去向新版本

2.5  恢复更新,查看更新状态

恢复更新

kubectl rollout resume deployment nginx01 -n wyq

查看更新状态

kubectl rollout status deployment nginx01 -n wyq

2.6  查看更新完成最后状态

更新完毕

所有流向都会走向新的 svc

旧的service最好不要删除,当新版本出现问题,需要回滚时,旧版的pod还是会关联在旧的service当中

3,   常见错误注意事项

此方法是错误的! 这只是加标签,像商品上贴备注一样,做不到 将pod 隔离

三   声明式管理方法

1, 基本介绍

1.适合于对资源的修改操作
2.声明式资源管理方法依赖于资源配置清单文件对资源进行管理
资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)
3.对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
4.语法格式:kubectl create/apply/delete -f xxxx.yaml

2, 命令介绍

查看资源配置清单

kubectl get deployment nginx -o yaml

解释资源配置清单

kubectl explain deployment.metadata
kubectl get service nginx -o yaml
kubectl explain service.metadata

修改资源配置清单并应用  

离线修改:
修改yaml文件,并用 kubectl apply -f xxxx.yaml 文件使之生效
注意:当apply不生效时,先使用delete清除资源,再apply创建资源

在线修改

直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改

 删除资源配置清单

陈述式删除:
kubectl delete service nginx
声明式删除:
kubectl delete -f nginx-svc.yaml

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

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

相关文章

LeetCode700二叉搜索树中的搜索

题目描述 给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。 解析 最基本的二叉搜索树的应用,递归或者while循环都可以…

PostgreSQL 连接和管理问题解决方案

在使用PostgreSQL数据库时,可能会遇到一些连接和管理方面的问题。本文将详细介绍如何解决“Peer authentication failed”和“password authentication failed”错误,并提供卸载PostgreSQL的方法。 问题一:Peer Authentication Failed Peer …

2024最新彩虹聚合DNS管理系统源码v1.3 全开源

简介: 2024最新彩虹聚合DNS管理系统源码v1.3 全开源 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、DNSLA、CloudFlare。 本系统支持多用户,每个用户可…

创建一个python的Django项目文件

创建一个python的Django项目文件(内含conda) 文章目录 创建一个python的Django项目文件(内含conda)前言一、conda环境的下载二、配置conda的环境变量三、激活管理环境四、下载Django五、创建Django项目文件六、启动Django文件七、用pycharm直接创建Django文件 前言 大家好,今天…

WEB转Flutter基础学习笔记(内含vue和flutter对比)

一、Widget简要概括 如果说Vue的UI是template包裹的一个个组件 那么Flutter的UI就是baseBuild中return出来的嵌套罗列的widget StatelessWidget 用于不需要维护状态的场景,它通常在build方法中通过嵌套其他 widget 来构建UI,在构建过程中会递归的构建其…

Linux: network: send 失败的时候要不要close socket?

最近遇到一个例子,说有zerowindow出现;出现的原因是接收方的CPU被其他程序吃光,导致socket的read函数处理非常慢。说明接收端的接收缓存不够用。发送端自然而然的要停止发送。 但是如果在接收方的recv buff,以及发送方的send buf…

【深度学习】YOLOv8训练,交通灯目标检测

文章目录 一、数据处理二、环境三、训练 一、数据处理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

excel里如何将数据分组转置?

这个表格怎样转换为下表?按照国家来分组,把不同年份对应的不同序列值进行转置?? 这演示用数据透视表就完成这个数据转换。 1.创建数据透视表 选中数据中任意单元格,点击插入选项卡,数据透视表,…

Java编程语言,使用迭代器Iterator实现自动分页查询

一、背景 在Java中,Iterator是一种设计模式,用于提供一种按顺序访问集合中元素的方式,而不暴露集合的底层表示。Iterator接口主要用于遍历集合,它定义了两种方法:hasNext()和next()。 借助于迭代器Iterator&#xff…

uniapp-自定义navigationBar

封装导航栏自定义组件 创建 nav-bar.vue <script setup>import {onReady} from dcloudio/uni-appimport {ref} from vue;const propsdefineProps([navBackgroundColor])const statusBarHeight ref()const navHeight ref()onReady(() > {uni.getSystemInfo({success…

modbus开源库libmodbus的C语言使用记录(实现简单的modbus主机/丛机程序,解决libmodbus库安装出现的问题)

libmodbus简介 libmodbus 是一个开源的、跨平台的C库,用于实现Modbus通讯协议。它支持Modbus RTU(RS-232/485)和Modbus TCP协议,可以使开发者方便地在项目中集成Modbus通讯功能。libmodbus的设计目标是简单、灵活和高效,适用于各种大小的嵌入式和桌面应用。 编译运行测试…

交换机连接方式

一、级联方式 级联是将多个交换机或其他网络设备依次连接&#xff0c;形成一个层次结构&#xff0c;从而扩展网络的覆盖范围和端口数量。 在级联连接中&#xff0c;数据信号会从一个设备依次传递到下一个设备。每个设备都会接收并处理来自上级设备的数据&#xff0c;并将其转…

vb.net打开CAD指指定路径文件

首先打开vsto,创建窗体&#xff0c;添加一个按钮&#xff0c;双击按钮录入代码&#xff1a; Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickDim cad As Objectcad CreateObject("autocad.Application")cad…

Spring Cloud整合Sentinel

1、引入依赖 链接: 点击查看依赖关系 父pom <spring.cloud.version>Hoxton.SR12</spring.cloud.version> <spring.cloud.alibaba.version>2.2.10-RC1</spring.cloud.alibaba.version>Sentinel应用直接引用starter <dependency><groupId&…

《2024中国AI大模型产业图谱1.0版》重磅发布

‍ 数据猿出品 本次“数据猿2024年度三大媒体策划活动——《2024中国数据智能产业图谱1.0版》”正式发布。下一次版本迭代将于2024年7月底发布2024年2.0版&#xff0c;敬请期待&#xff0c;欢迎报名。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着科技的飞速发展&#…

三维焊接平台在新一代机器人生产中得到广泛应用-河北北重

随着智能制造行业的不断推进&#xff0c;三维焊接平台在工业机器人领域应用现象普遍。三维焊接平台、三维柔性焊接平台工装夹具也会在新一代机器人——智能机器人在工业生产中得到广泛应用。目前&#xff0c;三维焊接平台、焊接铸铁平台在工业机器人的主要作用是应用于弧焊、电…

202472读书笔记|《首先你要快乐,其次都是其次》——快乐至上,允许一切发生

202472读书笔记|《首先你要快乐&#xff0c;其次都是其次》——快乐至上&#xff0c;允许一切发生 《首先你要快乐&#xff0c;其次都是其次》作者林小仙&#xff0c;挺轻松的小漫画&#xff0c;清新的文字。 生而为人&#xff0c;我很抱歉&#xff0c;大可不必。 生活已经很难…

鸿蒙HarmonyOS开发中的易混点归纳-持续补充中

相关文章目录 鸿蒙HarmonyOS开发术语全解&#xff1a;小白也能看懂&#xff01; 文章目录 相关文章目录前言一、build()函数和Builder装饰器&#xff1f;二、自定义组件和系统组件&#xff08;内置组件&#xff09;三、组件和页面四、自定义弹窗和其他弹窗总结 前言 一、build…

【BSP开发经验】简易文件系统digicapfs实现方式

文章目录 背景Linux vfs框架介绍数据结构系统调用openwriteread 总体框架 Linux 磁盘高速缓存机制标准文件访问同步文件访问异步文件访问buffer_head 如何实现一个简单的文件系统blkdevfs注册文件系统产生一个文件让文件变得可读可写 背景 在新的分区升级启动方案中需要分别实…

《QT实用小工具·六十五》基于QPropertyAnimation实现的移动动画和控件覆盖

1、概述 源码放在文章末尾 该项目基于QPropertyAnimation实现了控件平移动画和控件之间的相互覆盖效果&#xff0c;项目demo演示如下所示&#xff1a; 项目解析&#xff1a; new QPropertyAnimation(ui.SingleOcclusion, “pos”); //创建动画对象&#xff0c;第一个参数传…