K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割与渐进式发布 ...

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

在现代微服务架构中,应用的更新和发布是一个高频且关键的操作。怎样在不影响用户体验的条件下,安全、平稳地将新版本应用推送到生产环境,是每个开发者和运维团队必须面临的挑战。灰度发布(Gray Release)作为一种渐进式发布策略,能够有用降低发布风险,而 Kubernetes 的 Ingress 注解功能为我们提供了一种简朴而强大的实现方式。
本文将带你深入浅出地了解怎样通过 Ingress 注解 在 Kubernetes 中实现灰度发布,并逐步把握流量分割、权重控制等焦点技巧。无论你是 Kubernetes 新手还是资深用户,都能从本文中得到实用的知识和操作指南。
什么是灰度发布?

灰度发布,也称为金丝雀发布(Canary Release),是一种渐进式的应用发布策略。它的焦点思想是:将新版本应用逐步推送给一小部分用户,观察其运行状态,确认无误后再逐步扩大范围,最终完成全量发布
相比于全量发布,灰度发布具有以下上风:

  • 降低风险:通过小范围验证,避免因新版本问题导致全局故障。
  • 快速回滚:如果新版本出现问题,可以快速切换回旧版本。
  • 用户体验优化:逐步发布可以减少对用户的影响。
Kubernetes 中的灰度发布实现方式

在 Kubernetes 中,灰度发布可以通过多种方式实现,例如:

  • Deployment + Service:手动控制流量切换。
  • Istio:通过服务网格实现高级流量管理。
  • Ingress 注解:通过 Nginx Ingress Controller 的注解功能实现流量分割。
本文将重点介绍 Ingress 注解 的实现方式,由于它简朴易用,且无需引入额外的组件。
通过 Ingress 注解实现灰度发布

Nginx Ingress Controller 提供了丰富的注解(Annotations),可以轻松实现灰度发布。以下是具体步骤:
1. 部署新旧版本应用

首先,我们需要部署两个版本的应用步伐:

  • 旧版本(v1):当前正在运行的生产版本。
  • 新版本(v2):待发布的新版本。
1.1 创建 v1 版本 Deployment 和 Service
  1. # v1 版本 Deployment
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: my-app-v1
  6. spec:
  7.   replicas: 3
  8.   template:
  9.     metadata:
  10.       labels:
  11.         app: my-app
  12.         version: v1
  13.     spec:
  14.       containers:
  15.       - name: my-app
  16.         image: my-app:v1
  17.         ports:
  18.         - containerPort: 80
  19. # v1 版本 Service
  20. apiVersion: v1
  21. kind: Service
  22. metadata:
  23.   name: my-app-v1
  24. spec:
  25.   selector:
  26.     app: my-app
  27.     version: v1
  28.   ports:
  29.   - port: 80
  30.     targetPort: 80
复制代码
1.2 创建 v2 版本 Deployment 和 Service
  1. # v2 版本 Deployment
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   name: my-app-v2
  6. spec:
  7.   replicas: 3
  8.   template:
  9.     metadata:
  10.       labels:
  11.         app: my-app
  12.         version: v2
  13.     spec:
  14.       containers:
  15.       - name: my-app
  16.         image: my-app:v2
  17.         ports:
  18.         - containerPort: 80
  19. # v2 版本 Service
  20. apiVersion: v1
  21. kind: Service
  22. metadata:
  23.   name: my-app-v2
  24. spec:
  25.   selector:
  26.     app: my-app
  27.     version: v2
  28.   ports:
  29.   - port: 80
  30.     targetPort: 80
复制代码
2. 配置 Ingress 实现灰度发布

通过 Nginx Ingress Controller 的 canary 注解,我们可以轻松实现流量分割。
2.1 创建 Ingress 资源

以下是一个示例配置:
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: my-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/canary: "true"  # 启用灰度发布
  7.     nginx.ingress.kubernetes.io/canary-weight: "10"  # 10% 流量到新版本
  8. spec:
  9.   rules:
  10.   - host: my-app.example.com
  11.     http:
  12.       paths:
  13.       - path: /
  14.         pathType: Prefix
  15.         backend:
  16.           service:
  17.             name: my-app-v2  # 新版本服务
  18.             port:
  19.               number: 80
  20.   - host: my-app.example.com
  21.     http:
  22.       paths:
  23.       - path: /
  24.         pathType: Prefix
  25.         backend:
  26.           service:
  27.             name: my-app-v1  # 旧版本服务
  28.             port:
  29.               number: 80
复制代码
2.2 关键注讲授明


  • nginx.ingress.kubernetes.io/canary: "true":启用灰度发布功能。
  • nginx.ingress.kubernetes.io/canary-weight: "10":将 10% 的流量分配到新版本(v2),剩余 90% 的流量继承利用旧版本(v1)。
3. 逐步调解流量权重

