kubernetes started(4) 디플로이먼트(Deployment)

2020. 2. 15. 16:27devops/kubernetes

Deployment는 reflica의 상위 오브젝트입니다. 보통 디플로이먼트가 생성되면 해당 디플로이먼트에 대응하는  레플리카셋도 함께 생성됩니다. 따라서 디플로이먼트를 사용하면 포드와 레플리카셋을 직접 생성할 필요가 없습니다. 

 

deployment  yaml 생성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: replicaset-nginx
spec:
  replicas: 4
  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

확인

kubectl get deploy                                                                                                                                                                                     1 ↵  11644  15:54:10
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
replicaset-nginx   4/4     4            4           3m10s

kubectl delete deploy my-nginx-deployment

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

레플리카셋만을 사용하지 않고 디플로이먼트를 이용하는 이유는 애플리케이션을 배포하고 사용하는데 많은 도움을 줍니다. 예를 들어 업데이트할 때 리비전을 남여 롤백을 가능하게 해주고 롤링 업데이트를 지정할수도 있습니다.  --record 옵션을 사용하여 replica-nginx를 만듭니다. 

kubectl apply -f replicasets-nginx.yaml --record                                                                                                                                                         ✔  11645  15:54:12
deployment.apps/replicaset-nginx configured

그러고 나서 이미지의 버전을 업데이트 해보겠습니다. 이때는 set image 명령어를 사용합니다. 

kubectl set image deployment replicaset-nginx nginx=nginx:1.11 --record
deployment.extensions/replicaset-nginx image updated

레플리카 결과를 보면 아래와 같다.

 

Desired Current Ready가 0인 것은 처음에 생성된 레플리카인 것을 확인할 수 있습니다. 기존 이미지를 업데이트 함으로써 예전 레플리카정보를 남겨놓습니다. 이전에 옵션으로 주었던 --record를 통해서 변경사항을 위와 같이 남겨두게 됩니다. 

 

그리고 아래와 같은 명령어로 history 정보를 확인할 수 있습니다. 

kubectl rollout history deployment replicaset-nginx
deployment.extensions/replicaset-nginx
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=replicasets-nginx.yaml --record=true
2         kubectl set image deployment replicaset-nginx nginx=nginx:1.11 --record=true

그리고 여기서 revision의 숫자를 확인한 다음 

kubectl rollout undo deployment replicaset-nginx --to-revision=1(옮기고 싶은 번호)

 

쿠버네티스 리소스의 자세한 정보를 출력하는 kubectl describe 명령어를 사용해 정보를 출력할 수 있습니다. 

kubectl describe deploy replicasets-nginx
Name:                   replicaset-nginx
Namespace:              default
CreationTimestamp:      Sat, 15 Feb 2020 15:51:02 +0900
Labels:                 app=my-nginx
Annotations:            deployment.kubernetes.io/revision: 2
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"kubernetes.io/change-cause":"kubectl apply --filename=replicasets-...
                        kubernetes.io/change-cause: kubectl set image deployment replicaset-nginx nginx=nginx:1.11 --record=true
Selector:               app=my-nginx
Replicas:               4 desired | 4 updated | 4 total | 4 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
.......

 

요약하자면 

레프릴카셋의 리비전 관리 뿐만 아니라 다양한 롤링 업데이트 정책을 사용할 수도 있다는 장점이 있습니다. 따라서 레플리카 셋을 만들지 말고 디플로이먼트를 만드는 것이 쿠버네티스에서 권장하고 있습니다.