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 将被注释为出现错误。例如,如果创建两个具有相同 host 和 path 的 Ingress,其中一个 Ingress 为 TLS,另一个为非 TLS,并且 kubernetes.io/ingress.allow-http 为 false,则两个规则将在不同的虚拟服务器上创建,并且不会相互冲突。但是,如果 kubernetes.io/ingress.allow-http 为 true,则稍后应用的 Ingress 将被注释为出现错误。有关详细信息,请参见下面的“错误”部分。
- 每个集群只支持一个具有默认后端的 Ingress。不匹配任何 Ingress 规则的流量将被转发到默认后端。
- 如果存在多个具有默认后端的 Ingress,则只会配置第一个输入。其他 Ingress 将被注释为出现错误。有关详细信息,请参见下面的“错误”部分。
- 规则将按以下顺序应用:
- 同时指定了 host 和 path 且没有正则表达式匹配的规则。
- 同时指定了 host 和 path 且具有正则表达式匹配的规则(Ingress path 最长的规则优先)。
- 指定了 host 或 path 且没有正则表达式匹配的规则。
- 指定了 host 或 path 且具有正则表达式匹配的规则(Ingress path 最长的规则优先)。
功能注释
| 注释 | 说明 | 支持的值 | 默认值 | 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/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 要求使用字符“.”和“*”进行所有子路径匹配时,才需要这样做。
- 更新 Ingress 以包含注释 ncp/use-regex: true。
- 对于所有子路径匹配,如果您具有诸如 /coffee/* 或 /* 之类的路径,请将其更改为 /coffee/.* 和 /.*。
/coffee/.* 将与 /coffee/、/coffee/a、/coffee/b、/coffee/a/b 等匹配。/.* 将与 /coffee、/tea、/coffee/a 等匹配。省略该路径将产生与 path: /.* 相同的行为。
- 对于 NCP 2.5.0 及更低版本
- 注释 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。
错误
- 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 规则未指定 host 和 path。此类 Ingress 规则具有与 Ingress 默认后端相同的功能。请改用 Ingress 默认后端。