在灰度发布过程中,可以逐步增加新版本的流量比例。例如:

  • 初始阶段:10% 流量到 v2。
  • 验证通过后:将权重调解为 50%。
  • 最终阶段:将权重调解为 100%,完成全量发布。
只需修改 canary-weight 注解的值即可:
  1. nginx.ingress.kubernetes.io/canary-weight: "50"  # 50% 流量到新版本
复制代码
4. 监控与回滚

在灰度发布过程中,务必监控新版本的运行状态,包括:

  • 应用日记:查抄是否有错误或非常。
  • 性能指标:如响应时间、错误率等。
  • 用户反馈:网络用户的利用体验。
如果发现问题,可以通过调解 canary-weight 注解将流量切回旧版本:
  1. nginx.ingress.kubernetes.io/canary-weight: "0"  # 所有流量切回旧版本
复制代码
灰度发布的进阶用法

除了基于权重的流量分割,Nginx Ingress Controller 还支持以下灰度发布策略:
1. 基于请求头的流量分割

通过 nginx.ingress.kubernetes.io/canary-by-header 注解,将特定请求头的流量路由到新版本。
示例配置
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: my-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/canary: "true"
  7.     nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
  8.     nginx.ingress.kubernetes.io/canary-by-header-value: "true"
  9. spec:
  10.   rules:
  11.   - host: my-app.example.com
  12.     http:
  13.       paths:
  14.       - path: /
  15.         pathType: Prefix
  16.         backend:
  17.           service:
  18.             name: my-app-v2
  19.             port:
  20.               number: 80
  21.   - host: my-app.example.com
  22.     http:
  23.       paths:
  24.       - path: /
  25.         pathType: Prefix
  26.         backend:
  27.           service:
  28.             name: my-app-v1
  29.             port:
  30.               number: 80
复制代码
阐明


  • 当请求头中包含 X-Canary: true 时,流量会被路由到新版本(v2)。
  • 其他请求继承利用旧版本(v1)。
2. 基于 Cookie 的流量分割

通过 nginx.ingress.kubernetes.io/canary-by-cookie 注解,将特定 Cookie 的流量路由到新版本。
示例配置
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: my-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/canary: "true"
  7.     nginx.ingress.kubernetes.io/canary-by-cookie: "canary"
  8. spec:
  9.   rules:
  10.   - host: my-app.example.com
  11.     http:
  12.       paths:
  13.       - path: /
  14.         pathType: Prefix
  15.         backend:
  16.           service:
  17.             name: my-app-v2
  18.             port:
  19.               number: 80
  20.   - host: my-app.example.com
  21.     http:
  22.       paths:
  23.       - path: /
  24.         pathType: Prefix
  25.         backend:
  26.           service:
  27.             name: my-app-v1
  28.             port:
  29.               number: 80
复制代码
阐明


  • 当请求中包含 canary=true 的 Cookie 时,流量会被路由到新版本(v2)。
  • 其他请求继承利用旧版本(v1)。
3. 组合利用

可以同时利用权重、请求头和 Cookie 实现更复杂的灰度发布策略。
示例配置
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: my-app-ingress
  5.   annotations:
  6.     nginx.ingress.kubernetes.io/canary: "true"
  7.     nginx.ingress.kubernetes.io/canary-weight: "10"
  8.     nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"
  9.     nginx.ingress.kubernetes.io/canary-by-header-value: "true"
  10.     nginx.ingress.kubernetes.io/canary-by-cookie: "canary"
  11. spec:
  12.   rules:
  13.   - host: my-app.example.com
  14.     http:
  15.       paths:
  16.       - path: /
  17.         pathType: Prefix
  18.         backend:
  19.           service:
  20.             name: my-app-v2
  21.             port:
  22.               number: 80
  23.   - host: my-app.example.com
  24.     http:
  25.       paths:
  26.       - path: /
  27.         pathType: Prefix
  28.         backend:
  29.           service:
  30.             name: my-app-v1
  31.             port:
  32.               number: 80
复制代码
阐明


  • 10% 的流量会被分配到新版本(v2)。
  • 如果请求头中包含 X-Canary: true 或 Cookie 中包含 canary=true,流量也会被路由到新版本。
总结

通过 Kubernetes 的 Ingress 注解,我们可以轻松实现灰度发布,逐步将新版本应用推送给用户,降低发布风险。无论是基于权重的流量分割,还是基于请求头或 Cookie 的精细化控制,Nginx Ingress Controller 都提供了强大的支持。
灰度发布不仅是技术上的优化,更是对用户体验的尊重。希望本文能资助你把握这一紧张技能,让你的发布过程更加平稳、可靠!
立刻尝试:在你的 Kubernetes 集群中部署一个灰度发布示例,感受渐进式发布的魅力吧!如果你有任何问题或想法,接待在评论区留言讨论!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表