Contianer Exit Code 톺아보기

xgro·2023년 2월 2일
1

Kubernetes

목록 보기
3/3

📌 Summary

  • 컨테이너 종료시 exit code를 이해하여 문제 발생시 파드의 오류 원인을 보다 쉽게 찾을 수 있습니다.

📌 컨테이너 종료 코드란?

Exit code는 컨테이너가 종료될 때, 종료에 대한 원인을 보고하기 위해 컨테이너 엔진에서 사용됩니다.

The most common exit codes used by containers are:

CODE #NAMEWHAT IT MEANS
Exit Code 0Purposely stoppedUsed by developers to indicate that the container was automatically stopped
Exit Code 1Application errorContainer was stopped due to application error or incorrect reference in the image specification
Exit Code 125Container failed to run errorThe docker run command did not execute successfully
Exit Code 126Command invoke errorA command specified in the image specification could not be invoked
Exit Code 127File or directory not foundFile or directory specified in the image specification was not found
Exit Code 128Invalid argument used on exitExit was triggered with an invalid exit code (valid codes are integers between 0-255)
Exit Code 134Abnormal termination (SIGABRT)The container aborted itself using the abort() function.
Exit Code 137Immediate termination (https://komodor.com/learn/what-is-sigkill-signal-9-fast-termination-of-linux-containers/)Container was immediately terminated by the operating system via SIGKILL signal
Exit Code 139Segmentation fault (https://komodor.com/learn/sigsegv-segmentation-faults-signal-11-exit-code-139/)Container attempted to access memory that was not assigned to it and was terminated
Exit Code 143Graceful termination (https://komodor.com/learn/sigterm-signal-15-exit-code-143-linux-graceful-termination/)Container received warning that it was about to be terminated, then terminated
Exit Code 255Exit Status Out Of RangeContainer exited, returning an exit code outside the acceptable range, meaning the cause of the error is not known

📌 컨테이너 수명주기

컨테이너 failure 에 대해서 보다 깊이 이해하기 위해, 컨테이너의 수명 주기에 대해서 정리해보겠습니다.

  • Created – 컨테이너가 생성되었지만, 아직 시작하지 않은상태 입니다.
  • Up – 컨테이너가 실행중입니다. 이것은 OS 프로세스 관리에 의해 컨테이너가 실행중임을 의미합니다.
  • Paused – 컨테이너가 실행중이지만, 요청에 의해 중지된 상태입니다.
  • Exited – 컨테이너 프로세스가 kill 되었으므로, 컨테이너가 Terminate된 상태입니다.

👉 Trubleshooting

컨테이너가 Exited 상태가 되었을때, 종료 코드를 확인하여 빠르게 원인을 파악할 수 있습니다.

✅ Exit Code 0: Purposely stopped

해당 코드는 작업이 완료되고 나서 사용자에 의해 의도적으로 컨테이너가 중지 되었을때 트리거 됩니다.


⛔ Exit Code 1: Application error

종료 코드 1은 다음 중 하나의 사유로 인하여 컨테이너가 중지되었음을 나타냅니다.

  1. Application error
    어플리케이션 자체에 문제가 있는 경우 또는 런타임 환경에 에러가 있는 경우 발생할 수 있습니다.

  2. 잘못된 참조, An invaild reference
    예를들어 어플리케이션에서 사용하조가 하는 파일이 컨테이너 이미지 안에 존재 하지 않는 경우 발생할 수 있습니다.


✅ Exit Code 125: 도커 명령어가 실패한 경우

도커 명령어가 잘못 실행되어 수행이 실패했을때 발생합니다.


✅ Exit Code 126: 명령 호출 오류

종료 코드 126은 컨테이너 specification에 명시된 명령을 호출 할 수 없음을 의미합니다.

이 에러는 컨테이너를 실행하는데 필요한 CI 스크립트 오류로 발생하거나, missing dependency 로 인해 발생합니다.


✅ Exit Code 127: 파일 또는 디렉토리를 찾을 수 없음

컨테이너의 사양에 지정된 명령이 존재하지 않는 파일이나 디렉토리를 참조할 경우 발생합니다.

실패한 컨테이너의 명령을 확인하고 이미지를 수정합니다.


✅ Exit Code 128: 종료시 잘못된 인수 사용

컨테이너 내의 코드가 종료명령을 트리거 하여 종료 되었지만, 유효한 종료코드를 반환하지 않을 경우 발생합니다.


✅ Exit Code 128+n: 리눅스 시그널에 해당하는 오류가 발생하는 경우


⛔ Exit Code 137(128+9): SIGKILL kill -9

종료 코드 137은 컨테이너가 호스트 운영 체제에서 SIGKILL 신호를 수신했음을 의미합니다. 
이 신호는 유예 기간 없이 프로세스를 즉시 종료하도록 지시합니다. 

다음 중 하나일 수 있습니다.

  • 예를 들어 docker kill 명령을 사용할 때와 같이 컨테이너 엔진을 통해 컨테이너가 종료될 때 트리거됩니다.
  • 프로세스에 kill -9 명령을 보내는 Linux 사용자에 의해 트리거 됩니다.
  • 컨테이너 종료를 시도하고 30초의 유예 기간(기본값)을 기다린 후 Kubernetes에 의해 트리거 됩니다.
  • 일반적으로 메모리 부족으로 인해 호스트에 의해 자동으로 트리거됩니다. 이 경우 docker명령은 inspectOOMKilled 오류를 나타냅니다.

✅ Exit Code 143(128+15): SIGTERM

종료 코드 143은 컨테이너가 운영 체제로부터 컨테이너를 정상적으로 종료하도록 요청하는 SIGTERM 신호를 수신했으며 컨테이너가 정상적으로 종료되었음을 의미합니다(그렇지 않으면 종료 코드 137이 표시됨). 

이 종료 코드는 다음과 같을 수 있습니다.

  • docker stop 또는 docker-compose down명령을 사용할 때 컨테이너를 중지하는 컨테이너 엔진에 의해 트리거 됩니다.
  • Kubernetes에 의해 Terminating 상태로 트리거 된 Pod에 의해 발생합니다. 이 상태는 컨테이너가 정상적으로 종료될 수 있도록 30초의 기간을 제공합니다.

컨테이너가 종료 코드 143으로 종료되면 어떻게 해야 합니까?

운영 체제가 SIGTERM 신호를 보낸 컨텍스트를 보려면 호스트 로그를 확인하십시오. Kubernetes를 사용하는 경우 kubelet 로그를 확인하여 포드가 종료되었는지 여부와 종료 시점을 확인하십시오.

일반적으로 종료 코드 143에는 문제 해결이 필요하지 않습니다. 이는 컨테이너가 호스트의 지시에 따라 적절하게 종료되었음을 의미합니다.


📌 Conclusion

컨테이너 기반 인프라를 운영하면서, exit code에 따른 대처를 할 수 있습니다.

쿠버네티스에서는 kubectl describe pod [name] 명령을 이용하여 파드의 종료 코드를 확인할 수 있습니다.

$ kubectl describe pod [name]

Containers:
kubedns:
Container ID: ...
Image: ...
Image ID: ...
Ports: ...
Host Ports: ...
Args: ...
State: Running
   Started: Fri, 15 Oct 2021 12:06:01 +0800
Last State: Terminated
   Reason: Error
   Exit Code: 255
   Started: Fri, 15 Oct 2021 11:43:42 +0800
   Finished: Fri, 15 Oct 2021 12:05:17 +0800
Ready: True
Restart Count: 1

Exit Code 0인 경우 - 컨테이너가 정상적으로 종료되었기 때문에 추가적인 조치를 취할 필요가 없습니다.

Exit Code 1~128 - 컨테이너 Spec에 누락된 부분이 있거나 잘못된 명령과 같은 내부 오류로 인해 종료되었으므로 컨테이너 이미지를 확인하여 문제를 해결합니다.

Exit Code 129~255 - SIGKILL 또는 SIGTERM과 같은 리눅스 명령어로 인해 종료되었으므로 노드와 같은 시스템을 점검합니다.


📌 Reference

profile
안녕하세요! DevOps 엔지니어 이재찬입니다. 블로그에 대한 피드백은 언제나 환영합니다! 기술, 개발, 운영에 관한 다양한 주제로 함께 나누며, 더 나은 협업과 효율적인 개발 환경을 만드는 과정에 대해 인사이트를 나누고 싶습니다. 함께 여행하는 기분으로, 즐겁게 읽어주시면 감사하겠습니다! 🚀

0개의 댓글