使用原生k8s及helm完成灰度(金丝雀)发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42150559/article/details/97143825

背景

在这里插入图片描述

最终结构

在这里插入图片描述

原先的charts templates的目录结构

templates
-deployment
-ingress
-svc

使用灰度后的charts templates的目录结构

templates
-deployment-group1
-deployment-group2
-ingress
-svc

结构说明

使用原生的k8s来做灰度其实非常简单,利用的就是不同的deploy可以路由到同一个svc,因为svc是根据deploy的标签来绑定deploy的。

旧的deploy代码说明(使用灰度前的)

注意labels标签下的app标签
后续svc就通过这个app标签来绑定多个deployment
这样就会把流量平均路由到多个deployment上
注意images一定要放到values文件里作为变量,后面用helm可以传入值

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: [deployment的名字]
  labels:
    app: [deployment的名字] #打个标签
spec:
  replicas: 1 #副本数
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: [deployment的名字]
    spec:
      containers:
      - name: [容器的名字]
        image: {.Values.images} #注意这个images一定要放到values文件里
        ...
        #以下就省略了,什么健康检查啥的,根据要求定义

旧values代码说明

images:[使用的镜像名称]

新的deploy代码说明(使用灰度后的)

新的deploy与旧的不同的点在于要分成2个,第一组和第二组
注意labels标签下的app标签
后续svc就通过这个app标签来绑定多个deployment
这样就会把流量平均路由到多个deployment上
注意images一定要放到values文件里作为变量,后面用helm可以传入值

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: [deployment的名字]-group1
  labels:
    app: [deployment的名字] #打个标签
spec:
  replicas: 1 #副本数
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: [deployment的名字]
    spec:
      containers:
      - name: [容器的名字]
        image: {.Values.images} #注意这个images一定要放到values文件里
        ...
        #以下就省略了,什么健康检查啥的,根据要求定义

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: [deployment的名字]-group2
  labels:
    app: [deployment的名字] #打个标签
spec:
  replicas: 1 #副本数
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: [deployment的名字]
    spec:
      containers:
      - name: [容器的名字]
        image: {.Values.images} #注意这个images一定要放到values文件里
        ...
        #以下就省略了,什么健康检查啥的,根据要求定义

新values代码说明

group1:
	images:[第一组deploy的镜像名称]
group2:
	images:[第二组deploy的镜像名称]	

svc代码说明

注意selector的app,这里就是对应我们之前deploy的labels,来路由流量到deploy

apiVersion: v1
kind: Service
metadata:
  name: [svc的名字]
  labels:
    app: [svc的名字]
spec:
  ports:
  - port: 8080
    name: http
    targetPort: 8080
  selector:
    app: [deployment的label里的标签]#这里很关键,svc绑定的是所有app标签等于deployment的name的deployment

灰度流程

我们使用helm upgrade --set去改变values文件里面的images的值来实现发布新版本,这样我们可以只改变一个group的镜像,来实现部分更新
假设
新版本的镜像为NEW_IMAGES
旧版本的镜像为OLD_IMAGES

发布第一组金丝雀

helm upgrade [发布名称] --install --set group1.images=NEW_IMAGES,group2.images=OLD_IMAGES

发布第二组全量

helm upgrade [发布名称] --install --set group1.images=NEW_IMAGES,group2.images=NEW_IMAGES

第一第二组全部回滚

helm upgrade [发布名称] --install --set group1.images=OLD_IMAGES,group2.images=OLD_IMAGES

获取指定的deploy的镜像号

kubectl get deploy -l app=[deploy的标签值] -o jsonpath="{..image}" |tr -s '[[:space:]]' ’\n‘ |sort |uniq

高级技巧

还可以将replicas等等各种属性提出来,放到values中,使用helm upgrade --set将值传入进去,来实现各种自定义

打通jenkins

使用jenkinsfile的pipeline来执行helm命令,让开发自己输入参数。

k8s各组件属性关系图

在这里插入图片描述

缺点

使用原生的k8s完成灰度,无法想istio那杨,按照百分比控制流量,但使用istio也有它的成本,需要根据企业取舍
istio完成灰度:https://blog.csdn.net/qq_42150559/article/details/96136245

猜你喜欢

转载自blog.csdn.net/qq_42150559/article/details/97143825