標準叢集: 為何 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 控制器服務,或未指派外部 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 中的子網。
-
檢查要使用的子網路是否可用。 使用的基礎架構帳戶可能在多個 IBM Cloud 帳戶之間共用。 在這種情況下,即使您執行
ibmcloud oc subnets指令來查看具有 「已綁定叢集 」的子網,也只能看到您自己叢集的相關資訊。 請洽詢基礎架構帳戶擁有者,以確定子網路可供使用,且其他任何帳戶或團隊不在使用中。 -
使用
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