私有 VPC 群集:為什麼我無法連線到 OpenShift 主控台?

排除在只有私人服務端點的群集上連線到 OpenShift 主控台的問題。

本故障排除指南中的資訊適用於只有私人服務端點的 VPC 群集。

1.瞭解群集連線流程

下圖顯示具有私有服務端點的 VPC 群集連接至 OpenShift Web 主控台的連接流程。 本圖表假定群集具有預設的 OAuth 設定。 檢閱此圖表和以下說明,以便更好地瞭解可能需要的故障排除步驟。

OpenShift
OpenShift 具有私有服務端點的 VPC 群集的 Web 主控台連接流程 具有私有服務端點的 VPC 群集的 Web 主控台連接流程。

  1. 網頁瀏覽器透過 VPN 連線至群集主 API 伺服器。 會交換已簽署的憑證,並透過重定向指示網頁瀏覽器連線至 OpenShift 主控台負載平衡器。
  2. (a) Web 瀏覽器透過 VPN 連線到 OpenShift 主控台負載平衡器,該負載平衡器會暴露 OpenShift 主控台。(b) 此請求傳送至兩個 openshift-console pod 之一。
  3. openshift-console pod 連線至群集主控 OAuth 伺服器連接埠,檢查連線是否已通過認證。 如果請求已經過驗證,則與 OpenShift 網路主控台的連線完成,可以存取網路主控台。 如果請求未經認證,使用者會被重定向到群集主控端上的群集 OAuth 服務。
  4. Web 瀏覽器透過 VPN 連線至群集的 OAuth 伺服器連接埠,將用戶端重定向至 IAM。
  5. Web 瀏覽器透過公共網路連線至 IAM。 使用者輸入密碼,必要時還要輸入 2FA 驗證。 如果此步驟成功,使用者會重新導向回叢集的 OAuth 伺服器。
  6. Web 瀏覽器透過 VPN 再次連線至群集的 OAuth 伺服器連接埠。 連線會重新導向回 OpenShift 主控台負載平衡器。
  7. 網頁瀏覽器透過 VPN 連線到 OpenShift 主控台負載平衡器,主控台負載平衡器會揭露 OpenShift 主控台。 此請求會傳送至兩個 openshift-console pod 中的一個,該 pod 會再次連線至群集主控 OAuth 伺服器連接埠,以檢查連線是否已通過認證。 如果使用者輸入密碼和 2FA 驗證,驗證就會生效,使用者就會連線到 OpenShift 主控台網頁。

2.檢查您的 VPC 和群集設定

確認您的 VPC 和群集已正確設定。 不正確的設定可能會讓您無法存取 OpenShift 網頁主控台。

  1. 確保您的 Web 瀏覽器在用戶端系統中執行,而該用戶端系統與您的群集位於同一 VPC 中,或與該 VPC 有 VPN 連線。 OpenShift Console 由私有 VPC 負載平衡器揭露,該負載平衡器只能從 VPC 的私有網路存取。

  2. 確保用戶端系統可以存取 IAM 的公共服務端點,這些端點可透過 iam.cloud.ibm.comlogin.ibm.com 進行存取。

  3. 對於執行版本 4.13:

    • 如果您的群集使用預設 4.13 Oauth 設定,或您已設定群集使用 VPE Gateway 進行 Oauth,請確保您的用戶端使用 VPC 的私有 DNS,且此 DNS 流量透過 VPN 路由至 VPC。 私人 DNS 通常是 161.26.0.7161.26.0.8,除非您使用自訂的 DNS 解析器。 這樣才能在 VPC 的私有 DNS 中找到 apiserverOauth 的 VPE 閘道,該閘道不存在於任何公共 DNS 中。
  4. 對於執行任何支援版本的群集,除了 4.13:

    • 如果您使用預設的 Oauth 群集設定,請確保 VPN 設定中存在路由,以便所有 166.8.0.0/14 流量都透過相同的 VPN 或另一個 VPN 連線至 IBM Cloud。 連接至群集的 API 伺服器和 OAuth 伺服器連接埠時需要使用此功能。

3.收集群集資料

