Docker & Kubernetes

디플로이먼트 컨트롤러(Deployment Controller)에 의한 파드(Pod) 실행

beekei 2022. 1. 30. 16:46
반응형

kubectl run에 옵션을 지정하면 파드를 디플로이먼트 컨트롤러 제어 하에 실행하는 것이 가능하다.  파드가 정지되었을 때 재기동시킬 필요가 있는지에 따라 옵션을 주면 된다.

이때 사용하는 옵션이 --restart=Always다. 반대로 파드만 독립적으로 실행하고 싶을 때는 --restart=Never 옵션을 주면 된다.

--restart 옵션을 생략하면 기본값으로 Always로 실행된다. 즉 기본 적으로 디플로이먼트 컨트롤러에 의해 파드가 기동 된다.

 

 

디플로이먼트 컨트롤러 제어 하에 실행하는 방법은 아래와 같다.

kubectl에 run은 서브 커맨드의 기능이 지나치게 방대해지는 것을 막기 위해 파드 자체를 만들 때만 run을 사용하고 디플로이먼트를 만들 때는 kubectl create deployment 명령어를 사용한다.

 

kubectl get all 명령어를 사용하면 디플로이먼트가 만든 모든 오브젝트를 확인할 수 있다.

  • pod/hello-world-d758f5675-qgxj2
    파드 안에는 하나 혹은 여러 개의 컨테이너가 실행된다. 여기서는 hello-world-d758f5675-qgxj2라는 이름을 부여받았다.
    리플리카셋 오브젝트의 이름 뒤에 추가적인 해시 문자열이 추가되어 역시 유일한 이름을 부여받는다.


  • deployment.apps/hello-world
    만들어진 디플로이먼트 오브젝트의 이름은 hello-world다. 이 컨트롤러는 레플리카셋 컨트롤러와 함께 파드를 관리하며 이미지의 버전, 파드의 개수 등이 목표 상태가 되도록 관리한다.

  • replicaset.apps/hello-world-d758f5675
    디플로이먼트와 함께 만들어진 리플리카셋 오브젝트의 이름은 hello-world-d758f5675이다.
    디플로이먼트 오브젝트의 이름 뒤에 해시 문자열이 붙어 유일한 이름을 부여받는다. 레플리카셋은 디플로이먼트와 함께 파드의 수가 지정한 개수가 되도록 제어한다. 유저가 직접 레플리카셋을 조작하는 것은 권장하지 않는다.

kubectl logs 파드명 명령어를 사용하면 해당 컨테이너가 출력한 메세지를 확인할 수 있다.

 

kubectl get deploy,po 명령어를 사용하면 디플로이먼트와 파드 오브젝트의 목록을 출력한다.

출력 항목에 대한 설명은 아래와 같다.

 

kubectl get deployment 출력 항목

항목명 설명
NAME 디플로이먼트의 오브젝트명
DESIRED 희망 파드 개수, 디플로이먼트를 만들 때 설정한 파드 수
CURRENT 현재 실행중인 파드의 개수, 재기동 대기 등을 포함한 모든 파드의 수
UP-TO-DATE 최근에 업데이트된 파드의 개수, 즉 컨트롤러에 의해 조정된 파드의 수
AVAILABLE 사용 가능한 파드 개수, 즉 정성적으로 기동되어 서비스 가능한 파드 수
AGE 오브젝트가 만들어진 후 경과 시간

kubectl get po(pod) 출력 항목

항목명 설명
NAME 파드의 오브젝트명
READY 기동 완료 수, 분자와 분모의 형태로 숫자가 표시. 문자 측은 파드 내의 컨테이너가 기동된 개수이며, 분모 측은 파드 내의 정의한 컨테이너의 총 개수

즉 0/1의 의미는 파드에 컨테이너가 하나 정의되었으나 기동하지 않았음을 의미
STATUS 파드의 상태
RESTARTS 파드가 재시작된 횟수
AGE 파드 오브젝트가 만들어진 후 경과 시간

kubectl run을 실행할 때 옵션 --replicas를 생략했기 때문에 기본값으로 1이 설정되었다.

그리고 AVAILABLE 칼럼의 값은 0이라고 나오는데 이는 파드가 기동에 실패했음을 의미한다. STATUS를 보면 CrashLoopBackOff라고 표시되어 있는데, 이는 hello-world 파드가 어떤 문제 때문에 재시작을 반복하고 있는 상태임을 의미한다.

hello-world 컨테이너에 경우 메세지를 출력하고 바로 종료한다. 하지만 디플로이먼트는 자동으로 파드를 재기동하면서 CrashLoopBackOff 상태가 된 것이다. 고로 hello-world 컨테이너는 디플로이먼트 컨트롤러에 맞지 않는 워크로드를 가진다고 볼 수 있다.

 

예제를 위해 설치한 hello-world 컨트롤러는 디플로이먼트 컨트롤러와 맞지 않으니 삭제를 해야겠다.

kubectl delete deployment 오브젝트명 명령어를 실행하면 디플로이먼트와 리플리카셋 동시에 삭제된다.

 

 

 

그럼 hello-world 컨테이너처럼 종료되는 컨테이너가 아니라 계속 지속되는 nginx 웹서버 파드를 여러개 기동시켜보자.

--replicas 옵션을 사용해 5개의 nginx 웹서버를 기동해보았다.

여기서 하나의 웹서버를 지워보겠다.

첫번째 222wl 파드를 삭제했지만 다시 확인해보면 자동으로 7m8bf 이름의 파드가 생성된 것을 알 수 있다.

여기서 이름이 다른것을 주목해야 한다. 파드는 일시적인 존재로 그 자체가 되살아난 것이 아니라 새로운 파드가 만들어진 것이다. 따라서 컨테이너의 애플리케이션은 기본적으로 상태가 없어야(stateless) 한다.

반응형