7.7. Pod 문제 조사

OpenShift Container Platform은 호스트에 함께 배포되는 하나 이상의 컨테이너인 Pod의 Kubernetes 개념을 활용합니다. Pod는 OpenShift Container Platform 4.12에서 정의, 배포 및 관리할 수 있는 가장 작은 컴퓨팅 단위입니다.

Pod가 정의되면 컨테이너가 종료될 때까지 또는 제거될 때까지 노드에서 실행되도록 할당됩니다. 정책 및 종료 코드에 따라 Pod는 종료 후 제거되거나 해당 로그에 액세스할 수 있도록 유지됩니다.

Pod 문제 발생 시 가장 먼저 Pod의 상태를 확인합니다. Pod의 명시적인 오류가 발생한 경우에는 Pod의 오류 상태를 확인하여 특정 이미지, 컨테이너 또는 Pod 네트워크 문제를 파악합니다. 오류 상태에 따라 진단 데이터를 수집합니다. Pod 이벤트 메시지와 Pod 및 컨테이너 로그 정보를 확인합니다. 명령줄에서 실행 중인 Pod에 액세스하여 문제를 동적으로 진단하거나 문제가 있는 Pod의 배포 구성을 기반으로 루트 액세스 권한으로 디버그 Pod를 시작합니다.

7.7.1. Pod 오류 상태 이해

Pod에서 오류가 발생하면 명시적 오류 상태를 반환하며 oc get Pods 출력의 status 필드에서 확인할 수 있습니다. Pod 오류 상태에는 이미지, 컨테이너 및 컨테이너 네트워크 관련 오류가 포함됩니다.

다음 표에는 Pod 오류 상태 및 설명이 기재되어 있습니다.

표 7.3. Pod 오류 상태

Pod 오류 상태설명

ErrImagePull

일반 이미지 검색 오류입니다.

ErrImagePullBackOff

이미지 검색에 실패하여 백 오프되었습니다.

ErrInvalidImageName

지정된 이미지 이름이 잘못되었습니다.

ErrImageInspect

이미지 검사에 실패했습니다.

ErrImageNeverPull

PullPolicyNeverPullImage에 설정된 대상 이미지는 호스트에서 로컬로 표시되지 않습니다.

ErrRegistryUnavailable

레지스트리에서 이미지 검색을 시도할 때 HTTP 오류가 발생했습니다.

ErrContainerNotFound

지정된 컨테이너가 선언된 Pod에 존재하지 않거나 kubelet에 의해 관리되지 않습니다.

ErrRunInitContainer

컨테이너 초기화에 실패했습니다.

ErrRunContainer

Pod의 컨테이너가 정상적으로 시작되지 않았습니다.

ErrKillContainer

Pod의 컨테이너가 정상적으로 종료되지 않았습니다.

ErrCrashLoopBackOff

컨테이너가 종료되었습니다. kubelet은 재시작을 시도하지 않습니다.

ErrVerifyNonRoot

컨테이너 또는 이미지가 root 권한으로 실행하려고 했습니다.

ErrCreatePodSandbox

Pod 샌드 박스 생성에 실패했습니다.

ErrConfigPodSandbox

Pod 샌드 박스 구성을 가져오지 못했습니다.

ErrKillPodSandbox

Pod의 샌드박스가 정상적으로 중지되지 않았습니다.

ErrSetupNetwork

네트워크 초기화에 실패했습니다.

ErrTeardownNetwork

네트워크 종료에 실패했습니다.

7.7.2. Pod 상태 검토

Pod 상태 및 오류 상태를 쿼리할 수 있습니다. Pod의 관련 배포 구성을 쿼리하고 기본 이미지 가용성을 검토할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • skopeo가 설치되어 있어야 합니다.

