在Kubernetes中,金丝雀发布(Canary Release)是一种渐进式部署策略,目的是将新版本应用逐步暴露给一小部分用户或流量,通过持续监控确保其稳定性后,再逐步扩大范围直至完全替换旧版本。这种策略的名称来源于“矿井中的金丝雀”——早期矿工用金丝雀来检测有毒气体,如果金丝雀存活,说明环境安全。
金丝雀发布的核心原理
小范围验证:
先部署新版本(金丝雀版本)到生产环境,但仅允许少量用户或流量访问它(例如5%的请求)。
大部分流量仍由旧版本处理,确保用户整体体验不受影响。
监控与观察:
监控新版本的性能指标(如错误率、延迟、CPU/内存使用率等)。
如果新版本表现稳定,逐步增加其流量比例;如果发现问题,立即回滚。
逐步替换:
最终将100%流量切换到新版本,完成平滑升级。
为什么在Kubernetes中使用金丝雀发布?
降低风险:
避免一次性全量发布导致全局故障,尤其适用于关键业务场景。
快速反馈:
通过真实流量验证新版本,比测试环境更可靠。
无缝回滚:
发现问题时,只需将流量切回旧版本,无需重新部署。
创建条件是让蓝绿在同一个service名称下
vim green.yml
|kubectl apply -f green.yml
vim blue.yml
kubectl apply -f blue.yml
kubectl get po
查看服务端口kubectl get svc
完成后可以在网页上访问 192.168.11.160:32016
之后可以通过命令更改蓝绿的pod数量
kubectl scale deployment myapp-blue --replicas 8
kubectl scale deployment myapp-green --replicas 2
通过ingress做
vim blue.yml
kubectl apply -f blue.yml
vim green.yml
kubectl apply -f green.yml
vim green-svc.yml
kubectl apply -f green-svc.yml
vim ingress-canary.yml
kubectl apply -f ingress-canary.yml
vim master-ingress.yml
kubectl apply -f master-ingress.yml
kubectl get ingress 两个ingress共用一个地址
查看端口kubectl -n ingress-nginx get svc
在node节点添加 vim /etc/hosts
修改`canary-weight`注解值,逐步增加新版本流量:(也可以在文件中修改)
kubectl annotate ingress/myapp-canary \
nginx.ingress.kubernetes.io/canary-weight="50" \ # 50%流量到v2
--overwrite