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

2024-05-24 02:28

本文主要是介绍金丝雀发布(灰度发布)介绍 及 声明式管理方法简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一   应用发布策略

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
# 创建nskubectl create deployment nginx01   --image=nginx:1.14  --port=80  --replicas=4   -n wyq
#  用deployment 控制器创建4个podkubectl 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: wyqlabels:app: nginx01name: nginx01
spec:ports:- port: 80protocol: TCPtargetPort: 80nodePort: 32428selector:pod-template-hash: 695cdcd7c8type: 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: wyqlabels:app: nginx01name: nginx02
spec:ports:- port: 80protocol: TCPtargetPort: 80nodePort: 31244selector:pod-template-hash: 6fc9f9b648type: 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.chinasem.cn/article/997105

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