티스토리 뷰

728x90
반응형

디플로이먼트(Deployment): 레플리카셋, 포드의 배포를 관리

디플로이먼트 사용하기

실제 쿠버네티스 운영 환경에서 레플리카셋을 YAML 파일에서 사용하는 경우는 거의 없고, 대부분 레플리카셋과 포드의 정보를 정의하는 디플로이먼트(Deployment)라는 이름의 오브젝트를 YAML 파일에 정의해 사용한다.

디플로이먼트는 레플리카셋의 상위 오브젝트이기 때문에 디플로이먼트를 생성하면 해당 디플로이먼트에 대응하는 레플리카셋도 함께 생성된다.

# vi deployment-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-nginx
  template:
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80
$ kubectl apply -f deployment-nginx.yaml
deployment.apps/my-nginx-deployment created

$ kubectl get deploy
# 시간 좀 지나야지 3/3뜸

$ kubectl get replicasets
$ kubectl get pods
# 디플로이먼트를 생성하면 레플리카셋과 포드도 자동으로 만들어져 있다.

$ kubectl delete deploy my-nginx-deployment
# 디플로이먼트 삭제

디플로이먼트로부터 생성된 레플리카셋과 포드는 특이한 해시값을 포함한 이름으로 생성된다(해시값에 대해서는 디플로이먼트를 사용하는 이유에서 다룰 예정).



디플로이먼트를 사용하는 이유

디플로이먼트를 사용하는 핵심적인 이유 중 하나는 애플리케이션의 업데이트와 배포를 더욱 편하게 만들기 위해서이다. Deployment라는 이름의 Deploy 단어의 뜻이 나타내는 것처럼 디플로이먼트는 컨테이너 애플리케이션을 배포하고 관리하는 역할을 담당한다. 예를 들어 애플리케이션을 업데이트할 때 레플리카셋의 변경 사항을 저장하는 리비전(revision)을 남겨 롤백을 가능하게 해주고, 무중단 서비스를 위해 포드의 롤링 업데이트의 전략을 지정할 수도 있다.

디플로이먼트를 이용해 애플리케이션의 버전을 업데이트해 배포하는 간단한 예시를 해보자. 이전에 만든 deployment-nginx.yaml 파일로 디플로이먼트를 생성하되, 이번에는 --record라고 하는 조금 특수한 옵션을 추가한다.

$ kubectl apply -f deployment-nginx.yaml --record 
deployment.apps/my-nginx-deploment created

컨테이너 애플리케이션의 버전이 업데이트되어 포드의 이미지를 변경해야 한다고 가정해보자. 이 때 디플로이먼트에서 생성된 포드의 이미지를 변경할 때는 kubectl set image 명령어를 사용할 수 있다. nginx 이미지를 1.11로 변경해보자.

$ kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record

이전 포스팅에서 나오는 kubectl edit 명령어를 사용해도 된다.

$ kubectl get po
NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-556b57945d-2mgdm   1/1     Running   0          22s
my-nginx-deployment-556b57945d-cvjdz   1/1     Running   0          55s
my-nginx-deployment-556b57945d-prsjx   1/1     Running   0          27s

$ kubectl get rs 
NAME                             DESIRED   CURRENT   READY   AGE
my-nginx-deployment-556b57945d   3         3         3       66s
my-nginx-deployment-7484748b57   0         0         0       7m39s

포드는 이전의 포드들이 삭제되고, 새롭게 포드가 생성된다. 그런데 레플리카셋은 2개이다.

디플로이먼트는 포드의 정보를 업데이트 함으로써 새로운 레플리카셋과 포드를 생성했음에도 불구하고 이전 버전의 레플리카셋을 삭제하지 않고 남겨두고 있다. 즉, 디플로이먼트는 포드의 정보가 변경되어 업데이트가 발생했을 때, 이전의 정보를 리비전으로서 보존한다. 이러한 리비전 정보는 다음 명령어로 확인할 수 있다.

$ kubectl rollout history deployment my-nginx-deployment
deployment.apps/my-nginx-deployment
REVISION  CHANGE-CAUSE
2         kubectl set image deployment my-nginx-deployment nginx=nginx:1.11 --record=true
3         kubectl apply --filename=deployment_nginx.yaml --record=true
# 한번 롤백해서 revision이 2, 3이다.

--record=true 옵션으로 디플로이먼트를 변경하면 변경 사항을 위와 같이 디플로이먼트에 기록함으로써 해당 버전의 레플리카셋을 보존한다. 만약 이전 버전의 레플리카셋으로 되돌리는 롤백을 하고 싶다면 다음의 명령어를 사용하면 된다. --to-revision에 되돌리려는 리비전의 번호를 입력한다.

$ kubectl rollout undo deployment my-nginx-deployment --to-revision=1

위의 명령어를 실행한 뒤 다시 레플리카셋의 목록을 확인해 보면 처음에 생성했던 레플리카셋이 다시 3개의 포드를 생성하고 있는 것을 알 수 있다. 방금 새롭게 생성됐던 레플리카셋의 포드수는 0으로 줄어들어 있다.

쿠버네티스 리소스의 자세한 정보를 출력하는 kubectl describe 명령어를 사용해 디플로이먼트의 정보를 출력해 보면 현재의 레플리카셋 리비전 정보와 활성화된 레플리카셋 이름을 확인할 수 있다.

$ kubectl describe deploy my-nginx-deployment
Name:                   my-nginx-deployment
Namespace:              default
CreationTimestamp:      Thu, 22 Jul 2021 22:24:46 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 3
...
...

이처럼 디플로이먼트는 여러 개의 레플리카셋을 관리하기 위한 상위 오브젝트이다. 디플로이먼트를 사용하면 이러한 레플리카셋의 리비전 관리뿐만 아니라 다양한 포드의 롤링 업데이트 정책을 사용할 수도 있다는 장점이 있다. 따라서 쿠버네티스에서도 공식적으로 디플로이먼트를 사용할 것을 권장하고 있다.

디플로이먼트는 레플리카셋의 상위 수준의 오브젝트이며, 일반적으로 디플로이먼트를 통해 포드를 생성한다는 것을 기억하자.

참고

지금까지 테스트한 모든 리소스들을 정리하는 명령어이다.

$ kubectl delete deployment,pod,rs --all





출처
시작하세요! 도커/쿠버네티스(용찬호 저, 위키북스)
example

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday
링크