经典集群: 为什么 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 控制器服务。 例如,在一个多区群集中,工作节点位于 dal10dal12dal13,您可能会看到 dal10router-default 服务和 dal12router-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 上重复使用这些子网。

  1. 检查要使用的子网是否可用。 使用的基础架构帐户可能在多个 IBM Cloud 帐户之间共享。 在这种情况下,即使您运行 ibmcloud oc subnets 命令来查看具有已绑定集群的子网,也只能看到您自己集群的相关信息。 请与 Infrastructure 帐户所有者核实以确保这些子网可用,并且未由其他任何帐户或团队使用。

  2. 使用 ibmcloud ks cluster subnet add 命令使现有子网可供集群使用。

  3. 验证子网已成功创建并添加到集群。 子网 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
    
  4. 请确认您添加的子网中的可移植 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 控制器服务。

  1. 在未部署 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
    
  2. 在您的集群中创建 Ingress 控制器服务。

    oc create -f router-<zone>.yaml
    
  3. 请验证是否在正确的区域中创建了 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
    
  4. 获取缺省 Ingress 控制器的子域。 在输出中,查找格式化为类似于 <cluster_name>-<random_hash>-0000.<region>.containers.appdomain.cloud 的子域。

    ibmcloud ks nlb-dns ls -c CLUSTER_NAME_OR_ID
    
  5. 向 Ingress 控制器的子域注册 Ingress 控制器服务的 IP 地址。

    ibmcloud ks nlb-dns add -c CLUSTER_NAME_OR_ID --ip ROUTER_SVC_IP --nlb-host ROUTER_SUBDOMAIN