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>
相关推荐
ZHOU西口31 分钟前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
牛角上的男孩1 小时前
Istio Gateway发布服务
云原生·gateway·istio
JuiceFS2 小时前
好未来:多云环境下基于 JuiceFS 建设低运维模型仓库
运维·云原生
景天科技苑3 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge4 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇4 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试6 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!12 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis15 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge15 小时前
Docker篇(Docker Compose)
运维·docker·容器