프로세스

  1. 프로젝트로 전환합니다.

    $ oc project <project_name>
  2. 네임스페이스 내에서 실행 중인 Pod와 Pod 상태, 오류 상태, 재시작, 경과 시간을 표시합니다.

    $ oc get pods
  3. 네임 스페이스가 배포 구성에 의해 관리되는지 확인합니다.

    $ oc status

    네임 스페이스가 배포 구성으로 관리되는 경우 출력에 배포 구성 이름과 기본 이미지 참조가 포함됩니다.

  4. 이전 명령의 출력에서 참조되는 기본 이미지를 검사합니다.

    $ skopeo inspect docker://<image_reference>
  5. 기본 이미지 참조가 올바르지 않으면 배치 구성에서 참조를 업데이트합니다.

    $ oc edit deployment/my-deployment
  6. 배포 구성이 완료된 후 변경되면 구성이 자동으로 다시 배포됩니다. 배포가 진행되는 동안 Pod 상태를 확인하여 문제가 해결되었는지 확인합니다.

    $ oc get pods -w
  7. Pod 실패와 관련된 진단 정보를 보려면 네임스페이스 내의 이벤트를 검토합니다.

    $ oc get events

7.7.3. Pod 및 컨테이너 로그 검사

Pod 및 컨테이너 로그에서 명시적 Pod 실패와 관련된 경고 및 오류 메시지를 검사할 수 있습니다. 정책 및 종료 코드에 따라 Pod가 종료된 후에도 Pod 및 컨테이너 로그를 계속 사용할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • API 서비스가 작동하고 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 특정 Pod의 로그를 쿼리합니다.

    $ oc logs <pod_name>
  2. Pod에서 특정 컨테이너의 로그를 쿼리합니다.

    $ oc logs <pod_name> -c <container_name>

    이전 oc logs 명령을 사용하여 검색된 로그는 Pod 또는 컨테이너 내에서 stdout으로 전송된 메시지로 구성됩니다.

  3. Pod에서 /var/log/에 포함된 로그를 검사합니다.

    1. Pod에서 /var/log에 포함된 로그 파일 및 하위 디렉터리를 나열합니다.

      $ oc exec <pod_name>  -- ls -alh /var/log

      출력 예

      total 124K
      drwxr-xr-x. 1 root root   33 Aug 11 11:23 .
      drwxr-xr-x. 1 root root   28 Sep  6  2022 ..
      -rw-rw----. 1 root utmp    0 Jul 10 10:31 btmp
      -rw-r--r--. 1 root root  33K Jul 17 10:07 dnf.librepo.log
      -rw-r--r--. 1 root root  69K Jul 17 10:07 dnf.log
      -rw-r--r--. 1 root root 8.8K Jul 17 10:07 dnf.rpm.log
      -rw-r--r--. 1 root root  480 Jul 17 10:07 hawkey.log
      -rw-rw-r--. 1 root utmp    0 Jul 10 10:31 lastlog
      drwx------. 2 root root   23 Aug 11 11:14 openshift-apiserver
      drwx------. 2 root root    6 Jul 10 10:31 private
      drwxr-xr-x. 1 root root   22 Mar  9 08:05 rhsm
      -rw-rw-r--. 1 root utmp    0 Jul 10 10:31 wtmp

    2. Pod에서 /var/log에 포함된 특정 로그 파일을 쿼리합니다.

      $ oc exec <pod_name> cat /var/log/<path_to_log>

      출력 예

      2023-07-10T10:29:38+0000 INFO --- logging initialized ---
      2023-07-10T10:29:38+0000 DDEBUG timer: config: 13 ms
      2023-07-10T10:29:38+0000 DEBUG Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, needs-restarting, playground, product-id, repoclosure, repodiff, repograph, repomanage, reposync, subscription-manager, uploadprofile
      2023-07-10T10:29:38+0000 INFO Updating Subscription Management repositories.
      2023-07-10T10:29:38+0000 INFO Unable to read consumer identity
      2023-07-10T10:29:38+0000 INFO Subscription Manager is operating in container mode.
      2023-07-10T10:29:38+0000 INFO

    3. 특정 컨테이너의 /var/log에 포함된 로그 파일 및 하위 디렉토리를 나열합니다.

      $ oc exec <pod_name> -c <container_name> ls /var/log
    4. 특정 컨테이너의 /var/log에 포함된 특정 로그 파일을 쿼리합니다.

      $ oc exec <pod_name> -c <container_name> cat /var/log/<path_to_log>

