NCP 将分别为具有 TLS 规范和不具有 TLS 规范的 Ingress 各创建一个第 7 层负载均衡器。从 NCP 2.5.1 开始,您还可以创建 CRD (CustomResourceDefinition) 来处理 Ingress 缩放。

请注意以下事项:
  • 所有 Ingress 都将获得单个 IP 地址。
  • ncp.ini[nsx_v3] 部分中的 external_ip_pools 选项指定的外部 IP 池为 Ingress 资源分配 IP 地址。将在此 IP 地址以及 HTTP 端口 80 和 HTTPS 端口 443 上公开负载均衡器。
  • ncp.ini[nsx_v3] 部分中的 external_ip_pools_lb 选项指定的外部 IP 池为 Ingress 资源分配 IP 地址。如果 external_ip_pools_lb 选项不存在,则使用 external_ip_pools 指定的池。将在此 IP 地址以及 HTTP 端口 80 和 HTTPS 端口 443 上公开负载均衡器。
  • 可以通过更改配置并重新启动 NCP 来更改为不同的 IP 池。
  • 可以为 TLS 指定默认证书。有关生成证书并将证书挂载到 NCP pod 的信息,请参见下文。
  • 将在 HTTP 虚拟服务器(端口 80)上托管不具有 TLS 规范的 Ingress。
  • 将在 HTTPS 虚拟服务器(端口 443)上托管具有 TLS 规范的 Ingress。负载均衡器将充当 SSL 服务器并终止客户端 SSL 连接。
  • 支持通过添加或移除 TLS 部分来修改 Ingress。从 Ingress 规范中移除 tls 密钥后,Ingress 规则将从 HTTPS 虚拟服务器(端口 443)传输到 HTTP 虚拟服务器(端口 80)。同样,将 tls 密钥添加到 Ingress 规范后,Ingress 规则将从 HTTP 虚拟服务器(端口 80)传输到 HTTPS 虚拟服务器(端口 443)。
  • 如果单个集群的 Ingress 定义中存在重复的规则,则只会应用第一个规则。具有重复规则的其他 Ingress 将被注释为出现错误。例如,如果创建两个具有相同 hostpath 的 Ingress,其中一个 Ingress 为 TLS,另一个为非 TLS,并且 kubernetes.io/ingress.allow-httpfalse,则两个规则将在不同的虚拟服务器上创建,并且不会相互冲突。但是,如果 kubernetes.io/ingress.allow-httptrue,则稍后应用的 Ingress 将被注释为出现错误。有关详细信息,请参见下面的“错误”部分。
  • 每个集群只支持一个具有默认后端的 Ingress。不匹配任何 Ingress 规则的流量将被转发到默认后端。
  • 如果存在多个具有默认后端的 Ingress,则只会配置第一个输入。其他 Ingress 将被注释为出现错误。有关详细信息,请参见下面的“错误”部分。
  • 规则将按以下顺序应用:
    1. 同时指定了 hostpath 且没有正则表达式匹配的规则。
    2. 同时指定了 hostpath 且具有正则表达式匹配的规则(Ingress path 最长的规则优先)。
    3. 指定了 hostpath 且没有正则表达式匹配的规则。
    4. 指定了 hostpath 且具有正则表达式匹配的规则(Ingress path 最长的规则优先)。

功能注释

下表列出了 NCP 支持的注释:
注释 说明 支持的值 默认值 NCP 版本
kubernetes.io/ingress.allow-http 除了启用 HTTPS 以外,还启用 HTTP 请求 true、false true 2.5、2.5.1
ncp/use-regex 启用路径模式匹配 true、false false 2.5.1
ingress.kubernetes.io/rewrite-target 重写入站请求的路径
  • (NCP 2.5、2.5.1)以“/”开头的路径
  • (NCP 2.5.1 和 NSX-T 2.5.1)以正则表达式指定的路径,其中捕获的组使用编号占位符,例如 /$1
