写点什么

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

  • 2025-04-29
    福建
  • 本文字数:3661 字

    阅读完需:约 12 分钟

在现代微服务架构中,应用的更新和发布是一个高频且关键的操作。如何在不影响用户体验的前提下,安全、平稳地将新版本应用推送到生产环境,是每个开发者和运维团队必须面对的挑战。灰度发布(Gray Release)作为一种渐进式发布策略,能够有效降低发布风险,而 Kubernetes 的 Ingress 注解功能为我们提供了一种简单而强大的实现方式。


本文将带你深入浅出地了解如何通过 Ingress 注解 在 Kubernetes 中实现灰度发布,并逐步掌握流量分割、权重控制等核心技巧。无论你是 Kubernetes 新手还是资深用户,都能从本文中获得实用的知识和操作指南。


什么是灰度发布?


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

相比于全量发布,灰度发布具有以下优势:


  1. 降低风险:通过小范围验证,避免因新版本问题导致全局故障。

  2. 快速回滚:如果新版本出现问题,可以快速切换回旧版本。

  3. 用户体验优化:逐步发布可以减少对用户的影响。


Kubernetes 中的灰度发布实现方式


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

  • Deployment + Service:手动控制流量切换。

  • Istio:通过服务网格实现高级流量管理。

  • Ingress 注解:通过 Nginx Ingress Controller 的注解功能实现流量分割。

本文将重点介绍 Ingress 注解 的实现方式,因为它简单易用,且无需引入额外的组件。


通过 Ingress 注解实现灰度发布


Nginx Ingress Controller 提供了丰富的注解(Annotations),可以轻松实现灰度发布。以下是具体步骤:


1. 部署新旧版本应用


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


  • 旧版本(v1):当前正在运行的生产版本。

  • 新版本(v2):待发布的新版本。


1.1 创建 v1 版本 Deployment 和 Service


# v1 版本 DeploymentapiVersion: apps/v1kind: Deploymentmetadata:  name: my-app-v1spec:  replicas: 3  template:    metadata:      labels:        app: my-app        version: v1    spec:      containers:      - name: my-app        image: my-app:v1        ports:        - containerPort: 80
# v1 版本 ServiceapiVersion: v1kind: Servicemetadata: name: my-app-v1spec: selector: app: my-app version: v1 ports: - port: 80 targetPort: 80
复制代码


1.2 创建 v2 版本 Deployment 和 Service


# v2 版本 DeploymentapiVersion: apps/v1kind: Deploymentmetadata:  name: my-app-v2spec:  replicas: 3  template:    metadata:      labels:        app: my-app        version: v2    spec:      containers:      - name: my-app        image: my-app:v2        ports:        - containerPort: 80
# v2 版本 ServiceapiVersion: v1kind: Servicemetadata: name: my-app-v2spec: selector: app: my-app version: v2 ports: - port: 80 targetPort: 80
复制代码


2. 配置 Ingress 实现灰度发布


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


2.1 创建 Ingress 资源


以下是一个示例配置:


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: my-app-ingress  annotations:    nginx.ingress.kubernetes.io/canary: "true"  # 启用灰度发布    nginx.ingress.kubernetes.io/canary-weight: "10"  # 10% 流量到新版本spec:  rules:  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v2  # 新版本服务            port:              number: 80  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v1  # 旧版本服务            port:              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 注解的值即可:


nginx.ingress.kubernetes.io/canary-weight: "50"  # 50% 流量到新版本
复制代码


4. 监控与回滚


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


  • 应用日志:检查是否有错误或异常。

  • 性能指标:如响应时间、错误率等。

  • 用户反馈:收集用户的使用体验。


如果发现问题,可以通过调整 canary-weight 注解将流量切回旧版本:


nginx.ingress.kubernetes.io/canary-weight: "0"  # 所有流量切回旧版本
复制代码


灰度发布的进阶用法


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


1. 基于请求头的流量分割


通过 nginx.ingress.kubernetes.io/canary-by-header 注解,将特定请求头的流量路由到新版本。


示例配置


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: my-app-ingress  annotations:    nginx.ingress.kubernetes.io/canary: "true"    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"    nginx.ingress.kubernetes.io/canary-by-header-value: "true"spec:  rules:  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v2            port:              number: 80  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v1            port:              number: 80
复制代码


说明


  • 当请求头中包含 X-Canary: true 时,流量会被路由到新版本(v2)。

  • 其他请求继续使用旧版本(v1)。


2. 基于 Cookie 的流量分割


通过 nginx.ingress.kubernetes.io/canary-by-cookie 注解,将特定 Cookie 的流量路由到新版本。


示例配置


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: my-app-ingress  annotations:    nginx.ingress.kubernetes.io/canary: "true"    nginx.ingress.kubernetes.io/canary-by-cookie: "canary"spec:  rules:  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v2            port:              number: 80  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v1            port:              number: 80
复制代码


说明

  • 当请求中包含 canary=true 的 Cookie 时,流量会被路由到新版本(v2)。

  • 其他请求继续使用旧版本(v1)。


3. 组合使用


可以同时使用权重、请求头和 Cookie 实现更复杂的灰度发布策略。


示例配置


apiVersion: networking.k8s.io/v1kind: Ingressmetadata:  name: my-app-ingress  annotations:    nginx.ingress.kubernetes.io/canary: "true"    nginx.ingress.kubernetes.io/canary-weight: "10"    nginx.ingress.kubernetes.io/canary-by-header: "X-Canary"    nginx.ingress.kubernetes.io/canary-by-header-value: "true"    nginx.ingress.kubernetes.io/canary-by-cookie: "canary"spec:  rules:  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v2            port:              number: 80  - host: my-app.example.com    http:      paths:      - path: /        pathType: Prefix        backend:          service:            name: my-app-v1            port:              number: 80
复制代码


说明


  • 10% 的流量会被分配到新版本(v2)。

  • 如果请求头中包含 X-Canary: true 或 Cookie 中包含 canary=true,流量也会被路由到新版本。


总结


通过 Kubernetes 的 Ingress 注解,我们可以轻松实现灰度发布,逐步将新版本应用推送给用户,降低发布风险。无论是基于权重的流量分割,还是基于请求头或 Cookie 的精细化控制,Nginx Ingress Controller 都提供了强大的支持。


灰度发布不仅是技术上的优化,更是对用户体验的尊重。希望本文能帮助你掌握这一重要技能,让你的发布过程更加平稳、可靠!


文章转载自:dashery

原文链接:https://www.cnblogs.com/ydswin/p/18683278

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
K8s 灰度发布实战:通过 Ingress 注解轻松实现流量分割与渐进式发布_Kubernetes_电子尖叫食人鱼_InfoQ写作社区