Container/Kubernetes

[Kubernetes] 쿠버네티스 디플로이먼트(Deployment) 개념 (생성, 확인, 업데이트, 롤백, 롤아웃 기록 조회, 일시 중지, 시작, 재시작)

Nirsa 2020. 2. 17. 18:02
반응형

 

  • 디플로이먼트(Deployment) 란?

디플로이먼트는 레플리카셋의 상위 개념으로 볼 수도 있습니다. 레플리카셋을 생성하는 디플로이먼트를 정의할 수 있고, 배포 작업을 좀 더 세분화(롤링 업데이트 등) 하여 조작할 수 있는 기능을 가지고 있습니다.

이러한 이유로 레플리카셋만 사용하는것 보다는 디플로이먼트를 사용하는 추세라고 합니다.

 

  • 디플로이먼트 생성 및 확인

우선 기본적인 디플로이먼트를 생성 하겠습니다. 아래 코드를 저장해주시고 저는 경로 "/root/kubespray/inventory/test/deployment" 에 test-deployment.yaml 로 저장 하였습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-deployment
  labels:
    app: test-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: test-deployment
  template:
    metadata:
      labels:
        app: test-deployment
    spec:
      containers:
      - name: test-deployment
        image: nginx:1.7.9
        ports:
        - containerPort: 80
  • apiVersion apps/v1 → 쿠버네티스의 apps/v1 API를 사용 합니다.
  • kind: Deployment → Deployment의 작업으로 명시 합니다.
  • metadata.name → Deployment의 이름을 설정 합니다.
  • metadata.labels.app → Deployment의 레이블을 설정 합니다.
  • spec.replicas → 파드의 개수를 몇개 유지할 것 인지 설정 합니다. 기본값은 1 입니다.
  • spec.selector → 어떤 레이블의 파드를 선택하여 관리할지에 대한 설정 입니다. 앱 컨테이너의 test-deployment 레이블을 식별하여 해당되는 파드들을 관리하며, 이 필드가 없을 경우 spec.template.metadata.labels에 설정된 내용들을 기본값으로 사용 합니다.
  • spec.template.metadata → 어떤 파드를 실행할지에 대한 정보를 하위에 설정 합니다.
  • spec.template.metadata.name → 생성될 파드의 이름을 지정 합니다.
  • spec.template.metadata.labels.app:test-deployment → 식별하는 레이블이 앱 컨테이너이며 test-deployment 으로 식별 합니다.
  • spec.spec → 이 하위의 옵션들은 컨테이너에 대한 설정을 합니다. 위 코드에선 컨테이너 명, 이미지, 포트를 지정 했습니다.

 

마찬가지로 kubectl apply -f [파일명] 으로 생성 후 kubectl get deployment,replicaset,pods 를 입력하여 조회를 해보겠습니다.

디플로이먼트를 생성했더니 레플리카셋 한개와 3개의 파드가 생성 되었습니다. 디플로이먼트는 레플리카셋을 좀 더 효율적으로 배포하기 위해 사용되므로 기본적으로 디플로이먼트 생성하면 레플리카셋도 같이 생성 되기 때문에 파드 개수유지를 보증 합니다.

기본적인 코드긴 하지만 사실 레플리카셋과 디플로이먼트 yaml 파일을 비교해봐도 kind와 replicas, selector가 spec 하위 옵션으로 들어갓다는거 말고는 거의 차이가 없습니다.

 

  • 디플로이먼트 업데이트

디플로이먼트를 사용하여 이미지의 버전을 업데이트하거나 할 수 있습니다. 명령 사용 방법은 아래와 같습니다.

  • kubectl set image deployment/[디플로이먼트이름] [컨테이너이름]=[이미지]:[버전]

 

가장 처음 사용했던 코드에서 해당되는 부분은 아래와 같으며 빨간색은 디플로이먼트 이름, 파란색은 컨테이너와 이미지,버전 입니다. 이제 확인되었으면 명령어를 입력하여 실제로 업데이트가 되는지 확인 해보면 됩니다.

저는 kubectl set image deployment/test-deployment test-deployment=nginx:1.9.1 을 사용하여 기존에 있던 nginx 1.7.9 버전을 ngixn 1.9.1 버전으로 업데이트 하였습니다.

 

