调试 Ingress

虚拟私有云 经典基础设施

您通过在集群中为应用程序创建一个 Ingress 资源,将该应用程序对外公开。 但是,当您尝试通过 Ingress 子域或 Ingress 控制器的 IP 地址连接到应用程序时,连接将失败或超时。

以下各部分中的步骤可帮助您调试 Ingress 设置。

开始之前,请确保您具有 IBM Cloud Kubernetes Service的以下 IBM Cloud IAM 访问策略: - 集群的 “编辑者”或 “管理员”平台访问角色 - “写入者”或 “管理员”服务访问角色

当您尝试访问应用程序的子域时,是否看到 应用程序不可用 页面? 请检查您的应用部署、Ingress 和 Route 资源的配置。 要查看 连接超时 页面吗? 检查 Ingress 控制器 pod 的运行状况

步骤 1:检查应用程序部署、Ingress 和 Route 资源的配置

首先检查应用程序部署和 Ingress 资源部署中的错误。 部署过程中的错误信息可帮助您找出故障的根本原因,并在后续章节中进一步调试 Ingress 配置。

  1. 在调试 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 控制器实现的规则将请求转发到该应用程序的 pod。

  1. 通过检查 IngressController 自定义资源,查看您的Ingress操作员的状态。 在 Red Hat OpenShift (位于 IBM Cloud )中,Ingress 操作员由平台管理,其 Pod 无法直接访问。 相反,请通过 IngressController 资源状态来检查操作器的运行状况。
    1. 描述默认的 IngressController,并查看 “条件” 部分,查看是否有 FalseUnknown 状态条目及其相关消息。
        oc describe ingresscontroller/default -n openshift-ingress-operator
        ```
    2. 列出所有 `IngressController` 资源,以验证其中是否存在处于降级状态的资源。
    ```sh {: pre}
        oc get ingresscontrollers -n openshift-ingress-operator
        ```
    
  2. 检查 Ingress 控制器 pod 的状态和日志。
    1. 获取在您的集群中运行的 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
        ```
    
  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 地址到输入控制器服务 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 的必要健康检查流量。

  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 路径,该路径返回正常IP的 ok 状态。
    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. 确保已向集群的 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
    
  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
        ```