파드 실패 이유 파악하기

파드 실패 이유 파악하기 (Determine the Reason for Pod Failure)

이 페이지는 컨테이너 종료 메시지(termination message)를 작성하고 읽는 방법을 보여줘요.

종료 메시지는 컨테이너가 치명적 이벤트에 대한 정보를, 대시보드나 모니터링 소프트웨어 같은 도구가 쉽게 검색하고 표면화할 수 있는 위치에 기록할 수 있는 방법을 제공해요. 대부분의 경우 종료 메시지에 넣는 정보는 일반 Kubernetes 로그에도 기록해야 해요.

출처: 문서

본문

시작하기 전에

Kubernetes 클러스터가 있어야 하고 kubectl 명령줄 도구가 클러스터와 통신하도록 구성되어 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 이용해 만들거나, 아래 Kubernetes 플레이그라운드 중 하나를 사용할 수 있어요.

종료 메시지 작성과 읽기

이 연습에서는 컨테이너 하나를 실행하는 파드를 만들어요. 그 파드의 매니페스트는 컨테이너가 시작될 때 실행되는 명령을 지정해요.

apiVersion: v1
kind: Pod
metadata:
  name: termination-demo
spec:
  containers:
  - name: termination-demo-container
    image: debian
    command: ["/bin/sh"]
    args: ["-c", "sleep 10 && echo Sleep expired > /dev/termination-log"]
  • YAML 구성 파일을 기반으로 파드를 만들어요. YAML 파일의 commandargs 필드에서 컨테이너가 10초간 sleep한 다음 /dev/termination-log 파일에 "Sleep expired"를 쓰는 것을 볼 수 있어요. 컨테이너가 "Sleep expired" 메시지를 쓴 후 종료돼요.
  • 파드에 대한 정보를 표시해요. 파드가 더 이상 실행되지 않을 때까지 앞선 명령을 반복해요.
  • 파드에 대한 상세 정보를 표시해요. 출력에는 "Sleep expired" 메시지가 포함돼요.
  • Go 템플릿을 사용해 출력을 필터링해 종료 메시지만 포함하게 해요.

멀티 컨테이너 파드를 실행 중이라면 Go 템플릿을 사용해 컨테이너 이름을 포함할 수 있어요. 그렇게 하면 어느 컨테이너가 실패했는지 알아낼 수 있어요.

kubectl get pod multi-container-pod -o go-template='{{range .status.containerStatuses}}{{printf "%s:\n%s\n\n" .name .lastState.terminated.message}}{{end}}'

종료 메시지 사용자 지정

Kubernetes는 컨테이너의 terminationMessagePath 필드에 지정된 종료 메시지 파일에서 종료 메시지를 검색하며, 기본값은 /dev/termination-log예요. 이 필드를 사용자 지정하면 Kubernetes가 다른 파일을 사용하도록 할 수 있어요. Kubernetes는 지정된 파일의 내용을 사용해 성공과 실패 모두에서 컨테이너의 status 메시지를 채워요.

종료 메시지는 단언(assertion) 실패 메시지 같은 간결한 최종 상태를 의도해요. kubelet은 4096바이트보다 긴 메시지를 잘라내요.

모든 컨테이너에 걸친 총 메시지 길이는 12KiB로 제한되며, 각 컨테이너에 균등하게 나뉘어요. 예를 들어 컨테이너가 12개(initContainers 또는 containers)라면 각각 1024바이트의 종료 메시지 공간을 가져요.

기본 종료 메시지 경로는 /dev/termination-log예요. 파드가 시작된 후에는 종료 메시지 경로를 설정할 수 없어요.

다음 예시에서 컨테이너는 Kubernetes가 검색하도록 /tmp/my-log에 종료 메시지를 써요.

apiVersion: v1
kind: Pod
metadata:
  name: msg-path-demo
spec:
  containers:
  - name: msg-path-demo-container
    image: debian
    terminationMessagePath: "/tmp/my-log"

또한 컨테이너의 terminationMessagePolicy 필드를 설정해 추가로 사용자 지정할 수 있어요. 이 필드는 기본적으로 "File"로, 종료 메시지가 종료 메시지 파일에서만 검색된다는 뜻이에요. terminationMessagePolicy"FallbackToLogsOnError"로 설정하면, 종료 메시지 파일이 비어 있고 컨테이너가 오류로 종료된 경우 Kubernetes가 컨테이너 로그 출력의 마지막 부분을 사용하도록 지시할 수 있어요. 로그 출력은 2048바이트 또는 80줄 중 더 작은 쪽으로 제한돼요.

다음 단계

더 알아보기 (Learn more)