Ingress
NCP 将分别为具有 TLS 规范和不具有 TLS 规范的 Ingress 各创建一个第 7 层负载均衡器。您还可以创建 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 将被注释为出现错误。有关详细信息,请参见下面的“错误”部分。
- (NCP 3.0.0 和 3.0.1)规则按以下顺序应用:
- 同时指定了host和path且没有正则表达式匹配的规则。
- 同时指定了host和path且具有正则表达式匹配的规则(Ingresspath最长的规则优先)。
- 指定了host或path且没有正则表达式匹配的规则。
- 指定了host或path且具有正则表达式匹配的规则(Ingresspath最长的规则优先)。
- (NCP 3.0.2 及更高版本)规则按以下顺序应用:
- 指定了host和path的规则。
- 具有ExactpathType的规则。
- 具有PrefixpathType的规则。
- 具有RegexpathType的规则。
- 指定了host或path的规则。
- 具有ExactpathType的规则。
- 具有PrefixpathType的规则。
- 具有RegexpathType的规则。
注意:如果有多个路径与请求匹配,将优先采用最长的匹配路径。关于pathType:- ImplementationSpecific被当作Exact来处理。
- 具有不同pathType的两个匹配路径可以共存。
- 对于Prefix类型,/foo将匹配/foo/、/foo/bar,但不匹配/foo或 /foobar。要匹配/foo,请将Exact路径/foo添加到输入规则中。
- (如果您使用策略模式,则此内容适用。)如果创建的 TLS Ingress 具有默认后端,建议您将该默认后端设置为同时响应 HTTP 和 HTTPS 请求,原因如下:
- 如果存在主机与请求中的主机相匹配的 TLS Ingress(在 Kubernetes/PKS 用例的集群中,或在与 Project Pacific 用例相同的命名空间中),则负载均衡器将终止 TLS 并将 HTTP 请求发送到默认后端服务器。
- 如果不存在主机与请求中的主机相匹配的 TLS Ingress(在 Kubernetes/PKS 用例的集群中,或在与 Project Pacific 用例相同的命名空间中),则负载均衡器将重新加密 HTTPS 请求并将其发送到后端服务器。
- (NCP 3.0.0 和 3.0.1)不支持IngressClass资源。
- (NCP 3.0.2 及更高版本)支持IngressClass资源。
- (NCP 3.0.0 和 3.0.1)不支持pathType属性。
- (NCP 3.0.2 及更高版本)支持pathType属性。
- (NCP 3.0.2 及更高版本)支持 JWT(JSON Web 令牌)客户端身份验证。此功能需要使用 NSX-T Data Center 3.0.0 或更高版本。
从 Kubernetes 1.18 开始,
kubernetes.io/ingress.class
注释已弃用,并替换为 IngressClass 资源。要将 NSX-T 指定为 IngressClass 资源中的 Ingress 控制器,请将控制器参数设置为 k8s.io/nsx
。例如:kind: IngressClass metadata: name: nsx-lb annotations: ingressclass.kubernetes.io/is-default-class: true spec: controller: k8s.io/nsx
要指定第三方 Ingress 控制器,需要将控制器参数设置为
k8s.io/<controller name>
。例如:kind: IngressClass metadata: name: nginx-lb annotations: ingressclass.kubernetes.io/is-default-class: false spec: controller: k8s.io/ingress-nginx
要将 IngressClass 设置为集群的默认类型,请将注释
ingressclass.kubernetes.io/is-default-class
设置为 true
。请参阅上述示例。您不能同时使用
kubernetes.io/ingress.class
注释和 IngressClass 资源。功能注释
下表列出了 NCP 支持的注释:
注释 | 说明 | 支持的值 | 默认值 | NCP 版本 |
---|---|---|---|---|
kubernetes.io/ingress.allow-http | 除了启用 HTTPS 以外,还启用 HTTP 请求 | true、false | true | 2.5 和更高版本 |
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 和更高版本 |
nsx/loadbalancer | 将 Ingress 放置在专用负载均衡器上 | LoadBalancer CRD 的名称 | 无默认值 | 2.5.1 和更高版本 |
ncp/whitelist-source-range | 通过请求源 IP 限制 Ingress 访问权限 | 以逗号分隔的 CIDR、IP 地址或 IP 范围列表。 | 无默认值 | 3.0.0 和更高版本 |
ncp/ssl-mode | 为 Ingress 中的所有规则选择 SSL 模式 | offload、reencrypt、passthrough | offload | 3.0.1 和更高版本 |
ncp/jwt-alg | 确定用于验证 JWT 签名的算法。使用 ncp/jwt-secret 进行设置时,将启用 JWT 客户端身份验证。 | HS256、RS256 | 无默认值 | 3.0.2 和更高版本 |
ncp/jwt-secret | 指定包含用于签名验证的 JWT 密钥或公钥的 Kubernetes 密钥的名称。使用 ncp/jwt-alg 进行设置时,将启用 JWT 客户端身份验证。 | Kubernetes 密钥的名称 | 无默认值 | 3.0.2 和更高版本 |
ncp/jwt-token | 在 HTTP 请求中搜索 JWT 的其他位置。 | _arg_<param_name>、_cookie_<cookie_name> | 无默认值 | 3.0.2 和更高版本 |
ncp/jwt-realm | 指定在身份验证失败时返回的带 401 的领域标头。 | 表示领域的字符串 | 输入规则的主机名 | 3.0.2 和更高版本 |
ncp/jwt-preserve | 用于在身份验证成功后保留 JWT 并传递到后端的选项。 | true、false | true | 3.0.2 和更高版本 |
有关注释的详细信息:
- 路径正则表达式匹配
- 对于 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/use-regex启用或禁用 Ingresspath(而不是host)参数的正则表达式匹配。如果将该注释设置为false,将通过执行equals匹配来执行精确路径匹配。如果将该注释设置为true,将通过向路径添加字符串开头字符 (^) 和字符串结尾字符 ($) 来执行正则表达式匹配,以便整个请求 URI 与模式相匹配。请注意,使用OR运算符 (|) 时,请始终使用圆括号指定范围,以使 ^ 和 $ 应用于所有操作数。例如,path: /(tea|coffee|milk)。Ingress 规范示例: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: /.*相同的行为。
- 注释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注释中的参数。不支持已命名的捕获组和已命名的占位符。例如,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/whitelist-source-range:
- 设置后,仅当入站请求的源 IP 包含在此注释中时,才会接受该入站请求。否则,将丢弃流量。
- 您可以指定 CIDR、IP 地址和 IP 范围的组合。例如,1.1.1.1/24, 2.2.2.2, 3.3.3.3-4.4.4.4。
- YAML 示例:kind: Ingress metadata: name: cafe-ingress annotations: kubernetes.io/ingress.class: "nsx" ncp/whitelist-source-range: "192.168.128.0/17, 192.168.64.0-192.168.64.255, 192.168.16.32" spec: tls: - hosts: - cafe.example.com rules: - host: cafe.example.com http: paths: - path: /tea backend: serviceName: tea-svc servicePort: 80
- 关于注释ncp/ssl-mode:
- 此注释适用于 Ingress 中的所有规则,并且负载均衡器将在为这些规则选定的 SSL 模式下运行。注意:如果ncp/ssl-mode设置为reencrypt或passthrough,必须将kubernetes.io/ingress.allow-http设置为False。如果已设置ingress.kubernetes.io/rewrite-target、ncp/use-regex或ncp/whitelist-source-range注释,则无法将此注释设置为passthrough。
- 关于 JWT 客户端身份验证:
- 要为 Ingress 下的所有规则启用 JWT 客户端身份验证,需要同时为ncp/jwt-alg和ncp/jwt-secret设置有效的值。如果启用,则只有在具有有效的 JSON Web 令牌时,才会将入站 HTTP 流量传递到后端。否则,流量将被拒绝,并显示 401 状态。
- 此功能与以下注释不兼容:
- kubernetes.io/ingress.allow-http: true
- ncp/http-redirect: true
- ncp/ssl-mode: passthrough
- ncp/jwt-alg:
- 支持的对称算法:HS256
- 支持的非对称算法:RS256
- ncp/jwt-secret:
- 对称密钥或公共证书必须在 Kubernetes 密钥中配置,并且在此注释中指定的名称必须与 Ingress 位于相同的命名空间中。
- 对于对称算法,必须将密钥存储在jwt.key字段中。
- 对于非对称算法,必须将公共证书存储在tls.crt字段中。
- 如果对称密钥或公共证书未存储在上述位置中,或者如果存储在密钥中的数据无效,将禁用 JWT 客户端身份验证。
- ncp/jwt-token:
- 只能在此注释中配置一个项目。
- _arg_<param_name>:用于作为 URI 参数传入的 JWT。指定包含 JWT 的参数名称。
- _cookie_<cookie_name>:用于作为 Cookie 传入的 JWT。指定包含 JWT 的 Cookie 名称。
错误
错误作为注释添加到 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 规范中指定的密钥不存在,或者已为ncp/jwt-alg和ncp/jwt-secret添加注释,但在与 Ingress 所在的相同命名空间下找不到密钥。Ingress 将部分处于活动状态。要解决此错误,请创建缺少的密钥。请注意,警告出现在注释中后,不会在 Ingress 资源的生命周期内将其清除。
- ncp/warning.loadbalancer:INVALID_INGRESS此错误表示以下条件之一成立。Ingress 将处于非活动状态。要解决此错误,请删除 Ingress 并使用正确的规范重新创建。
- Ingress 规则与同一 Kubernetes 集群中的另一 Ingress 规则冲突。仅为具有相同匹配策略(即ncp/use-regex注释值相同)的 Ingress 确定冲突。
- kubernetes.io/ingress.allow-http注释设置为false,且 Ingress 没有 TLS 部分。
- ncp/http-redirect注释设置为true,且 Ingress 没有 TLS 部分。
- Ingress 规则未指定host和path。此类 Ingress 规则具有与 Ingress 默认后端相同的功能。请改用 Ingress 默认后端。
- Ingress 具有无法正确处理的 JWL 注释。例如:
- 缺少ncp/jwt-alg或ncp/jwt-secret。
- 为ncp/jwt-alg配置的算法不受支持。
- ncp/jwt-alg和ncp/jwt-secret配置了其他 HTTP 启用注释或 SSL 直通。