Ingress Nginx Operator

Overview

Ingress Nginx Operator 用于简化对 Ingress-Nginx 部署的高级管理。
该 Operator 简化了 Ingress-Nginx 实例的部署、配置和维护流程。其运行架构如下:Ingress-Nginx Operator 持续监控类型为 ingressnginxes.ingress-nginx.alauda.io(IngressNginx)的自定义资源,并自动为每个定义的 IngressNginx 资源创建对应的 Ingress-Nginx 实例。该架构允许直接操作 IngressNginx 自定义资源,以管理 Ingress-Nginx 的功能和行为。

Installation

  1. 进入 Administrator -> Marketplace -> OperatorHub
  2. 找到 Alauda build of Ingress NGINX Controller 并点击 Install

Configuration Via Web Console

我们通过用户界面提供基础配置选项,会为您生成对应的 YAML。对于更复杂的配置,您可以直接编辑 YAML。

完成 Ingress Nginx Operator 安装后:

  1. 进入 All Instances 标签页
  2. 点击 Create,在弹出的对话框中找到 IngressNginx 实例类型部分,点击 Create
字段说明YAML 路径
NameIngress Nginx 实例名称.metadata.name
NamespaceIngress Nginx 实例所在命名空间.metadata.namespace
ReplicaIngress Nginx 部署的副本数.spec.controller.replicaCount
ResourcesIngress Nginx 部署的资源请求和限制.spec.controller.resources
Service TypeIngress Nginx 的服务类型.spec.controller.service.type
Ingress Scope控制处理哪些命名空间的 Ingress 资源.spec.controller.scope.namespaceSelector,详见 ingress-sharding

Configuration Via YAML

默认情况下,Ingress Nginx Operator 会在与对应 IngressNginx 自定义资源相同的命名空间中部署 Ingress Nginx 实例。

Ingress Sharding

默认情况下,Ingress Nginx 会处理所有命名空间中显式指定其 IngressClass 名称或未指定任何 IngressClass 的 Ingress 资源。您可以使用 .controller.scope.namespaceSelector 限制实例只处理特定命名空间。例如,下面的 IngressNginx 资源 demo-scope 只处理带有标签 cpaas.io/project=demo 的命名空间中的 ingress。

创建处理所有命名空间中 Ingress 的 IngressNginx

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo-all
spec:
  controller:
    nodeSelector:
      kubernetes.io/os: linux
    replicaCount: 1

创建处理特定命名空间中 Ingress 的 IngressNginx

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo-scope
spec:
  controller:
    scope:
      namespaceSelector: 'cpaas.io/project=demo'
    nodeSelector:
      kubernetes.io/os: linux
    replicaCount: 1
  1. 格式为 $LABLE_KEY=$LABLE_VALUE

通过 LoadBalancer 暴露

默认情况下,Ingress Controller 配置为 ClusterIP 服务类型。若需通过 LoadBalancer 服务将 Ingress Controller 暴露到外部,请应用以下配置:

NOTE

LoadBalancer 服务需要外部负载均衡器集成(云提供商 LB 或 MetalLB)以分配外部 IP。

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    service:
      type: LoadBalancer

使用 MetalLB 指定 LoadBalancer 虚拟 IP:

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    service:
      type: LoadBalancer
      annotations:
        metallb.universe.tf/loadBalancerIPs: '192.168.2.2' # 期望的 VIP
        metallb.universe.tf/address-pool: 'pool-name' # MetalLB 地址池

高级 Controller 部署设置

配置网络模式、副本数、资源限制和节点选择:

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    hostNetwork: false
    replicaCount: 1
    nodeSelector:
      kubernetes.io/os: linux
    resources:
      limits:
        cpu: 200m
        memory: 256Mi
      requests:
        cpu: 200m
        memory: 256Mi

SSL 透传

启用 SSL 透传功能:

CAUTION

启用 SSL 透传后,TLS 会在后端终止,因此 L7 功能(如请求/响应头操作、WAF、HTTP 到 HTTPS 重定向、部分认证流程)不会应用于该流量。

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    extraArgs:
      enable-ssl-passthrough: ''

IPv4 和 IPv6 双栈支持

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    service:
      ipFamilyPolicy: PreferDualStack

Additional Resources

IngressNginx 资源的 .spec 字段直接对应 Ingress Nginx 的 Helm chart 值。更多配置选项请参考 官方 Ingress NGINX 文档

与官方 Chart 默认值的差异

  1. 默认情况下,每个 IngressNginx 实例会创建一个名称为 $ns-$name,controllerValue 为 ingress-nginx.cpaas.io/$ns-$name 的 IngressClass。可通过 .spec.ingressClassResource.name.spec.ingressClassResource.controllerValue 参数自定义这些值。
  2. 默认 .spec.controller.service.type 设置为 ClusterIP
  3. 默认 .spec.controller.watchIngressWithoutClass 设置为 true,表示控制器会处理未指定 IngressClass 的 Ingress 资源。