이번 글은 쿠버네티스 job에러가 발생했을 때, 유용하게 에러를 처리할 수 있는 방법을 소개합니다. 혹시 쿠버네티스 job에 대해 모르신 분은 이전 글(https://malwareanalysis.tistory.com/151)을 참고해주시길 바랍니다.
1. 들어가며
공식문서(https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup)에도 언급하고 있는 것처럼 쿠버네티스 job이 실패했을 때, 어떻게 에러처리를 할지는 매우 중요한 문제입니다. 상황마다 에러 처리하는 방법이 다르므로 어느 에러처리방법이 정답이라는 것은 없습니다.
이 글의 에러처리 시나리오는 다음과 같습니다.
- job에러가 발생해도 정상종료로 인식
2. 실습1 - 디폴트 설정
제가 만든 파이썬 스크립트를 사용해서 job을 실행할 것입니다. 도커 이미지 "choisunguk/k8s-jobtest-error1:job1"를 사용하시면 됩니다.
파이썬 소스코드와 dockerfile 링크: https://github.com/choisungwook/kubernetes-job/tree/main/python/dockerfiles/job1
파이썬 소스코드는 강제로 에러를 발생시킵니다. 0으로 어떤 값을 나눠서 에러를 발생시켰습니다.
a = 1/0
job은 단순히 python 스크립트를 실행시킵니다.
apiVersion: batch/v1 kind: Job metadata: name: error-pythonjob-1 spec: template: spec: containers: - name: errorjob-python image: choisunguk/k8s-jobtest-error1:job1 restartPolicy: OnFailure
kubectl create명령어로 job을 실행합니다.
kubectl create -f <yaml>
restartPolicy가 onfailure이므로 job controller는 에러가 발생한 job pod를 다시 재실행합니다. RESTARTS가 0이 아니고 2로 변경되었죠?
3. 실습2 - 종료코드 설정
쿠버네티스 관리자는 개발자가 작성한 코드에서 에러가 발생해도 job이 정상종료되는 것을 원합니다
어떻게 해야할까요?
3.1 컨테이너 종료코드
정답은 소스코드에서 예외가 발생하면 종료코드를 0으로 넘겨주는 것입니다. 실행되고 있는 컨테이너 또한 리눅스 프로세스이므로 비정상종료되면 0이 아닌 종료코드를 가지게됩니다. job controller는 종료코드를 보고 컨테이너가 정상적으로 종료되었는지 판단하게 됩니다.
3.2 소스코드 변경
파이썬에서는 try~except로 예외처리를 할 수 있고 sys.exit함수로 종료코드를 전달할 수 있습니다. 아래 소스코드는 예외가 발생하면 종료코드를 0으로 전달합니다.
소스코드: https://github.com/choisungwook/kubernetes-job/blob/main/python/dockerfiles/job2/main.py
import sys import signal import subprocess if __name__=="__main__": try: a = 1/0 except Exception as e: print("sdfsdfsdf ") sys.exit(0)
3.3 job실행
제가 미리 만든 도커이미지(choisunguk/k8s-jobtest-error1:job2)를 사용해서 job을 생성합니다.
소스코드: https://github.com/choisungwook/kubernetes-job/blob/main/python/error-pythonjob-2.yaml
apiVersion: batch/v1 kind: Job metadata: name: error-pythonjob-2 spec: template: spec: containers: - name: errorjob-python image: choisunguk/k8s-jobtest-error1:job2 restartPolicy: OnFailure
kubectl create명령어로 job을 생성합니다.
kubectl create -f <yaml>
[그림 2]와 다르게 job이 성공적으로 실행되었습니다. job COMPLETIONS 1/1로 되어있고 pod STATUS가 Completed로 되어있습니다.
단순히 종료코드만 변경해줬는데 job실행여부를 성공으로 변경한 것입니다!
'전공영역 공부 기록' 카테고리의 다른 글
스프링시큐리티 인메모리 사용자 (0) | 2021.09.06 |
---|---|
파이썬 코딩테스트에서 input()과 sys.stdin.readline() 속도비교 (0) | 2021.08.28 |
쿠버네티스 잡(job) (0) | 2021.08.21 |
윈도우에서 미니큐브(minikube) 설치 (5) | 2021.08.21 |
SQL Achemy 2편 - ORM (0) | 2021.08.19 |