컨트롤러에 의한 파드 실행
kubectl run에 옵션을 지정하면
파드를 디플로이먼트 컨트롤러의 제어하에 실행하는하려면 옵션 --restart=Always을 주면된다.(기본값 Always)
파드만 독립적으로 실행하고 싶을 때는 --restart=Never 옵션을 주면된다.
파드가 정지되었을 때 재기동 시킬 필요가 있는지에 따라 옵션을 정하면 되겠다.
디플로이먼트 컨트롤러에 의해 파드가 기동될때는 백그라운드로 실행되기 때문에 -it 옵션은 무시된다.
kubectl run 서브 커맨드의 기능이 지나치게 방대해지는 것을 막기 위해 파드 자체를 만들때만 run을 사용하는 것이 추천되고 있다.
디플로이먼트를 먼들 때는 kubectl create deployment --image hello-world hello-world를 사용한다.
디플로이먼트 상태를 출력해 확인해 보자.
- pod/hello-world-d758f5675-2vfbz
파드 안에는 하나 혹은 여러 개의 컨테이너가 실행된다.
리플리카셋 오브젝트의 이름 뒤에 추가적인 해시 문자열이 추가되어 유일한 이름을 부여받는다. - deployment.apps/hello-world
만들어진 디플로이먼트(deployment) 오브젝트의 이름은 hello-world다.
이 컨트롤러는 레플리카셋 컨트롤러와 함께 파드를 관리하여 이미지의 버전, 파드의 개수 등이 목표 상태가 되도록 관리한다. - replicaset.apps/hello-world-d758f5675
디플로이먼트와 함께 만들어진 레플리카셋 오브젝트의 이름은 hello-world-d758f5675이다.
디플로이먼트 오브젝트의 이름 뒤에 해시 문자열이 붙어 유일한 이름을 부여받는다.
레플리카셋은 디플로이먼트와 함께 파드의 수가 지정한 개수가 되도록 제어한다.
유저가 직접 레플리카셋을 조작하는것은 권장되지 않는다.
hello-world 컨테이너가 디플로이먼트에 의해 어떻게 제어되는지 알아보겠다.
명령어 kubectl get deploy,po는 디플로이먼트와 파드 오브젝트의 목록을 출력한다.
kubectl get deployment(deploy) 명령어 결과 항목의 의미는 다음과 같다.
항목명 | 설명 |
NAME | 디플로이먼트의 오브젝트명 |
DESIRED | 희망 파드 개수, 디플로이먼트를 만들 때 설정한 파드 수(생략 시 1) |
CURRENT | 현재 실행 중인 파드의 개수. 재기동 대기 등을 포함한 모든 파드 수 |
UP-TO-DATE | 최근에 업데이트된 파드의 개수, 컨트롤러에 의해 조정된 파드 수 |
AVAILABLE | 사용 가능한 파드 개수, 정상적으로 기동되어 서비스 가능한 파드 수 |
AGE | 오브젝트가 만들어진 후 경과 시간 |
kubectl get pod(po) 명령어 결과 항목의 의미는 다음과 같다.
항목명 | 설명 |
NAME | 파드의 오브젝트명 |
READY | 기동 완료 수, 분자와 분모의 형태로 숫자가 표시, 분자 측은 파드 내의 컨테이너가 기동된 개수이며, 분모 측은 파드 내의 정의한 컨테이너의 총 개수, 즉 0/1의 의미는 파드에 컨테이너가 하나 정의되었으나 기동하지 않았음을 의미 |
STATUS | 파드의 상태, CrashLoopBackOff라는 것은 컨테이너가 재시작을 반복하며 다음 재시작 전에 대기하고 있는 상태를 의미, 컨테이너를 기동할 때 리눅스의 프로세스 관리로 인해 CPU 부하가 많이 발생, 따라서 문제 상황에서 계속된 반복에 의한 CPU 과부하는 막기 위해 일정 간격을 두고 재시작 실행 |
RESTARTS | 파드가 재시작된 횟수 |
AGE | 파드 오브젝트가 만들어진 후 경과 시간 |
파드가 예외에 의해 재시작을 계속한다는 것은 무슨 의미일까?
디플로이먼트로 관리되는 파드들은 보통 웹 서버나 앱 서버처럼 상시로 가동되어야 하는 경우가 많다.
그런데 컨테이너 hello-world는 메세지를 출력하고 바로 종료하기 때문에 디플로이먼트가 몇 번이나 파드를 재시작하면서 STATUS가 CrashLoopBackOff가 되어 대기 상태가 된 것이다.
디플로이먼트는 관리중인 파드가 종료되면, 지정된 파드의 개수를 유지하기 위해 파드를 재기동한다.
따라서 처음부터 컨테이너 hello-world는 디플로이먼트 컨트롤러에 맞지 않는 워크로드를 가진다고 볼 수 있다.
그러니 hello-world를 지우고, 디플로이먼트에 적합한 워크로드를 가지는 파드를 만들어 보자.
이번에는 웹 서버의 파드를 5개 기동해보겠다.
하나의 웹 서버 파드를 지워 보자.
파드가 삭제되자 새로운 파드가 자동으로 만들어지는 것을 확인할 수 있다.
앞서 조회했던 파드의 이름과 새로 만들어진 파드의 이름이 다른데 이는 파드는 일시적인 존재로 그 자체가 되살아난 것이 아니라 새로운 파드가 만들어진 것이다.
따라서 컨테이너의 애플리케이션은 기본적으로 상태가 없어야 한다.
지금까지 만든 오브젝트들(디플로이먼트, 레플리카셋, 파드)을 지우는 방법은 다음과 같다.
쿠버네티스를 사용할 때는 워크로드의 특성의 맞게 컨트롤러를 선택하는 것이 중요하다.