Nginx Ingress Controller 允许通过一个或多个 Ingress 对象进行流量管理,以配置直接将流量路由到 Pod 的 Nginx 部署。每个 Nginx Ingress 都包含多个注释,可以修改 Nginx 部署的行为。对于应用程序不同版本之间的流量管理,Nginx Ingress 控制器提供了通过引入第二个 Ingress 对象(称为金丝雀 Ingress)进行流量拆分的功能。你可以在官方的 金丝雀注释文档页面 上阅读更多关于这些金丝雀注释的信息。金丝雀 Ingress 忽略任何其他非金丝雀 nginx 注释。取而代之,它利用来自主要 Ingress 的注释设置。

Rollout 控制器始终会在金丝雀 Ingress 上设置以下两个注释(使用你配置的或默认的 nginx.ingress.kubernetes.io 前缀):

  • canary: true 表示这是金丝雀 Ingress
  • canary-weight: <num> 表示将发送到金丝雀的流量百分比。如果所有流量都路由到稳定服务,则设置为 0

你可以通过 additionalIngressAnnotations 字段提供其他注释以添加到金丝雀 Ingress,以启用按标头或 cookie 进行路由等功能。

与 Argo Rollouts 集成

使用 Nginx 发送版本间的分割流量需要在 Rollout 中有几个必需字段。以下是一个带有这些字段的 Rollout 示例:

 apiVersion: argoproj.io/v1alpha1
 kind: Rollout
 spec:
   ...
   strategy:
     canary:
       canaryService: canary-service  # 必需
       stableService: stable-service  # 必需
       trafficRouting:
         nginx:
           # 必须配置 stableIngress 或 stableIngress 中的一个,但不能同时配置。
           stableIngress: primary-ingress
           stableIngresses:
             - primary-ingress
             - secondary-ingress
             - tertiary-ingress
           annotationPrefix: customingress.nginx.ingress.kubernetes.io # 可选的
           additionalIngressAnnotations:   # 可选的
             canary-by-header: X-Canary
             canary-by-header-value: iwantsit

稳定 Ingress 字段是对 Rollout 同一命名空间中的 Ingress 的引用。Rollout 需要主要 Ingress 将流量路由到稳定服务。Rollout 通过确认 Ingress 是否具有与 Rollout 的 stableService 匹配的后端来检查该条件。

控制器通过创建具有金丝雀注释的第二个 Ingress 来将流量路由到金丝雀服务。随着 Rollout 经过金丝雀步骤,控制器更新金丝雀 Ingress 的金丝雀注释,以反映 Rollout 的所需状态,从而实现两个不同版本之间的流量分配。

由于 Nginx Ingress 控制器允许用户配置用于 Ingress 控制器的注释前缀,因此 Rollout 可以指定可选的 annotationPrefix 字段。如果设置了该字段,则金丝雀 Ingress 将使用该前缀而不是默认的 nginx.ingress.kubernetes.io

在一个服务中使用多个 NGINX Ingress 控制器与 Argo Rollouts

从 v1.5 开始,argo rollouts 支持多个 Nginx Ingress 控制器指向具有金丝雀部署的一个服务。如果只需要一个 Ingress 控制器,请使用现有的键 stableIngress。如果需要多个 Ingress 控制器(例如,分离内部和外部流量),请改用键 stableIngresses。它接受一个字符串值数组,这些字符串值是 Ingress 控制器的名称。金丝雀步骤在所有 Ingress 控制器上应用相同的方式。

在自定义 NGINX ingress 控制器名称中使用 Argo Rollouts

默认情况下,Argo Rollouts 控制器仅在具有 kubernetes.io/ingress.class 注释或 spec.ingressClassName 设置为 nginx 的 Ingress 上运行。用户可以通过指定 --nginx-ingress-classes 标志将控制器配置为在具有不同类名的 Ingress 上运行。如果 Argo Rollouts 控制器应该在多个值上运行,则用户可以多次列出 --nginx-ingress-classes 标志。这解决了集群具有在不同类值上运行的多个 Ingress 控制器的情况。

如果用户希望控制器在没有 kubernetes.io/ingress.class 注释或 spec.ingressClassName 的任何 Ingress 上运行,则用户应添加以下内容 --nginx-ingress-classes ''