按照以下步驟收集故障排除所需的群集資訊。 您從這些指令收集到的輸出結果會用在後面的步驟中。

  1. 尋找群集 API 伺服器 URL。 在稍後的指令中,這個 URL 稱為 ${CLUSTER_APISERVER_URL}

    1. 執行 ibmcloud ks cluster get -c CLUSTER_ID 指令。
        ibmcloud oc cluster get -c CLUSTER_ID
        ```
    2. 在輸出的 `Master` 部分,找到 `URL`。 URL 應採用以下格式:`https://c<XXX>-e.private.<REGION>.containers.cloud.ibm.com:<YYYYY>`.
    
    
    
  2. 尋找群集 OAuth URL。 在稍後的指令中,這個 URL 稱為 ${CLUSTER_OAUTH_URL}

    1. 執行 kubectl get --raw /.well-known/oauth-authorization-server | grep issuer 指令。 請勿使用 ibmcloud oc cluster get -c CLUSTER_ID,因為此指令可能會傳回不同的 URL。
        kubectl get --raw /.well-known/oauth-authorization-server | grep issuer
        ```
    2. 在輸出中,找到下列格式之一的 URL。
        - 如果 VPE 閘道未用於 OAuth: `https://c<XXX>-e.private.<REGION>.containers.cloud.ibm.com:<ZZZZZ>`。
        - 如果 VPE 閘道用於 OAuth: `https://<CLUSTERID>.vpe.private.<REGION>.containers.cloud.ibm.com:<ZZZZZ>`。
    
    
  3. 尋找 Ingress 子網域。 在稍後的指令中,此子網域稱為 ${CONSOLE_LOAD_BALANCER}

    1. 執行 ibmcloud oc cluster get -c CLUSTER_ID 指令。
        ibmcloud oc cluster get -c CLUSTER_ID
        ```
    2. 在輸出中,找出符合下列格式的子網域:`<CLUSTER-NAME-PLUS-RANDOM-UNIQUE-STRING>.<REGION>.containers.appdomain.cloud`. 請注意,如果您設定了自訂的 Ingress 子網域,格式將與您的自訂設定相符。
    
    

4.驗證連接並排除故障

按照以下步驟檢查 連接流程 中所述的連接。 如果您發現連線有問題,請使用這些資訊來排除故障。

  1. 驗證 Ingress 是否健康,路由器和主控台 pod 是否健康。

    1. 執行指令。
        ibmcloud oc cluster get -c CLUSTERID
        ibmcloud oc ingress status-report get -c CLUSTERID
        ```
    2. 如果輸出顯示錯誤狀態,請使用 [Ingress 疑難排解文件](/docs/openshift?topic=openshift-ingress-status) 來解決問題。
    
    
  2. 驗證 OpenShift 群集操作員是否健康。

    1. 執行指令。
        oc get clusteroperators
        ```
    2. 如果輸出顯示任何操作員不健康或未以目前版本執行,請使用 [OpenShift 群集版本疑難排解說明文件](/docs/openshift?topic=openshift-ts-cluster-version-downlevel) 來解決問題。 或者,您可以搜尋 IBM 和 Red Hat 文件,尋找所顯示的任何特定錯誤。
    3. 如果控制台操作員特別不健康,請檢查 `openshift-console/console...` 和 `openshift-console-operator/console-operator...` pod 日誌,看看是否有安全群組、ACL 或 DNS 自訂阻止 pod 連線到 OAuth 連接埠或 OpenShift 控制台 URL。 安全群組、ACL 或 DNS 的設定方式可能會阻止連線。
    
    
  3. 確認與群集主 API 伺服器的連線成功。

    1. 執行指令。 指定您在 之前步驟 中找到的群集 apiserver URL。
        curl -k -vvv ${CLUSTER_APISERVER_URL}/version
        ```
    2. 如果連線不成功,請進行下列檢查,並解決您發現的任何問題。
        1. 執行 `ibmcloud oc cluster get -c <CLUSTER-ID>` 指令,檢查群集主機是否健康。 有關解決叢集主節點問題的信息,請參閱 [檢查主節點健康狀況](/docs/openshift?topic=openshift-debug_master)。
        2. 檢查 URL 的主機名稱部分是否已透過 DNS 解析。 使用 `dig $(echo ${CLUSTER_APISERVER_URL} | cut -d/ -f3 | cut -d: -f1)` 指令,並指定群集 API 伺服器 URL。
        3. 確認有一條路由可透過您的 VPN 連接到群集 API 伺服器 URL。
        4. 如果群集 apiserver URL 包含您的群集 ID(表示群集使用 VPE 閘道連接至群集 apiserver),請檢查群集主機的 VPE 閘道安全群組是否允許來自您 VPN 用戶端子網路的流量。 請遵循 [當 OAuth 存取設定為 VPE 閘道時,存取 OpenShift 主控台](/docs/openshift?topic=openshift-console-apiserver-oauthvpe) 中的步驟。
        5. 檢查套用至 VPN 的任何安全群組、ACL 或自訂 VPC 路由是否會阻止 VPN 與群集 API 伺服器之間的流量。 您可以暫時允許透過 VPN 安全群組和 ACL 的所有入站和出站流量,然後檢查這是否解決了問題。 如果是,請對安全群組、ACL 或自訂路由進行必要的變更,以允許流量。
        6. 檢查群集中是否有任何 Context Based Restriction (CBR) 規則阻止用戶端連線至群集 API 伺服器。 您可以暫時在 CBR 規則中加入允許所有 IP 和子網路的網路區域來測試。 如果這個臨時變更解決了問題,請對規則進行必要的變更以允許流量。
    
    
  4. 確認與暴露 OpenShift 主控台的群集負載平衡器的連線成功。

    1. 執行指令。 指定您在 前面步驟 中找到的 Ingress 子網域。
        curl -k -vvv https://console-openshift-console.${CONSOLE_LOAD_BALANCER}/
        ```
    2. 如果連線不成功,請進行下列檢查,並解決您發現的任何問題。
        1. 檢查子網域的主機名稱部分是否已透過 DNS 解析。 使用 `dig console-openshift-console.${CONSOLE_LOAD_BALANCER}` 指令。
        2. 驗證是否有路由透過您的 VPN 連接到此負載平衡子網域。 確認路由包含負載平衡器使用的所有 IP 或子網路。 `dig console-openshift-console.${CONSOLE_LOAD_BALANCER}` 指令的輸出包括目前負載平衡器的 IP 和子網路,但請注意這些 IP 和子網路會隨著負載平衡器的擴充或減少而改變。
        3. 如果您修改了任何套用至負載平衡器的安全群組、ACL 或自訂 VPC 路由,請檢查您套用的任何變更或規則是否會阻止連線。 如果您沒有修改這些元件,而且它們使用預設值,則可以跳過此步驟。
        4. 檢查是否有任何套用至 VPN 的安全群組、ACL 或自訂 VPC 路由會阻止 VPN 與負載平衡器之間的流量。 您可以暫時允許透過 VPN 安全群組和 ACL 的所有入站和出站流量,然後檢查這是否解決了問題。 如果是,請對安全群組、ACL 或自訂路由進行必要的變更,以允許流量。
    
    
  5. 確認與群集 OAuth 伺服器的連線成功。

    1. 執行指令。 指定您在 前幾個步驟 中找到的群集 OAuth URL。
        curl -k -vvv ${CLUSTER_OAUTH_URL}/healthz
        ```
    2. 如果連線不成功,請進行下列檢查,並解決您發現的任何問題。
        1. 執行 `ibmcloud oc cluster get -c <CLUSTER-ID>` 指令,檢查群集主站是否健康。 有關解決叢集主節點問題的信息,請參閱 [檢查主節點健康狀況](/docs/openshift?topic=openshift-debug_master)。
        2. 檢查群集 OAuth URL 的主機名稱部分是否已透過 DNS 解析。 使用 `dig $(echo ${CLUSTER_OAUTH_URL} | cut -d/ -f3 | cut -d: -f1)` 並指定群集 OAuth URL。
        3. 確認有路由透過您的 VPN 連接到群集主站 OAuth URL。
        4. 檢查套用至 VPN 的任何安全群組、ACL 或自訂 VPC 路由是否會阻止 VPN 與群集 OAuth 伺服器之間的流量。 您可以暫時允許透過 VPN 安全群組和 ACL 的所有入站和出站流量,然後檢查這是否解決了問題。 如果是,請對安全群組、ACL 或自訂路由進行必要的變更,以允許流量。
        5. 檢查群集中是否有任何 Context Based Restriction (CBR) 規則阻止用戶端連線至群集 OAuth 伺服器。 您可以暫時在 CBR 規則中加入允許所有 IP 和子網路的網路區域來測試。 如果這個臨時變更解決了問題,請對規則進行必要的變更以允許流量。
    
    
  6. 驗證與 IAM 的連線是否成功。

    1. 執行指令。
        curl -vvv https://iam.cloud.ibm.com/healthz
        curl -vvv -o /dev/null -s https://login.ibm.com/
        ```
    2. 如果這些指令都失敗,請檢查用戶端系統是否能夠可靠地連線這些 URL,以及這些 URL 是否被任何用戶端或公司防火牆封鎖。 請注意,這些 URL 需要存取公共網際網路。
    
    

5.聯絡支援

如果您已完成上述所有步驟,但仍未解決問題,請聯絡支援人員。 開啟 支援個案。 在案例詳細資訊中,請務必包含任何相關的記錄檔、錯誤訊息或指令輸出。