파드 실패 이유 파악하기
파드 실패 이유 파악하기 (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 파일의
command와args필드에서 컨테이너가 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줄 중 더 작은 쪽으로 제한돼요.
다음 단계
- Container의
terminationMessagePath필드 보기 - Images에서 ImagePullBackOff 보기
- 로그 검색 배우기
- Go 템플릿 배우기
- 파드 상태와 파드 phase 배우기
- 컨테이너 상태 배우기