TG客服

阿里云ACK容器服务中Ingress Controller如何配置实现平滑的灰度发布

⏱️2026-05-28 09:00 👁️2

阿里云 ACK 容器服务 Ingress Controller 实现平滑灰度发布 🎉

在阿里云 ACK (Alibaba Cloud Container Service for Kubernetes) 容器服务中,利用 Ingress Controller 实现平滑的灰度发布,可以有效降低新版本上线带来的风险,确保用户体验。以下是一种常见的配置方法:

核心思路 💡

通过 Ingress 规则,结合 Kubernetes Service 的标签选择器,逐步将流量从旧版本导向新版本。可以使用 Nginx Ingress Controller 提供的权重 (weight) 或 Header Based Routing 等功能来实现。

详细步骤 🪜

  1. 部署新旧版本应用:
    • 为新版本应用 (例如:my-app:v2) 和旧版本应用 (例如:my-app:v1) 分别创建 Kubernetes Deployment。
    • 为每个 Deployment 创建对应的 Kubernetes Service。 关键步骤:为 Service 添加标签,例如:
      • version: v1 (旧版本 Service)
      • version: v2 (新版本 Service)
    • 确保你的应用可以通过Service访问。
  2. 创建 Ingress 规则 (使用 Nginx Ingress Controller):
    • 使用 nginx.ingress.kubernetes.io/canary: "true" 来标记一个Ingress是灰度发布的Ingress。
    • 基于权重的灰度发布 (Weight-based Canary):

      使用 nginx.ingress.kubernetes.io/canary-weight: "X" 注解来设置流量权重。X 是一个 0 到 100 之间的整数,表示导向新版本的流量百分比。

      示例:

                  
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: my-app-ingress
        annotations:
          nginx.ingress.kubernetes.io/canary: "true"
          nginx.ingress.kubernetes.io/canary-weight: "20"  # 20% 流量导向新版本
      spec:
        rules:
        - host: myapp.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v2-service # 新版本 Service
                  port:
                    number: 80
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v1-service # 旧版本 Service
                  port:
                    number: 80
                  
                

      这个配置会将 20% 的流量路由到 my-app-v2-service (新版本),其余 80% 流量路由到 my-app-v1-service (旧版本)。

    • 基于 Header 的灰度发布 (Header-based Canary):

      可以使用 nginx.ingress.kubernetes.io/canary-by-header 注解,根据特定的 HTTP Header 值将流量导向新版本。

      示例:

                  
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: my-app-ingress
        annotations:
          nginx.ingress.kubernetes.io/canary: "true"
          nginx.ingress.kubernetes.io/canary-by-header: "version"  # 根据 "version" Header
          nginx.ingress.kubernetes.io/canary-by-header-value: "v2" # Header 值为 "v2"
      spec:
        rules:
        - host: myapp.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v2-service # 新版本 Service
                  port:
                    number: 80
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v1-service # 旧版本 Service
                  port:
                    number: 80
                  
                

      这个配置会将所有包含 version: v2 Header 的请求路由到 my-app-v2-service (新版本),其余请求路由到 my-app-v1-service (旧版本)。

    • 基于 Cookie 的灰度发布 (Cookie-based Canary):

      可以使用 nginx.ingress.kubernetes.io/canary-by-cookie 注解,根据特定的 HTTP Cookie 值将流量导向新版本。

                  
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: my-app-ingress
        annotations:
          nginx.ingress.kubernetes.io/canary: "true"
          nginx.ingress.kubernetes.io/canary-by-cookie: "user_group"
      spec:
        rules:
        - host: myapp.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v2-service # 新版本 Service
                port:
                    number: 80
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: my-app-v1-service # 旧版本 Service
                port:
                    number: 80
                  
                

      这个配置会将所有包含 user_group Cookie 的请求路由到 my-app-v2-service (新版本),其余请求路由到 my-app-v1-service (旧版本)。需要注意的是,你需要控制客户端的cookie。

  3. 逐步增加流量:
    • 如果是基于权重的灰度发布,逐步增加 nginx.ingress.kubernetes.io/canary-weight 的值,例如从 20% 增加到 50%,再到 80%,直至 100%。
    • 监控新版本应用的性能指标 (例如:CPU 使用率、内存使用率、响应时间、错误率),确保新版本运行稳定。
  4. 完成发布:
    • 当新版本稳定运行,并且所有流量都已导向新版本后,可以移除旧版本应用 (Deployment 和 Service)。
    • 删除 Ingress 规则中的旧版本 backend 配置,移除 nginx.ingress.kubernetes.io/canary: "true" 注解。

注意事项 ⚠️

  • 确保 Ingress Controller 已正确安装并配置在 ACK 集群中。
  • 根据实际需求选择合适的灰度发布策略 (权重、Header 或 Cookie)。
  • 密切监控新版本应用的性能指标,及时发现并解决问题。
  • 确保你的应用具有良好的可观测性,例如:日志、指标、链路追踪。
  • 可以使用阿里云的 ARMS (Application Real-Time Monitoring Service) 来监控应用性能。

通过以上步骤,你就可以在阿里云 ACK 容器服务中,利用 Ingress Controller 实现平滑、安全的灰度发布啦!🚀

国际云自助站点

我们提供一站式多云服务管理平台,支持阿里云国际、腾讯云国际、AWS(亚马逊云)和GCP(谷歌云)等主流国际云厂商。无论是新账户申请、余额充值,还是日常管理与监控,平台均可统一操作,大幅提升管理效率。同时支持余额预警、异常通知等推送功能,帮助用户实时掌握各云平台资源状态,防止因欠费导致业务中断。平台还支持多账号集中管理,适用于个人站长、跨境电商、开发团队等多场景使用需求,真正实现高效、安全、灵活的多云资源协同管理。

热门文章
更多>