IBM Cloud Docs
调试 Ingress

调试 Ingress

虚拟私有云 经典基础架构

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

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

开始之前,请确保您具有 IBM Cloud Kubernetes Service的以下 IBM Cloud IAM 访问策略:

  • 群集的编辑器管理员平台访问角色
  • 撰稿人管理员服务访问角色

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

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

首先检查应用程序部署和 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>) 和 NGINX 注释 (nginx.ingress.kubernetes.io/<annotation>)。 如果要为运行 Red Hat OpenShift 版本 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:
        custom-port:        protocol=http port=7490; protocol=https port=4431
        location-modifier:  modifier='~' serviceName=myservice1;modifier='^~' serviceName=myservice2
    Events:
        Type     Reason             Age   From                                Message
        ----     ------             ----  ----                                -------
        Warning  TLSSecretNotFound  1m    router-default-69d6f598f8-vn8tj     Failed to apply ingress resource.
        Warning  AnnotationError    2s    router-default-69d6f598f8-vn8tj     Failed to apply ingress.bluemix.net/custom-port annotation.
        Warning  TLSSecretNotFound  1m    router-dal10-y2d4359tf4-g4ar7       Failed to apply ingress resource.
        Warning  AnnotationError    2s    router-dal10-y2d4359tf4-g4ar7       Failed to apply ingress.bluemix.net/custom-port annotation.
    
  3. 请检查 Ingress 资源配置文件。

    oc get ingress -o yaml
    
    1. 确保一个主机仅在一个 Ingress 资源中进行定义。 如果一台主机定义在多个导入资源中,导入控制器可能无法正确转发流量,您可能会遇到错误。

    2. 检查子域和 TLS 证书是否正确。 要查找 IBM 提供的 Ingress 子域和 TLS 证书,请运行 ibmcloud oc cluster get --cluster <cluster_name_or_ID>

    3. 确保应用程序侦听的是在 Ingress 的 path 部分中配置的路径。

    4. 根据需要编辑资源配置 YAML。 关闭编辑器时,会保存并自动应用更改。

      oc edit ingress <myingressresource>
      
  4. 检查是否达到每个帐户允许的最大 VPC 负载均衡器数。 请查看 VPC 配额文档,以了解 VPC 中所有 VPC 集群的 VPC 资源配额。

步骤 2:检查 Ingress 控制器的健康状况

验证 Ingress 操作程序和 Ingress 控制器是否正常运行。 入口控制器由 Ingress 操作程序管理。 Ingress 控制器仅根据 Ingress 资源中定义并由 Ingress 控制器实现的规则将请求转发到该应用程序的 pod。

  1. 检查入口操作员舱的状态。
    1. 获取集群中正在运行的 Ingress 操作员 pod。

      oc get pods -n openshift-ingress-operator
      
    2. 通过检查 STATUS 列来确保所有 pod 都在运行。

    3. 如果 pod 没有 Running 状态,那么可以删除 pod 以将其重新启动。

      oc delete pod <pod> -n openshift-ingress-operator
      
    4. 获取 Ingress 操作程序的日志,并在日志中查找错误消息。

      oc logs deployments/ingress-operator -n openshift-ingress-operator -c 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 以将其重新启动。

      oc delete pod <pod> -n openshift-ingress
      
    4. 获取每个 pod 的日志,并在日志中查找错误消息。

      oc logs <pod> -n openshift-ingress
      
  3. 检查每个 Ingress 控制器服务上的事件和错误。
    1. 列出 openshift-ingress 名称空间中的服务。
      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
      
    2. 描述每个 Ingress 控制器服务,并在输出的 Events 部分中检查消息。
      oc describe svc router-default -n openshift-ingress
      

步骤 3:Ping 入口子域和入口控制器公共 IP 地址

检查 Ingress 控制器的公共 IP 地址的可用性,并验证子域映射。 此外,请确保 Red Hat OpenShift 控制平面可以访问 Ingress 控制器以进行运行状况检查。

  1. 验证 Ingress 控制器运行状况检查是否可访问 Ingress 控制器服务。

    • 经典: 如果使用 Calico DNAT 之前的网络策略或其他定制防火墙来阻止到集群的入局流量,您必须允许从 Red Hat OpenShift 控制平面和 Akamai 的 IPv4 IP 地址对 Ingress 控制器服务的 IP 地址进行入站访问,以便 Red Hat OpenShift 控制平面可以检查 Ingress 控制器的运行状况。 例如,如果使用 Calico 策略,那么 创建 Calico DNAT 前策略 以允许从 Akamai 的源 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:检查您的自定义域是否已映射到集群 IBM 提供的 Canonical Name 记录 (CNAME) 中的子域。
      host www.my-domain.com
      
      示例输出
      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 地址。
      host www.my-domain.com
      
      示例输出
      www.my-domain.com has address 169.XX.XX.XXX
      www.my-domain.com has address 169.XX.XX.XXX