无默认值 请参见“支持的值”列
ncp/http-redirect 将 HTTP 请求重定向到 HTTPS true、false false 2.5.1
kubernetes.io/ingress-class 指示负责此 Ingress 的 Ingress 控制器 nsx、nginx 等 nsx 2.5、2.5.1
nsx/loadbalancer 将 Ingress 放置在专用负载均衡器上 LoadBalancer CRD 的名称 无默认值 2.5.1
有关注释的详细信息:
  • 路径正则表达式匹配
    • 对于 NCP 2.5.0 及更低版本

      在 NCP 2.5.0 及更低版本中,将使用正则表达式字符“.”和“*”自动启用所有子路径匹配。例如,路径 /coffee/.* 与后跟零个、一个或多个字符的 /coffee/ 匹配,例如与 /coffee//coffee/a/coffee/b 匹配,但不与 /coffee/coffeecup/coffeecup/a 匹配。

      Ingress 规范示例:
      kind: Ingress
      metadata:
        name: cafe-ingress
      spec:
        rules:
        - http:
            paths:
            - path: /coffee/.*    #Matches /coffee/, /coffee/a but NOT /coffee, /coffeecup, etc.
              backend:
                serviceName: coffee-svc
                servicePort: 80
    • 对于 NCP 2.5.1
      从 NCP 2.5.1 开始,您可以使用注释 ncp/use-regex 启用或禁用 Ingress path(而不是 host)参数的正则表达式匹配。如果将该注释设置为 false,将通过执行 equals 匹配来执行精确路径匹配。如果将该注释设置为 true,将通过向路径添加字符串开头字符 (^) 和字符串结尾字符 ($) 来执行正则表达式匹配,以便整个请求 URI 与模式相匹配。请注意,使用 OR 运算符 (|) 时,请始终使用圆括号指定范围,以使 ^ 和 $ 应用于所有操作数。例如, path: /(tea|coffee|milk)。Ingress 规范示例:
      apiVersion: extensions/v1beta1
      kind: Ingress
      metadata:
        name: cafe-ingress
        annotations:
          kubernetes.io/ingress.class: "nsx"
          ncp/use-regex: "true"
      spec:
        rules:
        - host: cafe.example.com
          http:
            paths:
            - path: /tea/.*
              backend:
                serviceName: tea-svc
                servicePort: 80
    • 在将 NCP 升级到 2.5.1 之前更新 Ingress
      仅当您的 Ingress 要求使用字符“.”和“*”进行所有子路径匹配时,才需要这样做。
      1. 更新 Ingress 以包含注释 ncp/use-regex: true
      2. 对于所有子路径匹配,如果您具有诸如 /coffee/*/* 之类的路径,请将其更改为 /coffee/.*/.*

        /coffee/.* 将与 /coffee//coffee/a/coffee/b/coffee/a/b 等匹配。/.* 将与 /coffee/tea/coffee/a 等匹配。省略该路径将产生与 path: /.* 相同的行为。

  • 注释 ingress.kubernetes.io/rewrite-target 的示例:
    kind: Ingress
    metadata:
      name: cafe-ingress
      annotations:
        ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: cafe.example.com
        http:
          paths:
          - path: /tea
            backend:
              serviceName: tea-svc
              servicePort: 80
          - path: /coffee
            backend:
              serviceName: coffee-svc
              servicePort: 80

    路径 /tea/coffee 将在 URL 发送到后端服务之前重写到 /

    从 NCP 2.5.1 和 NSX-T 2.5.1 开始,如果使用正则表达式指定 path,则捕获的组将以 $1、$2 等形式保存在编号占位符中。这些占位符可用作 ingress.kubernetes.io/rewrite-target 注释中的参数。不支持已命名的捕获组和已命名的占位符。例如,
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: cafe-ingress
      annotations:
        kubernetes.io/ingress.class: "nsx"
        ncp/use-regex: "true"
        #/tea/cup will be rewritten to /cup before sending request to endpoint
        ingress.kubernetes.io/rewrite-target: /$1
    spec:
      rules:
      - host: cafe.example.com
        http:
          paths:
          - path: /tea/(.*)
            backend:
              serviceName: tea-svc
              servicePort: 80
  • 关于注释 kubernetes.io/ingress.allow-http
    • 如果将该注释设置为 false,则将为 HTTPS 虚拟服务器创建规则。
    • 如果将该注释设置为 true 或缺少该注释,则将同时为 HTTP 和 HTTPS 虚拟服务器创建规则。请注意,仅当 Ingress 规范中存在 TLS 部分时,才会创建 HTTPS 规则。
  • 关于注释 ncp/http-redirect
    • 如果将该注释设置为 false,则不会将指向 HTTP 虚拟服务器的入站 HTTP 流量(端口 80)重定向到 HTTPS 虚拟服务器。
    • 如果将该注释设置为 true,则会将指向 HTTP 虚拟服务器的入站 HTTP 流量(端口 80)重定向到 HTTPS 虚拟服务器(端口 443)。

    仅当存在 TLS 部分时,该注释才有效。该注释优先于 kubernetes.io/ingress.allow-http。将该注释设置为 true 时,无论如何设置 kubernetes.io/ingress.allow-http,它都会将匹配的 HTTP 流量定向到 HTTPS。

  • 关于注释 kubernetes.io/ingress-class
    • 如果其值为 nsx,则将由 NCP 处理此 Ingress。如果指定了任何其他值,则 NCP 将忽略此 Ingress。有关详细信息,请参见第三方 Ingress 控制器
  • 有关注释 nsx/loadbalancer 的详细信息,请参见用于处理 Ingress 缩放的 LoadBalancer CRD

