第三方 Ingress 控制器
您可以将 NCP 配置为支持第三方 Ingress 控制器。
编辑 ncp.ini 文件
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,请将注释更改为不同的值。
- 如果 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。
对于在 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 的服务