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-v1
  namespace: production
spec:
  ingressClassName: nginx
  rules:
  - host: canary.com
    http:
      paths:
      - backend:
          service:
            name: canary-v1
            port:
              number: 8080
        path: /
        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.yaml

apiVersion: 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: nginx
  rules:
  - host: canary.com	##客户端访问的域名
    http:
      paths:
      - backend:		##后端设置,通常用来设置service
          service:
            name: canary-v2
            port:
              number: 8080
        path: /
        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>
相关推荐
qhqh31014 分钟前
k8s的service、ingress controller和ingress
云原生·容器·kubernetes
susu108301891128 分钟前
Ubuntu 离线环境 安装 Docker Compose
运维·docker·容器
fengyehongWorld1 小时前
docker compose的使用
运维·docker·容器
宁波阿成3 小时前
OpenClaw Docker 完整部署与排障总文档
运维·docker·ai·容器·openclaw
小二·3 小时前
Go 语言系统编程与云原生开发实战(第34篇)
大数据·云原生·golang
智能工业品检测-奇妙智能3 小时前
docker如何进行离线部署springboot项目
spring boot·docker·容器
martin10173 小时前
Docker核心概念与实战指南
docker·容器
Zfox_4 小时前
【Docker#6】Docker 容器常用命令
linux·运维·服务器·docker·容器
石工记4 小时前
OpenClaw AI 助手 Docker Compose 一键部署文档(MacBook Pro 2020 专属版,可下载)
人工智能·docker·容器
程序员一点4 小时前
第19章:openEuler 中的容器支持(Docker 与 iSulad)
运维·docker·容器·openeuler