每日一Go-66、K8s 蓝绿发布 金丝雀发布实战:Service 切流量 + Ingress 灰度一次讲透

发布时间:2026/5/25 8:03:09

每日一Go-66、K8s 蓝绿发布  金丝雀发布实战:Service 切流量 + Ingress 灰度一次讲透 一、什么是蓝绿发布蓝绿发布 两套完整环境Blue/Green同时存在通过 Service 一次性切换流量。Blue 代表当前线上版本Green代表新版本切换点是 Service selector二、蓝绿发布示例有两套环境同时在线Service 一刀切流量K8s资源结构Deployment(blue)--- Pod (v1)Deployment(green)--- Pod (v2)Service--- selector 决定流量去向当前线上v1Blue版# 部署(Deployment) - 用于管理应用程序的Pod副本apiVersion: apps/v1# Kubernetes应用部署的API版本kind: Deployment# 资源类型Deployment用于管理无状态应用的部署metadata:# 元数据部分name: golang-per-day-65# 部署名称namespace: codee-jun# Kubernetes命名空间spec:# 部署规格# 副本数量期望运行的Pod数量replicas:3# 运行3个Pod副本提供高可用性strategy:# 策略滚动更新策略type: RollingUpdate# 策略类型滚动更新rollingUpdate:# 滚动更新配置maxSurge:1# 最大激增数允许同时运行的最大Pod数量超过期望副本数maxUnavailable:1# 最大不可用数允许同时运行的最大Pod数量低于期望副本数# 选择器用于选择管理哪些Podselector: matchLabels:# 匹配标签选择具有特定标签的Podapp: golang-per-day-65# 标签名称用于标识应用version: v1# 版本标签用于标识应用的不同版本新版本V2Green版selector: matchLabels:# 匹配标签选择具有特定标签的Podapp: golang-per-day-65# 标签名称用于标识应用version: v2# 版本标签用于标识应用的不同版本Service 切换成v2# 服务(Service) - 用于暴露应用程序并提供负载均衡 apiVersion: v1 # Kubernetes API版本 kind: Service # 资源类型Service用于暴露应用程序 metadata: name: golang-per-day-65 # 服务名称 namespace: codee-jun # Kubernetes命名空间 spec: # 服务规格 ports: # 端口配置列表 - protocol: TCP # 协议类型TCP port: 8080 # 服务端口集群内部访问端口 targetPort: 8080 # 目标端口Pod内部端口 sessionAffinity: ClientIP # 会话亲和性ClientIP表示同一客户端的请求会转发到同一Pod为了保持session一致性 selector: # Pod选择器 app: golang-per-day-65 # 匹配具有appgolang-per-day-65标签的Pod # version: v1 # 匹配具有versionv1标签的Pod version: v2 # 匹配具有versionv2标签的Pod发布/回滚6.1 发布新版本kubectl patch svc golang-per-day-65 \ -p {spec:{selector:{version:v2,app:golang-per-day-65}}}6.2 秒级回滚kubectl patch svc golang-per-day-65 \ -p {spec:{selector:{version:v1,app:golang-per-day-65}}}三、什么是金丝雀发布简单来说金丝雀发布Canary Deployment就是一种“先找一小拨人试用没问题再全量推广”的策略。它之所以叫这个名字是因为以前矿工下井前会先放一只金丝雀进去如果金丝雀出了意外说明井下有毒气矿工就不会进去。在软件世界里新版本就是那只金丝雀。四、金丝雀发布示例少量流量先给新版本逐步放量K8s资源结构service.yaml--- v1service.v2.yaml--- v2ingress.yaml--- stableingress.canary.yaml--- canaryservice.yaml# 服务(Service) - 用于暴露应用程序并提供负载均衡 apiVersion: v1 # Kubernetes API版本 kind: Service # 资源类型Service用于暴露应用程序 metadata: name: golang-per-day-65 # 服务名称 namespace: codee-jun # Kubernetes命名空间 spec: # 服务规格 ports: # 端口配置列表 - protocol: TCP # 协议类型TCP port: 8080 # 服务端口集群内部访问端口 targetPort: 8080 # 目标端口Pod内部端口 sessionAffinity: ClientIP # 会话亲和性ClientIP表示同一客户端的请求会转发到同一Pod为了保持session一致性 selector: # Pod选择器 app: golang-per-day-65 # 匹配具有appgolang-per-day-65标签的Pod version: v1 # 匹配具有versionv1标签的Podservice.v2.yamlspec:# 服务规格ports:# 端口配置列表- protocol: TCP# 协议类型TCPport:8080# 服务端口集群内部访问端口targetPort:8080# 目标端口Pod内部端口sessionAffinity: ClientIP# 会话亲和性ClientIP表示同一客户端的请求会转发到同一Pod为了保持session一致性selector:# Pod选择器app: golang-per-day-65# 匹配具有appgolang-per-day-65标签的Podversion: v2# 匹配具有versionv2标签的Podingress.yaml# golang_per_day_65 项目的 Ingress 配置# 用于管理外部访问集群内服务的路由规则apiVersion: networking.k8s.io/v1 kind: Ingress# Ingress 元数据配置metadata: name: golang_per_day_65-ingress# Ingress 资源名称namespace: codee_jun# 所属命名空间annotations:# Nginx Ingress 控制器特定配置# CORS 配置nginx.ingress.kubernetes.io/enable-cors:true# 启用跨域资源共享nginx.ingress.kubernetes.io/cors-allow-origin:https://golang_per_day_65.com# 允许的源nginx.ingress.kubernetes.io/cors-allow-methods:GET, POST, PUT, DELETE, OPTIONS# 允许的HTTP方法nginx.ingress.kubernetes.io/cors-allow-headers:DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization# 允许的请求头nginx.ingress.kubernetes.io/cors-allow-credentials:true# 如果需要凭证# 代理配置nginx.ingress.kubernetes.io/proxy-body-size:1024m# 允许的请求体大小# 会话亲和性配置nginx.ingress.kubernetes.io/affinity:cookie# 启用基于cookie的会话亲和性nginx.ingress.kubernetes.io/session-cookie-name:golang_per_day_65-session# 会话cookie名称nginx.ingress.kubernetes.io/session-cookie-expires:172800# cookie过期时间秒nginx.ingress.kubernetes.io/session-cookie-max-age:172800# cookie最大生存时间秒# Ingress 规格配置spec: ingressClassName: nginx# 使用的Ingress控制器类名# TLS 配置HTTPStls: - hosts: - golang_per_day_65.com# 域名secretName: codee-jun-tls-secret# tls证书# 路由规则rules: - host: golang_per_day_65.com# 域名http:# 协议paths:# 路径- path: /# 路径pathType: Prefix# 路径类型backend:# 后端service:# 服务name: golang-per-day-65# 服务名称port:# 服务端口number:8080# 服务端口号ingress.canary.yamlannotations:# Nginx Ingress 控制器特定配置nginx.ingress.kubernetes.io/canary:true# 启用金丝雀发布nginx.ingress.kubernetes.io/canary-weight:10# 金丝雀发布权重... rules: - host: golang_per_day_65.com# 域名http:# 协议paths:# 路径- path: /# 路径pathType: Prefix# 路径类型backend:# 后端service:# 服务name: golang-per-day-65-v2# 服务名称port:# 服务端口number:8080# 服务端口号按百分比发布annotations: nginx.ingress.kubernetes.io/canary:true# 启用金丝雀发布nginx.ingress.kubernetes.io/canary-weight:10#10%到新版本 # 金丝雀发布权重按 Headerannotations: nginx.ingress.kubernetes.io/canary:truenginx.ingress.kubernetes.io/canary-by-header:X-Canarynginx.ingress.kubernetes.io/canary-by-header-value:true// 请求示例curl-HX-Canary: truehttp://golang-per-day.com/version/v2按 Cookieannotations: nginx.ingress.kubernetes.io/canary:truenginx.ingress.kubernetes.io/canary-by-cookie:canary// 请求示例curl--cookiecanarytruehttp://golang-per-day.com/version/v2回滚kubectldelete-f ingress.canary.yaml五、蓝绿和金丝雀有什么区别蓝绿发布:是“瞬间大切换”就像换衣服脱掉旧的直接穿上新的。速度快但万一新衣服不合身那一刻所有人都看到了。金丝雀发布是“渐进式切换”就像试菜先给一两个人尝尝大家觉得好再给全餐厅的人上菜。总结起来金丝雀发布是用最小的代价在真实的战场上验证武器。友情链接:加班费计算器(vx小程序搜索“加班计”)*源码地址*留言给如果您喜欢这篇文章请您点赞、分享、亮爱心万分感谢

相关新闻