標準叢集: 為何 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 控制器服務,或未指派外部 IP 位址給 Ingress 控制器服務: 在標準叢集裡,第一次在區域中建立叢集時,會在 IBM Cloud 基礎架構帳戶中自動為您佈建該區域中的公用 VLAN 及專用 VLAN。 在該區域中,系統會根據您指定的公共 VLAN 申請一個公共可攜式子網,並根據您指定的私有 VLAN 申請一個私有可攜式子網。 對於 Red Hat OpenShift on IBM Cloud,VLAN 的限制為 40 個子網路。 如果群集在區域中的 VLAN 已經達到該限制,Ingress 子網域就會無法佈建,預設的公用 Ingress 控制器也無法佈建。 若要檢視 VLAN 具有的子網路數目,請從 IBM Cloud 基礎架構主控台 中選取 網路 > IP 管理 > VLAN。 按一下您用來建立叢集之 VLAN 的 VLAN 號碼。 檢閱 Subnets 區段,以查看是否有 40 個以上的子網路。

  • 如果一個區域沒有 Ingress 控制器服務: 建立 Ingress 控制器服務時,它們會自動分散在叢集裡的區域中。 建立 Ingress 控制器服務時,如果用來建立叢集的第一個區域的網路未備妥,則該區域的 Ingress 控制器服務可能會放置在不同的區域中。 可能在一個區域中建立兩個 Ingress 控制器服務,且未在起始區域中建立任何 Ingress 控制器服務。

解決沒有 IP 位址之 Ingress 控制器服務的 VLAN 問題,或解決沒有 Ingress 控制器服務之區域的多區域 Ingress 控制器服務問題。

解決 VLAN 問題

若要解決 Ingress 控制器服務沒有 IP 位址的 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 指令來查看具有 「已綁定叢集 」的子網,也只能看到您自己叢集的相關資訊。 請洽詢基礎架構帳戶擁有者,以確定子網路可供使用,且其他任何帳戶或團隊不在使用中。

  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