错误

错误作为注释添加到 Ingress 资源中。错误键为 ncp/error.loadbalancer,警告键为 ncp/warning.loadbalancer。可能的错误和警告包括:
  • ncp/error.loadbalancer: DEFAULT_BACKEND_IN_USE

    该错误表示具有默认后端的 Ingress 已存在。Ingress 将处于非活动状态。如果发生以下几种情况,则会出现此错误:(1) 此 Ingress 用于 HTTP,并且存在另一个用于 HTTP 且具有默认后端的 Ingress;(2) 此 Ingress 用于 HTTPS,并且存在另一个用于 HTTPS 且具有默认后端的 Ingress;或 (3) 此 Ingress 用于 HTTP 和 HTTPS,并且存在另一个用于 HTTP 和 HTTPS 且具有默认后端的 Ingress。要解决此错误,请删除 Ingress 并使用正确的规范重新创建。

  • ncp/warning.loadbalancer: SECRET_NOT_FOUND

    该错误表示 Ingress 规范中指定的密钥不存在。Ingress 将部分处于活动状态。要解决此错误,请创建缺少的密钥。请注意,警告出现在注释中后,不会在 Ingress 资源的生命周期内将其清除。

  • ncp/warning.loadbalancer: INVALID_INGRESS
    此错误表示以下条件之一成立。Ingress 将处于非活动状态。要解决此错误,请删除 Ingress 并使用正确的规范重新创建。
    • Ingress 规则与同一 Kubernetes 集群中的另一 Ingress 规则冲突。从 NCP 2.5.1 开始,仅为具有相同匹配策略(即 ncp/use-regex 注释值相同)的 Ingress 确定冲突。
    • kubernetes.io/ingress.allow-http 注释设置为 false,且 Ingress 没有 TLS 部分。
    • ncp/http-redirect 注释设置为 true,且 Ingress 没有 TLS 部分。
    • Ingress 规则未指定 hostpath。此类 Ingress 规则具有与 Ingress 默认后端相同的功能。请改用 Ingress 默认后端。