除錯 Ingress
虛擬私有雲 經典基礎設施
您已在叢集中為您的應用程式建立了一個 Ingress 資源,藉此將該應用程式對外公開。 不過,當您嘗試透過 Ingress 子網域或 Ingress 控制器的 IP 位址連接至應用程式時,連線會失敗或逾時。
下列各節中的步驟可協助您除錯 Ingress 設定。
開始之前,請確定您具有 IBM Cloud Kubernetes Service的下列 IBM Cloud IAM 存取原則: - 該叢集的「編輯者」或「管理員」平台存取角色 -「 撰寫者」或「管理員」服務存取角色
當您嘗試存取應用程式的子網域時,看到 應用程式無法使用 頁面嗎? 請檢查您的應用程式部署、Ingress 及 Route 資源的設定。 看到 連線逾時 頁面嗎? 檢查 Ingress 控制器 Pod 的性能。
步驟 1:檢查您的應用程式部署、Ingress 及 Route 資源的設定
首先,請檢查應用程式部署及 Ingress 資源部署中的錯誤。 部署過程中的錯誤訊息可協助您找出失敗的根本原因,並在接下來的章節中進一步除錯您的 Ingress 設定。
-
在對 Ingress 進行除錯之前,請先移出 對應用程式部署進行除錯。 Ingress 問題通常是由應用程式部署或公開應用程式的
ClusterIP服務中的基礎問題所導致。 例如,您的應用程式標籤與服務選取器可能不相符,或者您的應用程式與服務目標埠可能不相符。 -
請檢查您的 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> -
請檢查您的 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> -
請檢查叢集層級的事件,以確認是否有警告或錯誤訊息。
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 -
請檢查 Ingress 或 Route 資源的設定檔。
oc get ingress -o yaml-
確定您只在一個 Ingress 資源中定義主機。 若同一主機被定義在多個 Ingress 資源中,Ingress 控制器可能無法正確轉發流量,您可能會遇到錯誤。
-
確認子網域及 TLS 憑證正確無誤。 若要查找由 IBM 提供的 Ingress 子網域及 TLS 憑證,請執行
ibmcloud oc cluster get --cluster <cluster_name_or_ID>。 -
確定應用程式接聽與 Ingress 之 path 區段中配置相同的路徑。
-
視需要編輯資源配置 YAML。 當您關閉編輯器時,即會儲存並自動套用您的變更。
oc edit ingress <myingressresource> ``` -
-
查看您是否已達到每個帳戶允許的 VPC 負載平衡器數目上限。 請檢查 VPC 配額文件,以取得 VPC 中所有 VPC 叢集的 VPC 資源配額。
步驟 2:檢查 Ingress 控制器的健康狀況
請驗證 Ingress 操作器及 Ingress 控制器性能正常。 Ingress 控制器由 Ingress 操作器管理。 Ingress 控制器只會根據 Ingress 資源中定義並由 Ingress 控制器實作的規則,將要求轉遞至該應用程式的 Pod。
- 請透過檢視「
IngressController」自訂資源,確認您的 Ingress 操作員狀態。 在 Red Hat OpenShift (位於 IBM Cloud )中,Ingress 操作員由平台管理,其 Pod 無法直接存取。 相反地,請透過IngressController資源狀態來檢查營運商的運作狀況。- 請說明預設的「
IngressController」,並檢視 「Conditions」 區段中是否存在任何狀態為「False」或「Unknown」的項目及其相關訊息。
oc describe ingresscontroller/default -n openshift-ingress-operator ``` 2. 列出所有 `IngressController` 資源,以確認其中沒有任何資源處於降級狀態。 ```sh {: pre} oc get ingresscontrollers -n openshift-ingress-operator ``` - 請說明預設的「
- 檢查 Ingress 控制器 Pod 的狀態及日誌。
- 取得您叢集中正在運行的 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 ``` - 檢查每一個 Ingress 控制器服務上的事件及錯誤。
- 列出
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控制器以執行健康檢查。
-
驗證 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.
-
-
取得 Ingress 控制器服務正在接聽的外部 IP 位址。 如果您具有多區域叢集,請注意,您具有工作者節點之第一個區域中的 Ingress 控制器服務一律命名為
router-default,而您隨後新增至叢集之區域中的 Ingress 控制器服務則具有router-dal12之類的名稱。 在 VPC 叢集裡,外部 IP 位址位於 VPC 負載平衡器所指派的主機名稱後面,例如aabb1122-us-south.lb.appdomain.cloud。oc get svc -n openshift-ingress以下為經典多區域叢集(其工作節點位於
dal10和dal13)的輸出範例: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 控制器不會部署在區域中?。
-
檢查 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 的狀態。 -
取得 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 -
確定 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 -
若您使用自訂網域,請確認已透過您的 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 ```