조금 평범한 개발 이야기

k8s 컨테이너가 종료될때 원인 파악하기 본문

개발/docker & k8s

k8s 컨테이너가 종료될때 원인 파악하기

jogeum 2021. 8. 6. 00:12

개요

k8s 는 클러스트 노드에 대한 장애 내성을 가지고 있어 문제가 있다고 판단하면 컨테이너를 재시작 합니다.

문제가 있다는 것을 판단하는 기준은 다양한데 k8s worker 문제가 있어 활성 프로브 (LivenessProbe) 의 응답을 제대로 받지 못하거나 OOM 에러와 같이 컨테이너가 필요한 메모리를 충분히 확보하지 못했을때 발생 됩니다.

이렇게 다양한 기준으로 컨테이너가 종료되는데 원인을 파악하는 방법에 대해서 알아 보도록 하겠습니다.


컨테이너 상태 확인하기

컨테이너가 재시작 되면 재시작되기 직전의 종료 상태가 컨테이너 설정에 남는데 이를 먼저 확인해 봅니다.

컨텍스트에 있는 파드 리스트를 확인해 보겠습니다.

(⎈ |jogeum-context:default)❯ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
...
app-deploy-7c9cdf4b8c-rkk5n        1/1     Running   1          8d
...

리스트를 보면 app-deploy-7c9cdf4b8c-rkk5n 파드가 1번 재시작 되었다고 나옵니다.

kubectl describe 명령을 사용하면 파드에 남은 종료 상태를 볼 수 있는데 이 명령으로 조금더 상세하게 확인해 보겠습니다.

(⎈ |jogeum-context:default)❯ kubectl describe pod app-deploy-7c9cdf4b8c-rkk5n
...
Containers:
  app:
    ...
    State:          Running
      Started:      Wed, 04 Aug 2021 02:01:32 +0900
    Last State:     Terminated
      Reason:       OOMKilled
      Exit Code:    137
      Started:      Mon, 26 Jul 2021 23:33:35 +0900
      Finished:     Wed, 04 Aug 2021 02:01:31 +0900
    Ready:          True
    Restart Count:  1
    ...

나열된 정보의 중간쯤을 보면 Containers.app.Last State.ReasonContainers.app.Last State.Exit Code 를 볼 수 있는데 각각 종료된 사유와 종료된 코드 정보를 확인 할 수 있습니다.

  • Containers.app.Last State.Reason : OOMKilled
  • Containers.app.Last State.Exit Code : 137

해당 정보를 분석해 보자면 컨테이너가 사용하기 위한 메모리가 부족해서 OOMKiller 가 해당 컨테이너를 죽였다는 것을 확인해 볼 수 있습니다.

이 경우에는 컨테이너 메모리를 늘려주기 위한 리소스 설정을 추가로 해주면 됩니다.


종료 상태 코드 알아 보기

컨테이너가 종료될때 남겨지는 exit code 를 보면 어떤 문제로 컨테이너가 실행이 되지 않았는지를 조금더 쉽게 분석 할 수 있습니다.

exit code 는 chroot exit code 정의를 따릅니다. 자세한 정보를 확인하고자 하시면 아래 링크를 통해 확인해 주세요.

종료 코드를 종류별로 살펴보자면 다음과 같습니다.

exit code 내용 설명
0 정상적으로 종료 SIGTERM 에 의해 정상적으로 잘 종료
1 오류로 종료 컨테이너가 실행되지 못하고 종료 될때
- 클러스터 노드가 문제가 있는 경우
2 애플리케이션 문제로 종료 컨테이너가 실행될때 종료
- 컨테이너 이미지가 정상적으로 생성 되었는지 확인이 필요
126 커맨드 실행 실패 정상적인 커맨드를 호출 했지만 실패하는 경우
- 아직 컨테이너가 (권한, 설정) 등의 이유로 정상화되지 않았을때
127 실행한 커맨드가 없을 경우 아직 컨테이너가 정상화되지 않았거나 잘못된 커맨드를 사용할 경우
128 + n 리눅스 시그널에 의한 종료  
130 = (128 + 2) 컨테이너가 (SIGINT : 2) 명령으로 종료 인터럽트 루틴 (Control-C)에 의해 종료
- 개발자가 의도적으로 종료시키는 경우
137 = (128 + 9) 컨테이너가 (SIGKILL : 9) 명령으로 종료 137 종료 코드가 발생 되는 경우 
(대부분 에러 코드가 여기에 해당)

1. 컨테이너의 메모리 부족으로 종료 되었을때 
2. OOMKiller 가 강제로 종료 시켰을때
3. 활성 프로브(LivenessProbe) 에 응답이 없을때
143 = (128 + 15) 컨테이너가 (SIGTERM : 15) 명령으로 종료  

 

'개발 > docker & k8s' 카테고리의 다른 글

k8s, docker 에서 jvm 설정 최적화 하기  (0) 2021.07.24
k8s 리소스 제한 하기  (0) 2021.07.24
KUBERNETES DASHBOARD 사용하기  (3) 2019.10.15
Comments