调试 Ingress
虚拟私有云 经典基础设施
您通过在集群中为应用程序创建一个 Ingress 资源,将该应用程序对外公开。 但是,当您尝试通过 Ingress 子域或 Ingress 控制器的 IP 地址连接到应用程序时,连接将失败或超时。
以下各部分中的步骤可帮助您调试 Ingress 设置。
开始之前,请确保您具有 IBM Cloud Kubernetes Service的以下 IBM Cloud IAM 访问策略: - 集群的 “编辑者”或 “管理员”平台访问角色 - “写入者”或 “管理员”服务访问角色
当您尝试访问应用程序的子域时,是否看到 应用程序不可用 页面? 请检查您的应用部署、Ingress 和 Route 资源的配置。 要查看 连接超时 页面吗? 检查 Ingress 控制器 pod 的运行状况。
步骤 1:检查应用程序部署、Ingress 和 Route 资源的配置
首先检查应用程序部署和 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 控制器实现的规则将请求转发到该应用程序的 pod。
- 通过检查
IngressController自定义资源,查看您的Ingress操作员的状态。 在 Red Hat OpenShift (位于 IBM Cloud )中,Ingress 操作员由平台管理,其 Pod 无法直接访问。 相反,请通过IngressController资源状态来检查操作器的运行状况。- 描述默认的
IngressController,并查看 “条件” 部分,查看是否有False或Unknown状态条目及其相关消息。
oc describe ingresscontroller/default -n openshift-ingress-operator ``` 2. 列出所有 `IngressController` 资源,以验证其中是否存在处于降级状态的资源。 ```sh {: pre} oc get ingresscontrollers -n openshift-ingress-operator ``` - 描述默认的
- 检查 Ingress 控制器 pod 的状态和日志。
- 获取在您的集群中运行的 Ingress 控制器 Pod。
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 地址到输入控制器服务 IP 地址的 80 或 443 端口入站访问,以便 Red Hat OpenShift 控制平面可以检查输入控制器的健康状况。 例如,如果您使用 Calico 策略,请创建 Calico 预 DNAT 策略 以允许从 IBM NS1 的源 IP 地址 对您的 Ingress 控制器进行入站访问,这些 IP 地址用于检查端口 80 上的 Ingress 控制器的运行状况以及 集群所在区域的控制平面子网。 继续执行下一步以获取 Ingress 控制器服务 IP 地址。
-
VPC:如果在群集入口的 VPCLBaaSLoadBalancer-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路径,该路径返回正常IP的ok状态。
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 -
确保已向集群的 IBM提供的 Ingress 子域注册 Ingress 控制器 IP 地址。 例如,在多区域集群中,每个包含工作节点的区域中的公共 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 ```