k8s灰度/金丝雀发布

2024-09-07 05:28

本文主要是介绍k8s灰度/金丝雀发布,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。

        灰度发布的方式通常用于AB测试,是指一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

        金丝雀发布是指在生产环境中逐步推出新版本应用程序,只在一小部分用户或流量中使用该版本,并根据反馈逐步扩大规模,最终完全替换旧版本。金丝雀发布允许快速检测新版本与旧版本之间是否存在兼容性问题、性能问题或其他问题,并减轻了在实施全新发布时可能遭受的损失。

        蓝绿部署,是指同时运行两个版本的应用。在蓝绿部署时,蓝绿部署的时候,并不停止掉老版本,而是直接部署一套新版本,等新版本运行起来后,再将流量切换到新版本上。

例如发布前,在蓝色的系统上进行测试,测试完成后切换为蓝色系统,同时观察蓝色系统的运行状态,如果运行出现问题可以及时切回绿色系统。

蓝绿部署的优点

这样做可以减少发布影响的时间。例如某网站要进行后端升级,无需完全停掉服务更新,且出现问题后可以及时切回老版本。

蓝绿部署的缺点

需要两倍的硬件资源,需要额外进行付费;微服务架构很难这样进行迁移;要求蓝绿两套系统完全没有耦合;迁移后未完成的任务进行迁移需要一定的成本,如数据库的迁移。

        假设我们有两个命名空间,一个是正在使用的生产环境Production,另一个是用于灰度测试的Canary。在发布应用时,可以将应用先发布至Canary,然后切—部分流量到Canary,之后慢慢将流量全部切换到上面即可。

1.创建V1版本

(1)首先创建模拟生产(Production)环境的命名空间和服务
[root@k8s-master ~]# kubectl create ns production
(2)创建v1版本的应用
[root@k8s-master ~]# kubectl create deployment canary-v1 \--image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v1 \
-n production
(3)创建Service暴露应用
[root@k8s-master ~]# kubectl expose deployment canary-v1 --port 8080 -n production
(4)创建ingress,指定域名为canary.com
[root@k8s-master ~]# cat v1-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: canary-v1namespace: production
spec:ingressClassName: nginxrules:- host: canary.comhttp:paths:- backend:service:name: canary-v1port:number: 8080path: /pathType: ImplementationSpecific

备注:

路径类型pathType

  • ImplementationSpecific:系统默认,有IngressClass控制器提供具体实现
  • exact:精确匹配URL路径,区分大小写
  • prefix:匹配URL路径的前缀
(5)部署ingress
[root@k8s-master ~]# kubectl create -f v1-ingress.yaml
(6)测试访问

在客户端添加canary.com的域名解析

2.创建v2版本

创建V2版本,充当灰度环境。

(1)创建v2版本的命名空间
[root@k8s-master ~]# kubectl create ns canary
(2)创建v2版本的应用
[root@k8s-master ~]# kubectl create deployment canary-v2 \--image=registry.cn-beijing.aliyuncs.com/dotbalo/canary:v2 \
-n canary
(3)创建v2版本的service
[root@k8s-master ~]# kubectl expose deployment canary-v2 --port 8080 -n canary
[root@master ~]# ku get svc -n canary
NAME        TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
canary-v2   ClusterIP   10.104.202.121   <none>        8080/TCP   31m
[root@k8s-master ~]# curl 10.104.202.121:8080
<h1>Canary v2</h1>

3.通过ingress控制流量

[root@k8s-master ~]# vim canary-v2.yamlapiVersion: networking.k8s.io/v1
kind: Ingress
metadata:annotations:nginx.ingress.kubernetes.io/canary: "true"	##指定此为灰度环境nginx.ingress.kubernetes.io/canary-weight: "10"	##灰度环境的权重name: canary-v2		##此ingress的名称namespace: canary	##所属的命名空间
spec:ingressClassName: nginxrules:- host: canary.com	##客户端访问的域名http:paths:- backend:		##后端设置,通常用来设置serviceservice:name: canary-v2port:number: 8080path: /pathType: ImplementationSpecific
[root@k8s-master ~]# kubectl create -f canary-v2.yaml 

备注:

nginx.ingress.kubernetes.io/canary: "true"  表示此站点为灰度模式

nginx.ingress.kubernetes.io/canary-weight: "10"表示为该站点分配10%的流量,原站点就可以得到90%的流量

weight: "10"  权重值为10

4.测试灰度发布

(1)进行测试
[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>

从结果可以大致判断出,两个网站的访问比例大约为1:9

(2)修改权重为50的测试结果
[root@k8s-master ~]# ku edit ingress canary-v2 -n canary
#修改权重值为50
nginx.ingress.kubernetes.io/canary-weight: "50"
[root@k8s-master ~]# for i in $(seq 10);do curl -s canary.com;done
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>
<h1>Canary v2</h1>
<h1>Canary v2</h1>
<h1>Canary v1</h1>
<h1>Canary v1</h1>

这篇关于k8s灰度/金丝雀发布的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1144185

相关文章

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

修复已被利用的高危漏洞! macOS Sequoia 15.6.1发布

《修复已被利用的高危漏洞!macOSSequoia15.6.1发布》苹果公司于今日发布了macOSSequoia15.6.1更新,这是去年9月推出的macOSSequoia操作... MACOS Sequoia 15.6.1 正式发布!此次更新修复了一个已被黑客利用的严重安全漏洞,并解决了部分中文用户反馈的

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

macOS Sequoia 15.5 发布: 改进邮件和屏幕使用时间功能

《macOSSequoia15.5发布:改进邮件和屏幕使用时间功能》经过常规Beta测试后,新的macOSSequoia15.5现已公开发布,但重要的新功能将被保留到WWDC和... MACOS Sequoia 15.5 正式发布!本次更新为 Mac 用户带来了一系列功能强化、错误修复和安全性提升,进一步增

Maven 依赖发布与仓库治理的过程解析

《Maven依赖发布与仓库治理的过程解析》:本文主要介绍Maven依赖发布与仓库治理的过程解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录Maven 依赖发布与仓库治理引言第一章:distributionManagement配置的工程化实践1

使用Python构建一个Hexo博客发布工具

《使用Python构建一个Hexo博客发布工具》虽然Hexo的命令行工具非常强大,但对于日常的博客撰写和发布过程,我总觉得缺少一个直观的图形界面来简化操作,下面我们就来看看如何使用Python构建一个... 目录引言Hexo博客系统简介设计需求技术选择代码实现主框架界面设计核心功能实现1. 发布文章2. 加