除錯 Ingress

虛擬私有雲 經典基礎設施

您已在叢集中為您的應用程式建立了一個 Ingress 資源,藉此將該應用程式對外公開。 不過,當您嘗試透過 Ingress 子網域或 Ingress 控制器的 IP 位址連接至應用程式時,連線會失敗或逾時。

下列各節中的步驟可協助您除錯 Ingress 設定。

開始之前,請確定您具有 IBM Cloud Kubernetes Service的下列 IBM Cloud IAM 存取原則: - 該叢集的「編輯者」或「管理員」平台存取角色 -「 撰寫者」或「管理員」服務存取角色

當您嘗試存取應用程式的子網域時,看到 應用程式無法使用 頁面嗎? 請檢查您的應用程式部署、Ingress 及 Route 資源的設定。 看到 連線逾時 頁面嗎? 檢查 Ingress 控制器 Pod 的性能

步驟 1:檢查您的應用程式部署、Ingress 及 Route 資源的設定

首先,請檢查應用程式部署及 Ingress 資源部署中的錯誤。 部署過程中的錯誤訊息可協助您找出失敗的根本原因,並在接下來的章節中進一步除錯您的 Ingress 設定。

  1. 在對 Ingress 進行除錯之前,請先移出 對應用程式部署進行除錯。 Ingress 問題通常是由應用程式部署或公開應用程式的 ClusterIP 服務中的基礎問題所導致。 例如,您的應用程式標籤與服務選取器可能不相符,或者您的應用程式與服務目標埠可能不相符。

  2. 請檢查您的 Ingress 資源部署狀況,並查看是否有任何警告或錯誤訊息。

    oc describe ingress <ingress_resource_name>
    

    在輸出的 Events 區段中,您可能會看到關於您使用之 Ingress 資源或某些註釋中含有無效值的警告訊息。 關於註解,請注意,在 Red Hat OpenShift 版本 4 中,Ingress 控制器或 Ingress 資源不支援 IBM Cloud Kubernetes Service 註解(ingress.bluemix.net/<annotation> )以及 Ingress- NGINX 註解(nginx.ingress.kubernetes.io/<annotation> )。 如果要為執行 Red Hat OpenShift version 4 的群集中的應用程式自訂路由規則,可以使用 特定於路由的 HAProxy 註釋,其格式為 haproxy.router.openshift.io/<annotation>router.openshift.io/<annotation>

    NAME:             myingress
    Namespace:        default
    Address:          169.xx.xxx.xxx,169.xx.xxx.xxx
    Default backend:  default-http-backend:80 (<none>)
    Rules:
        Host                                             Path  Backends
        ----                                             ----  --------
        mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        /tea      myservice1:80 (<none>)
        /coffee   myservice2:80 (<none>)
    Annotations:  <none>
    Events:       <none>
    
  3. 請檢查您的 Route 資源部署狀況,並查看是否有任何警告或錯誤訊息。

    oc describe route <myroute>
    

    在輸出結果的「狀態」和「事件」區段中,您可能會看到關於 Route 資源或您所使用的某些註解中存在無效值的警告訊息。

    Name:         myroute
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    API Version:  route.openshift.io/v1
    Kind:         Route
    Metadata:
      Creation Timestamp:  2026-07-01T10:18:43Z
      Generation:          1
      Owner References:
        API Version:     networking.k8s.io/v1
        Controller:      true
        Kind:            Ingress
        Name:            coffee-ingress
        UID:             e7a18dd4-402d-461c-a41f-c4750b6d2032
      Resource Version:  178601
      UID:               17c623e6-e9ef-4179-a3ad-af8ea311f2e5
    Spec:
      Host:  mycluster-<hash>-0000.us-south.containers.appdomain.cloud
      Path:  /
      Port:
        Target Port:  http
      Tls:
        Certificate:  ...
        Insecure Edge Termination Policy:  Redirect
        Key: ...
        Termination:  edge
      To:
        Kind:           Service
        Name:           myservice1
        Weight:         100
      Wildcard Policy:  None
    Status:
      Ingress:
        Conditions:
          Last Transition Time:     2026-07-01T10:18:43Z
          Status:                   True
          Type:                     Admitted
        Host:                       mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        Router Canonical Hostname:  router-default.mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        Router Name:                default
        Wildcard Policy:            None
    Events:  <none>
    
  4. 請檢查叢集層級的事件,以確認是否有警告或錯誤訊息。

    oc get events
    

    在某些情況下,與 Ingress 資源相關的警告或錯誤事件會在叢集層級觸發。 請注意,事件的範圍僅限於命名空間。

    LAST SEEN   TYPE      REASON                          OBJECT             MESSAGE
    2m40s       Warning   IncompleteIngressToRouteRules   ingress/myingress  Incomplete ingress to route rules detected: Invalid or missing TLS secret for rule host "mycluster-<hash>-0000.us-south.containers.appdomain.cloud" at index 0, path index 0
    
  5. 請檢查 Ingress 或 Route 資源的設定檔。

    oc get ingress -o yaml
    
    1. 確定您只在一個 Ingress 資源中定義主機。 若同一主機被定義在多個 Ingress 資源中,Ingress 控制器可能無法正確轉發流量,您可能會遇到錯誤。

    2. 確認子網域及 TLS 憑證正確無誤。 若要查找由 IBM 提供的 Ingress 子網域及 TLS 憑證,請執行 ibmcloud oc cluster get --cluster <cluster_name_or_ID>

    3. 確定應用程式接聽與 Ingress 之 path 區段中配置相同的路徑。

    4. 視需要編輯資源配置 YAML。 當您關閉編輯器時,即會儲存並自動套用您的變更。

        oc edit ingress <myingressresource>
        ```
    
  6. 查看您是否已達到每個帳戶允許的 VPC 負載平衡器數目上限。 請檢查 VPC 配額文件,以取得 VPC 中所有 VPC 叢集的 VPC 資源配額。

步驟 2:檢查 Ingress 控制器的健康狀況

請驗證 Ingress 操作器及 Ingress 控制器性能正常。 Ingress 控制器由 Ingress 操作器管理。 Ingress 控制器只會根據 Ingress 資源中定義並由 Ingress 控制器實作的規則,將要求轉遞至該應用程式的 Pod。

  1. 請透過檢視「IngressController」自訂資源,確認您的 Ingress 操作員狀態。 在 Red Hat OpenShift (位於 IBM Cloud )中,Ingress 操作員由平台管理,其 Pod 無法直接存取。 相反地,請透過 IngressController 資源狀態來檢查營運商的運作狀況。
    1. 請說明預設的「IngressController」,並檢視 「Conditions」 區段中是否存在任何狀態為「False」或「Unknown」的項目及其相關訊息。
        oc describe ingresscontroller/default -n openshift-ingress-operator
        ```
    2. 列出所有 `IngressController` 資源,以確認其中沒有任何資源處於降級狀態。
    ```sh {: pre}
        oc get ingresscontrollers -n openshift-ingress-operator
        ```
    
  2. 檢查 Ingress 控制器 Pod 的狀態及日誌。
    1. 取得您叢集中正在運行的 Ingress 控制器模組。
        oc get pods -n openshift-ingress
        ```
    2. 檢查 **STATUS** 直欄,以確定任何其他區域中 Ingress 控制器的所有 `router-default` Pod 和 Pod 都在執行中。 如果您具有多區域叢集,請注意,您具有工作者節點之第一個區域中的 Ingress 控制器服務一律命名為 `router-default`,而您隨後新增至叢集之區域中的 Ingress 控制器服務則具有 `router-dal12` 之類的名稱。
    
    3. 如果 Pod 沒有 `Running` 狀態,您可以刪除 Pod 來重新啟動它。
    ```sh {: pre}
        oc delete pod <pod> -n openshift-ingress
        ```
    4. 取得每一個 Pod 的日誌,並在日誌中尋找錯誤訊息。
    ```sh {: pre}
        oc logs <pod> -n openshift-ingress
        ```
    
  3. 檢查每一個 Ingress 控制器服務上的事件及錯誤。
    1. 列出 openshift-ingress 名稱空間中的服務。
        oc get svc -n openshift-ingress
        ```
        `dal10` 及 `dal13` 中具有工作者節點之多區域叢集的範例輸出:
        ```sh {: screen}
        NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
        router-dal13                                 LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32318/TCP,443:30915/TCP   26d
        router-default                               LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32637/TCP,443:31719/TCP   26d
        router-internal-default                      ClusterIP      172.21.51.30    <none>         80/TCP,443/TCP,1936/TCP      26d
        ```
    2. 說明每一個 Ingress 控制器服務,並在輸出的 `Events` 區段中檢查訊息。
    ```sh {: pre}
        oc describe svc router-default -n openshift-ingress
        ```
        例如,在 VPC 叢集裡,您可能會看到錯誤訊息,例如 `The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is offline`。 如需相關資訊,請參閱 [VPC 叢集: 為何我的應用程式無法透過負載平衡器進行連接?](/docs/openshift?topic=openshift-vpc_ts_lb)。
    
    

