您可以将 NCP 配置为支持第三方 Ingress 控制器。
编辑 ncp.ini 文件
您必须编辑配置文件 /var/vcap/data/jobs/ncp/xxxxxxxx/config/ncp.ini(其中 xxxxxxxx 是 BOSH 部署 ID)。该文件随后将被复制到 rootfs,并在每次 NCP 重新启动时由 NCP 使用。该文件必须在每个主节点上进行编辑。
重要说明: 对
ncp.ini 所做的更改不会跨 TKGI 集群更新进行保留。如果通过 TKGI 图标进行更改,然后更新 TKGI 部署,则对
ncp.ini 所做的更改将会丢失。
相关选项位于
nsx_v3 部分中。
- use_native_loadbalancer - 如果设置为 False,NCP 将不会处理类型为 Loadbalancer 更新的任何 Ingress 或服务,而不论其注释为何。此设置适用于整个 TKGI 集群。默认值为 True。
- default_ingress_class_nsx - 如果设置为 True,NCP 将成为默认 Ingress 控制器,并将处理带有 kubernetes.io/ingress.class: "nsx" 注释的 Ingress 和不带任何注释的 Ingress。如果设置为 False,NCP 将仅处理带有 kubernetes.io/ingress.class: "nsx" 注释的 Ingress。默认值为 True。
从 NCP 3.2.1 开始,已弃用 default_ingress_class_nsx。在解析 Ingress 类时,NCP 将查看以下内容:
- 注释
- ingressClass 对象
- 如果未指定注释并且 use_native_loadbalancer 为 True,NSX-LB 将处理 Ingress。否则,NSX-LB 不会处理 Ingress。
如果您希望 NCP 为 NGINX 控制器容器分配浮动 IP 并使用该浮动 IP 更新 Ingress 的状态,请执行以下操作:
- 在 ncp.ini 的 k8s 部分中,设置 ingress_mode=nat。
- 将注释 ncp/ingress-controller: "True" 添加到 NGINX Ingress 控制器容器中。
NCP 将使用 NGINX Ingress 控制器容器的浮动 IP 更新带有 kubernetes.io/ingress.class: "nginx" 注释的 Ingress 的状态。如果 default_ingress_class_nsx=False,NCP 还将使用 NGINX Ingress 控制器容器的浮动 IP 更新不带 kubernetes.io/ingress.class 注释的 Ingress 的状态。
注意:即使 NGINX Ingress 控制器容器不带
ncp/ingress-controller: "True" 注释,NCP 也会将上述 Ingress 的状态更新为
loadBalancer: {}。之后,Ingress 可能会陷入以下循环中:NGINX 控制器将 Ingress 状态更新为
loadBalancer: {ingress: [{ip: <IP>}]},然后 NCP 又将 Ingress 状态更新为
loadBalancer: {}。为了避免出现这种情况,请执行以下步骤:
- 如果 Ingress 控制器来自 https://github.com/kubernetes/ingress-nginx,
- 在 Ingress 控制器上,将 ingress-class 更改为 "nginx" 以外的内容。
- 如果存在带有 kubernetes.io/ingress-class: "nginx" 注释的 Ingress,请将注释更改为不同的值。
- 有关详细信息,请参见https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress。
- 如果 Ingress 控制器来自 https://github.com/nginxinc/kubernetes-ingress,
- 在 Ingress 控制器上,将 ingress-class 更改为 "nginx" 以外的内容。
- 如果存在带有 kubernetes.io/ingress-class: "nginx" 注释的 Ingress,请将注释更改为不同的值。
- 在 Ingress 控制器容器上,将 use-ingress-class-only 设置为 True。这将阻止此控制器更新不带 kubernetes.io/ingress-class 注释的 Ingress。
- 有关详细信息,请参见https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/multiple-ingress.md。
对于在 NAT 模式下部署的第三方 Ingress 控制器,您可以在 k8s 部分中修改 http_ingress_port 和 https_ingress_port 参数,以指定向 Ingress 控制器公开的 NAT 规则的自定义端口。
场景 1:NCP 处理 Ingress,但不是默认 Ingress 控制器。
请按照以下过程操作,让 NCP 处理
nsx 类 Ingress。
- 在每个主节点上编辑 ncp.ini 的 nsx_v3 部分。
- 将 default_ingress_class_nsx 设置为 False。
- 保留 use_native_loadbalancer 设置为默认值 True。
- 在每个主节点上重新启动 NCP。这可能会导致发生主节点故障切换。
- 在希望 NCP 处理的所有 Ingress 中添加 kubernetes.io/ingress.class: "nsx" 注释。
场景 2:NCP 是默认 Ingress 控制器。
请按照以下过程操作:
- 无需编辑 ncp.ini,但需确保每个 Ingress 均已添加注释。
- 要由 NCP 处理的 Ingress 应添加 kubernetes.io/ingress.class: "nsx" 注释。
尽管 NCP 将处理不带 kubernetes.io/ingress.class 注释的 Ingress,但在具有多个 Ingress 控制器的情况下,最佳做法是始终添加 kubernetes.io/ingress.class 注释,而不是依赖于默认 Ingress 控制器行为。
- 要由第三方 Ingress 控制器处理的 Ingress 必须使用这些 Ingress 控制器所需的值进行注释。
重要说明: 除非目标是将 NGINX 设为默认 Ingress 控制器,否则请勿使用
nginx 作为 NGINX Ingress 控制器,因为这会使 NGINX 成为默认 Ingress 控制器。
场景 3:NCP 不处理任何 Ingress,而不论其注释为何。
请按照以下过程操作:
- 在每个主节点上编辑 ncp.ini 的 nsx_v3 部分。
- 将 use_native_loadbalancer 设置为 False。default_ingress_class_nsx 的值现在无关紧要。
- 在每个主节点上重新启动 NCP。这可能会导致发生主节点故障切换。
请注意,NCP 也不会处理类型为 LoadBalancer 的服务