Ingress Nginx Operator

概述

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

安装

  1. 前往 Administrator -> Marketplace -> OperatorHub
  2. 找到 Alauda build of Ingress NGINX Controller,然后点击 Install

通过 Web 控制台进行配置

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

完成 Ingress Nginx Operator 的安装后:

  1. 前往 All Instances 选项卡
  2. 点击 Create,然后在显示的对话框中找到 IngressNginx 实例类型部分,并点击 Create
字段描述YAML 路径
名称Ingress Nginx 实例的名称.metadata.name
命名空间Ingress Nginx 实例的命名空间.metadata.namespace
从节点Ingress Nginx 部署的副本数.spec.controller.replicaCount
资源Ingress Nginx 部署的资源请求和限制.spec.controller.resources
服务类型Ingress Nginx 的服务类型.spec.controller.service.type
Ingress 范围控制处理哪些命名空间中的 Ingress 资源.spec.controller.scope.namespaceSelector,参见 ingress-sharding

通过 YAML 进行配置

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

Ingress 分片

默认情况下,对于显式指定其 IngressClass 名称或未指定任何 IngressClass 的 Ingress,Ingress Nginx 会处理所有命名空间中的 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 VIP:

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' # Desired VIP
        metallb.universe.tf/address-pool: 'pool-name' # MetalLB address pool

高级 Controller 部署设置

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

apiVersion: ingress-nginx.alauda.io/v1
kind: IngressNginx
metadata:
  name: demo
spec:
  controller:
    hostNetwork: false
    replicaCount: 1
    nodeSelector:
      dedicated: ingress
    tolerations:
      - key: dedicated
        operator: Equal
        value: ingress
        effect: NoSchedule
    resources:
      limits:
        cpu: 200m
        memory: 256Mi
      requests:
        cpu: 200m
        memory: 256Mi

SSL 直通

启用 SSL 直通功能:

CAUTION

使用 SSL 直通时,TLS 会在后端终止,因此 L7 功能(例如请求/响应标头操作、WAF、HTTP 到 HTTPS 重定向及某些身份验证流程)不会在 Controller 处应用于此类流量。

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

其他资源

IngressNginx 资源的 .spec 字段直接对应 Ingress Nginx 的 Helm Chart values。有关其他配置选项,请参阅 Ingress NGINX 官方文档。

与官方 Chart 的默认值差异

  1. 默认情况下,每个 IngressNginx 实例都会创建一个 IngressClass,其名称为 $ns-$name,controllerValue 为 ingress-nginx.cpaas.io/$ns-$name。可以使用 .spec.controller.ingressClassResource.name 和 .spec.controller.ingressClassResource.controllerValue 参数自定义这些值。
  2. 默认情况下,.spec.controller.service.type 设置为 ClusterIP。
  3. 默认情况下,.spec.controller.watchIngressWithoutClass 设置为 true,这意味着 Controller 会处理未指定 IngressClass 的 Ingress 资源。