步驟 3:Ping 入口子網域和入口控制器公用 IP 位址

請檢查 Ingress 控制器的公用 IP 位址可用性,並驗證子網域對映。 此外,請確保控制 Red Hat OpenShift 平面能夠存取您的Ingress控制器以執行健康檢查。

  1. 驗證 Ingress 控制器性能檢查是否可以呼叫到 Ingress 控制器服務。

    • 經典:如果您使用 Calico pre-DNAT 網路政策或其他自訂防火牆來封鎖群集的入站流量,您必須允許從 Red Hat OpenShift 控制平面和 IBM NS1 ' IPv4 IP 位址到您的 Ingress 控制器服務 IP 位址的連接埠 80 或 443 的入站存取,以便 Red Hat OpenShift 控制平面可以檢查您的 Ingress 控制器的健康狀況。 例如,如果您使用 Calico 策略,請建立 Calico 預 DNAT 策略 以允許從 IBM NS1 的來源 IP 位址 對您的 Ingress 控制器進行入站訪問,這些 IP 位址用於檢查連接埠 80 上的 Ingress 控制器的運作狀況以及 叢集所在區域的控制平面子網路。 繼續下一步,以取得 Ingress 控制器服務 IP 位址。

    • VPC:如果您在用於叢集入口的 VPC LBaaS ( LoadBalancer-as-a-Service ) 實例上有一個自訂安全群組,請確保安全群組規則允許從Kubernetes控制平面 IP 位址到連接埠的必要運作狀況檢查流量443.

  2. 取得 Ingress 控制器服務正在接聽的外部 IP 位址。 如果您具有多區域叢集,請注意,您具有工作者節點之第一個區域中的 Ingress 控制器服務一律命名為 router-default,而您隨後新增至叢集之區域中的 Ingress 控制器服務則具有 router-dal12 之類的名稱。 在 VPC 叢集裡,外部 IP 位址位於 VPC 負載平衡器所指派的主機名稱後面,例如 aabb1122-us-south.lb.appdomain.cloud

    oc get svc -n openshift-ingress
    

    以下為經典多區域叢集(其工作節點位於 dal10dal13 )的輸出範例:

    NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)                      AGE
    router-dal13                                 LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32318/TCP,443:30915/TCP   26d
    router-default                               LoadBalancer   172.21.47.119   169.XX.XX.XX   80:32637/TCP,443:31719/TCP   26d
    router-internal-default                      ClusterIP      172.21.51.30    <none>         80/TCP,443/TCP,1936/TCP      26d
    

    如果 Ingress 控制器沒有外部 IP 位址 (標準) 或主機名稱 (VPC),請參閱 第 4 版: 為何 Ingress 控制器不會部署在區域中?

  3. 檢查 Ingress 控制器 Pod (標準) 或主機名稱 (VPC) 的性能。

    • 標準叢集: 檢查 Ingress 控制器 Pod 的狀態
    • VPC 叢集: 使用 /healthz 路徑建立多區域叢集裡的路由器服務,以便您可以檢查每一個服務 IP 位址的性能。 以下 HTTP cURL 指令使用 /healthz 路徑,它會回傳 ok 狀態的健康 IP。
    curl -X GET http://<router_svc_IP_or_hostname>/healthz -H "Host:router-default.<ingress_subdomain>"
    

    如果一個以上 IP 位址未傳回 ok,請 檢查 Ingress 控制器 Pod 的狀態

  4. 取得 IBM 提供的 Ingress 子網域。

    ibmcloud oc cluster get --cluster <cluster_name_or_ID> | grep Ingress
    

    輸出範例

    Ingress Subdomain:      mycluster-<hash>-0000.us-south.containers.appdomain.cloud
    Ingress Secret:         mycluster-<hash>-0000
    
  5. 確定 Ingress 控制器 IP 位址已向叢集的 IBM提供的 Ingress 子網域登錄。 例如,在多區域叢集中,每個擁有工作節點的區域中,其公開的 Ingress 控制器 IP 必須註冊在同一個子網域下。

    host <ingress_subdomain>
    

    輸出範例

    mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX
    mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XXX.XX
    
  6. 若您使用自訂網域,請確認已透過您的 DNS 服務供應商,將該自訂網域映射至 IBM 所提供的子網域,或映射至 Ingress 控制器的公開 IP 位址。

    • IBM- 提供的子網域 CNAME: 請確認您的自訂網域已在規範名稱(CNAME)記錄中,映射至叢集的 IBM 所提供的子網域。
        host www.my-domain.com
        ```
        輸出範例
        ```sh {: screen}
        www.my-domain.com is an alias for mycluster-<hash>-0000.us-south.containers.appdomain.cloud
        mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX
        mycluster-<hash>-0000.us-south.containers.appdomain.cloud has address 169.XX.XX.XXX
        ```
    * **公網 IP 位址的 A 記錄**:請確認您的自訂網域已在 A 記錄中映射至 Ingress 控制器的可攜式公網 IP 位址。
    ```sh {: pre}
        host www.my-domain.com
        ```
        輸出範例
        ```sh {: screen}
        www.my-domain.com has address 169.XX.XX.XXX
        www.my-domain.com has address 169.XX.XX.XXX
        ```