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 버전 4를 실행하는 클러스터의 앱에 대한 라우팅 규칙을 사용자 지정하려면 haproxy.router.openshift.io/<annotation> 또는 router.openshift.io/<annotation> 형식의 경로별 HAProxy 어노테이션을 사용할 수 있습니다.

    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>
    

    출력의 ‘상태 (Status)’ 및 ‘이벤트(Events )’ 섹션에서, 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 오퍼레이터의 상태를 확인하십시오. IBM Cloud 의 Red Hat OpenShift 에서는 Ingress 오퍼레이터가 플랫폼에서 관리되며, 해당 포드에 직접 접근할 수 없습니다. 대신, 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 제어기 팟(Pod)을 가져오십시오.
        oc get pods -n openshift-ingress
        ```
    2. **STATUS** 열을 확인하여 모든 `router-default` 팟(Pod) 및 기타 구역에 있는 Ingress 제어기의 팟(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단계: Ingress 하위 도메인과 Ingress 컨트롤러의 공용 IP 주소에 ping을 실행합니다

Ingress 제어기의 공인 IP 주소에 대한 가용성을 확인하고 하위 도메인 맵핑을 확인하십시오. 또한 Red Hat OpenShift 제어 플레인이 Ingress 제어기에 액세스하여 상태를 검사할 수 있는지 확인하십시오.

  1. Ingress 제어기 상태 검사를 통해 Ingress 제어기 서비스에 도달할 수 있는지 확인하십시오.

    • 클래식: Calico 의 DNAT 전 네트워크 정책이나 다른 사용자 지정 방화벽을 사용하여 클러스터로 들어오는 트래픽을 차단하는 경우, Red Hat OpenShift 제어 플레인이 Ingress 컨트롤러의 상태를 확인할 수 있도록 Red Hat OpenShift 제어 플레인과 IBM NS1 의 IPv4 IP 주소에서 Ingress 컨트롤러 서비스의 IP 주소로 향하는 포트 80 또는 443의 인바운드 액세스를 허용해야 합니다. 예를 들어, Calico 정책을 사용하는 경우, Calico 의 DNAT 전 처리 정책 생성 를 통해 IBM NS1의 소스 IP 주소 에서 Ingress 컨트롤러로 들어오는 인바운드 액세스를 허용하면, 해당 서버는 포트 80을 통해 Ingress 컨트롤러의 상태를 확인하며, 클러스터가 위치한 리전의 제어 플레인 서브넷 도 마찬가지입니다. Ingress 제어기 서비스 IP 주소를 얻으려면 다음 단계로 진행하십시오.

    • VPC: 클러스터 인그레스를 위한 VPC LBaaSLoadBalancer-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 클러스터: 각 서비스 IP 주소의 상태를 확인할 수 있도록 다중 구역 클러스터의 라우터 서비스가 /healthz 경로로 작성됩니다. 다음 HTTP cURL 명령은 정상 상태인 IP에 대해 /healthz 상태를 리턴하는 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. 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 제공 하위 도메인 또는 ALB의 공인 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
        ```