7.7.4. 실행 중인 Pod에 액세스

Pod 내에서 쉘을 열거나 포트 전달을 통해 네트워크 액세스 권한을 취득하여 실행 중인 Pod를 동적으로 확인할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • API 서비스가 작동하고 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 액세스하려는 Pod가 포함된 프로젝트로 전환합니다. 이는 oc rsh 명령이 -n namespace 옵션을 허용하지 않기 때문에 필요합니다.

    $ oc project <namespace>
  2. Pod에서 원격 쉘을 시작합니다.

    $ oc rsh <pod_name>  1
    1
    Pod에 컨테이너가 여러 개 있는 경우 -c <container_name>을 지정하지 않으면 oc rsh는 첫 번째 컨테이너로 기본 설정됩니다.
  3. Pod에서 특정 컨테이너로 원격 쉘을 시작합니다.

    $ oc rsh -c <container_name> pod/<pod_name>
  4. Pod에서 포트로의 포트 전달 세션을 만듭니다.

    $ oc port-forward <pod_name> <host_port>:<pod_port>  1
    1
    Ctrl+C를 입력하여 포트 전달 세션을 취소합니다.

7.7.5. 루트 액세스 권한으로 디버그 Pod 시작

문제가 있는 Pod 배포 또는 배포 구성에 따라 루트 액세스 권한으로 디버그 Pod를 시작할 수 있습니다. 일반적으로 Pod 사용자는 루트가 아닌 권한으로 실행되지만 임시 루트 권한으로 문제 해결 Pod를 실행하면 문제 해결에 유용할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • API 서비스가 작동하고 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 배포에 따라 루트 액세스 권한으로 디버그 Pod를 시작합니다.

    1. 프로젝트의 배포 이름을 가져옵니다.

      $ oc get deployment -n <project_name>
    2. 배포에 따라 루트 권한으로 디버그 Pod를 시작합니다.

      $ oc debug deployment/my-deployment --as-root -n <project_name>
  2. 배포 구성에 따라 루트 액세스 권한으로 디버그 Pod를 시작합니다.

    1. 프로젝트의 배포 구성 이름을 가져옵니다.

      $ oc get deploymentconfigs -n <project_name>
    2. 배포 구성에 따라 루트 권한으로 디버그 Pod를 시작합니다.

      $ oc debug deploymentconfig/my-deployment-configuration --as-root -n <project_name>
참고

대화형 쉘을 실행하는 대신 -<command>를 이전 oc debug 명령에 추가하여 디버그 Pod 내에서 개별 명령을 실행할 수 있습니다.

7.7.6. Pod 및 컨테이너 간 파일 복사

Pod 간에 파일을 복사하여 구성 변경을 테스트하거나 진단 정보를 수집할 수 있습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • API 서비스가 작동하고 있어야 합니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 파일을 Pod에 복사합니다.

    $ oc cp <local_path> <pod_name>:/<path> -c <container_name>  1
    1
    -c 옵션이 지정되지 않은 경우 Pod의 첫 번째 컨테이너가 선택됩니다.
  2. Pod에서 파일을 복사합니다.

    $ oc cp <pod_name>:/<path>  -c <container_name> <local_path>  1
    1
    -c 옵션이 지정되지 않은 경우 Pod의 첫 번째 컨테이너가 선택됩니다.
    참고

    oc cp 가 작동하려면 컨테이너 내에서 tar 바이너리를 사용할 수 있어야합니다.