经典集群: 为什么 Ingress 控制器不部署在专区中?
基础架构提供者和版本:
- 经典
- Red Hat OpenShift 版本 4
运行 oc get svc -n openshift-ingress 时,一个或多个区域没有公共 Ingress 控制器。
- 未部署任何
router-default服务,或者该服务可能未分配外部 IP 地址。 例如,在单专区集群中,您可能会看到以下内容:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-default LoadBalancer 172.21.47.119 <none> 80:32637/TCP,443:31719/TCP 26m router-internal-default ClusterIP 172.21.51.30 <none> 80/TCP,443/TCP,1936/TCP 26m - 如果您具有多专区集群,那么一个专区没有 Ingress 控制器服务。 例如,在一个多区群集中,工作节点位于
dal10、dal12和dal13,您可能会看到dal10的router-default服务和dal12的router-dal12服务,但dal13没有router-dal13服务。 请注意,有工人节点的第一个区域中的 Ingress 控制器服务总是命名为router-default,而随后添加到群集的区域中的 Ingress 控制器服务的名称则为router-dal12。 您还可能会看到一个区域没有 Ingress 控制器服务,但另一个区域有两个或更多 Ingress 控制器服务。NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-default LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32637/TCP,443:31719/TCP 26m router-dal12 LoadBalancer 172.21.47.119 169.XX.XX.XX 80:32637/TCP,443:31719/TCP 26m router-internal-default ClusterIP 172.21.51.30 <none> 80/TCP,443/TCP,1936/TCP 26m
由于下列其中一个原因,路由器服务可能无法部署:
-
如果未部署 Ingress 控制器服务,或者未向 Ingress 控制器服务分配外部 IP 地址: 在标准集群中,首次在专区中创建集群时,将在 IBM Cloud 基础架构帐户中自动为您供应该专区中的公用 VLAN 和专用 VLAN。 在该区域中,系统会在您指定的公共 VLAN 上申请一个公共可移植子网,并在您指定的私有 VLAN 上申请一个私有可移植子网。 对于 Red Hat OpenShift on IBM Cloud,VLAN 限制为 40 个子网。 如果区域中的群集 VLAN 已达到该限制,则入口子域无法配置,默认公共入口控制器也无法配置。 要查看 VLAN 具有的子网数,请从 IBM Cloud 基础架构控制台 中选择 网络 > IP 管理 > VLAN。 单击用于创建集群的 VLAN 的 VLAN 编号。 查看子网部分以了解是否存在 40 个或更多子网。
-
如果一个专区没有 Ingress 控制器服务: 创建 Ingress 控制器服务时,这些服务会自动分布在集群中的专区中。 如果创建集群所使用的第一个区域的网络在创建 Ingress 控制器服务时未就绪,那么该区域的 Ingress 控制器服务可能位于另一个区域中。 可以在一个区域中创建两个 Ingress 控制器服务,而不会在初始区域中创建 Ingress 控制器服务。
解决没有 IP 地址的 Ingress 控制器服务的 VLAN 问题,或者解决没有 Ingress 控制器服务的区域的多专区 Ingress 控制器服务问题。
解决 VLAN 问题
要解决没有 IP 地址的 Ingress 控制器服务的 VLAN 问题:
方案 1:如果需要新的 VLAN,请 联系 IBM Cloud 支持部门 订购。 然后,创建集群以使用这一新的 VLAN。
方案 2:如果您还有另一个可用的 VLAN,可以在现有集群中 配置 VLAN 跨集群功能。 要检查VLAN生成树功能是否已启用,请使用 ibmcloud ks vlan spanning get --region REGION 命令。
然后,您可以向集群中添加新的工作节点,这些节点将使用另一个具有可用子网的VLAN。 每个区域至少创建两个工作节点。 现在,IP 地址可用,以便 Ingress 控制器可以自动部署。
选项 3:如果您未使用 VLAN 中的所有子网,可以通过将这些子网添加到集群中,在该 VLAN 上重复使用这些子网。
-
检查要使用的子网是否可用。 使用的基础架构帐户可能在多个 IBM Cloud 帐户之间共享。 在这种情况下,即使您运行
ibmcloud oc subnets命令来查看具有已绑定集群的子网,也只能看到您自己集群的相关信息。 请与 Infrastructure 帐户所有者核实以确保这些子网可用,并且未由其他任何帐户或团队使用。 -
使用
ibmcloud ks cluster subnet add命令使现有子网可供集群使用。 -
验证子网已成功创建并添加到集群。 子网 CIDR 在 Subnet VLANs 部分中列出。
ibmcloud ks cluster get --cluster CLUSTER_NAME --show-resources在此输出示例中,第二个子网已添加到
2234945公用 VLAN:Subnet VLANs VLAN ID Subnet CIDR Public User-managed 2234947 10.xxx.xx.xxx/29 false false 2234945 169.xx.xxx.xxx/29 true false 2234945 169.xx.xxx.xxx/29 true false -
请确认您添加的子网中的可移植 IP 地址已被用于集群中的 Ingress 控制器。 各项服务可能需要几分钟时间才能开始使用新子网中的可移植IP地址。
- 没有 Ingress 子域名:运行
ibmcloud ks cluster get --cluster CLUSTER以验证 Ingress 子域名是否已填写。 - Ingress 控制器未部署在区域中: 运行
oc get svc -n openshift-ingress以验证是否使用外部 IP 地址部署了缺少的 Ingress 控制器。
- 没有 Ingress 子域名:运行
解决多专区 Ingress 控制器服务部署问题
在未部署 Ingress 控制器服务的区域创建 Ingress 控制器服务。 如果最初在另一个区域中创建了重复的 Ingress 控制器服务,请 不要 删除该 Ingress 控制器服务。
-
在未部署 Ingress 控制器服务的区域为 Ingress 控制器服务创建 YAML 文件。 将 Ingress 控制器服务命名为
router-<zone>。apiVersion: v1 kind: Service metadata: annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public finalizers: - service.kubernetes.io/load-balancer-cleanup labels: app: router ingresscontroller.operator.openshift.io/owning-ingresscontroller: default router: router-default name: router-<zone> namespace: openshift-ingress spec: externalTrafficPolicy: Cluster selector: ingresscontroller.operator.openshift.io/deployment-ingresscontroller: default sessionAffinity: None type: LoadBalancer -
在您的集群中创建 Ingress 控制器服务。
oc create -f router-<zone>.yaml -
请验证是否在正确的区域中创建了 Ingress 控制器服务。 在输出中,获取 EXTERNAL IP 地址。
oc get svc router-<zone> -n openshift-ingress示例输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE router-dal12 LoadBalancer 172.21.57.132 169.XX.XX.XX 80/TCP,443/TCP,1940/TCP 3m -
获取缺省 Ingress 控制器的子域。 在输出中,查找格式化为类似于
<cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud的子域。ibmcloud ks nlb-dns ls -c CLUSTER_NAME_OR_ID -
向 Ingress 控制器的子域注册 Ingress 控制器服务的 IP 地址。
ibmcloud ks nlb-dns add -c CLUSTER_NAME_OR_ID --ip ROUTER_SVC_IP --nlb-host ROUTER_SUBDOMAIN