使用原生k8s及helm完成灰度(金丝雀)发布
背景最终结构原先的charts templates的目录结构templates-deployment-ingress-svc使用灰度后的charts templates的目录结构templates-deployment-group1-deployment-group2-ingress-svc结构说明使用原生的k8s来做灰度其实非常简单,利用的就是不同的deploy可...
背景
最终结构
原先的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
更多推荐
所有评论(0)