이미지와 같이 새로운 레플리카셋, 파드가 생성되며 기존의 레플리카셋(96bc7dbd9)은 0/0/0 상태가 되어 비활성화로 변경 됩니다. 좀 더 자세히 확인하고 싶다면 kubectl describe deployments 를 입력해보면 아래와 같이 확인해볼 수 있습니다.

 

  • 디플로이먼트 롤백 및 롤아웃 기록 조회

디플로이먼트를 이용하여 이전 작업으로 되돌아가거나, 작업했던 기록을 살펴볼 수 있습니다. 롤아웃 기록은 기본적으로 10까지 저장하며 더 많은 기록을 저장하기 위해서는 따로 설정이 필요 합니다. 롤아웃 기록 조회 명령은 아래와 같습니다.

  • kubectl rollout history deployment [디플로이먼트 이름]

그럼 위와 같은 메세지가 출력 되는데 현재 CHANGE-CAUSE는 따로 입력한적이 없으므로 none 으로 표시되고 가장 최근에한 작업이 2번(REVISION)이라는것을 알 수 있습니다.

 

롤백할때는 아래 명령어를 입력하시면 되며, 저는 최근에 한 작업이 2번이니 그보다 전인 1번으로 되돌아 가겠습니다.

  • kubectl rollout undo deployment [디플로이먼트 이름] --to-revision=[숫자]

롤백한 후 파드 하나는 종료중이며 새로운 파드 3개가 생성 및 이미지 버전을 1.9.1로 업그레이드 후 비활성화 되었던 레플리카셋(96bc7dbd9)이 다시 활성화 상태로 변경된걸 확인할 수 있습니다. kubectl describe deployments 를 입력해서 자세한 내용을 확인하면 다시 이미지 버전이 1.7.9로 변경된것을 확인할 수 있습니다.

 

  • 디플로이먼트 롤아웃 기록에 CHANGE-CAUSE를 남겨서 버전 기록하기

kubectl edit deployment [디플로이먼트 이름] 을 입력하여 vi 편집기로 진입 합니다. 이후 가장 상단에 있는 metadata.annotations에 kubernetes.io/change-cause: [기록할 단어] 를 입력한 후 :wq 로 저장하고 나오면 끝 입니다.

이제 롤백을 진행하면 아래와 같이 CHANGE-CAUSE에 기록이 남는걸 보실 수 있고, 아래 이미지의 경우 테스트하는 과정에서 히스토리가 남아 생긴겁니다. 이와 같이 버전을 남겨서 기록을 관리할 수 있습니다.

 

  • 디플로이먼트 일시 중지, 시작, 재시작

쿠버네티스의 디플로이먼트는 배포 작업을 잠시 일시 중지 시켰다가 시작할수도, 아예 재시작 할수도 있습니다.

  • 배포 일시 중지 : kubectl rollout pause deployment/[디플로이먼트 이름]
  • 배포 시작 : kubectl rollout resume deployment/[디플로이먼트 이름]

아래와 같이 디플로이먼트의 배포 작업을 일시중지 후 이미지 버전을 1.8.9 버전으로 업데이트를 해보고나서 히스토리 기록을 봣을 땐 남아있지 않습니다. resum 으로 배포를 다시 시작하면 히스토리 기록에 생기는것을 볼 수 있습니다. (CHANGE-CAUSE는 따로 변경해주지 않았으므로 version 1.9.1 로 남았습니다)

위에선 일부로 아무 버전이나 입력하였는데, 존재하지 않는 버전을 입력할 경우 파드에 ImagePullBackOFF 상태가 발생하여 정상적으로 실행되지 않으니 참고 해주세요.

 

또한 아예 전체 파드 재시작이 필요한 경우 아래 명령어를 입력하면 됩니다.

  • kubectl rollout restart deployment/[디플로이먼트 이름]

위의 사진은 재시작 후 파드들이 생성/삭제되는 과정 입니다. 디플로이먼트 재시작 시 아래와 같은 과정을 거치는것을 확인할 수 있습니다.

  1. 새로운 레플리카셋 생성
  2. 새로운 파드 생성
  3. 기존 파드 종료
  4. 기존 레플리카셋 비활성화

 

반응형