반응형

 

 

 

 

디플로이먼트

디플로이먼트(Deployment) 는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공한다.

디플로이먼트에서 의도하는 상태 를 설명하고, 디플로이먼트 컨트롤러(Controller)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경한다. 새 레플리카셋을 생성하는 디플로이먼트를 정의하거나 기존 디플로이먼트를 제거하고, 모든 리소스를 새 디플로이먼트에 적용할 수 있다.

 

Deployment -> Replicaset -> Pod 

 

 

디플로이먼트 롤링 업데이트

디플로이먼트는 .spec.strategy.type==RollingUpdate 이면 파드를 롤링 업데이트 방식으로 업데이트 한다. maxUnavailable 와 maxSurge 를 명시해서 롤링 업데이트 프로세스를 제어할 수 있다.

 

최대 불가(Max Unavailable)

.spec.strategy.rollingUpdate.maxUnavailable 은 업데이트 프로세스 중에 사용할 수 없는 최대 파드의 수를 지정하는 선택적 필드이다. 이 값은 절대 숫자(예: 5) 또는 의도한 파드 비율(예: 10%)이 될 수 있다. 절대 값은 내림해서 백분율로 계산한다. 만약 .spec.strategy.rollingUpdate.maxSurge 가 0이면 값이 0이 될 수 없다. 기본 값은 25% 이다.

 

예를 들어 이 값을 30%로 설정하면 롤링업데이트 시작시 즉각 이전 레플리카셋의 크기를 의도한 파드 중 70%를 스케일 다운할 수 있다. 새 파드가 준비되면 기존 레플리카셋을 스케일 다운할 수 있으며, 업데이트 중에 항상 사용 가능한 전체 파드의 수는 의도한 파드의 수의 70% 이상이 되도록 새 레플리카셋을 스케일 업할 수 있다.

 

최대 서지(Max Surge)

.spec.strategy.rollingUpdate.maxSurge 는 의도한 파드의 수에 대해 생성할 수 있는 최대 파드의 수를 지정하는 선택적 필드이다. 이 값은 절대 숫자(예: 5) 또는 의도한 파드 비율(예: 10%)이 될 수 있다. MaxUnavailable 값이 0이면 이 값은 0이 될 수 없다. 절대 값은 올림해서 백분율로 계산한다. 기본 값은 25% 이다.

 

예를 들어 이 값을 30%로 설정하면 롤링업데이트 시작시 새 레플리카셋의 크기를 즉시 조정해서 기존 및 새 파드의 전체 갯수를 의도한 파드의 130%를 넘지 않도록 한다. 기존 파드가 죽으면 새로운 래플리카셋은 스케일 업할 수 있으며, 업데이트하는 동안 항상 실행하는 총 파드의 수는 최대 의도한 파드의 수의 130%가 되도록 보장한다

 

 

Deployment 설정

# deployment 생성 YAML을 작성

jinsu@jinsu:~$ cat deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mynginx-deploy
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%  
      maxSurge: 25%
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
jinsu@jinsu:~$ 

# deployment 생성
jinsu@jinsu:~$ kubectl apply -f deployment.yaml 
deployment.apps/mynginx-deploy created
jinsu@jinsu:~$ 

# deployment 상태 및 pod 상태 확인
jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS              RESTARTS   AGE
mynginx-deploy-55fbd9fd6d-jfm8k   0/1     ContainerCreating   0          15s
mynginx-deploy-55fbd9fd6d-f2pzv   0/1     ContainerCreating   0          15s
mynginx-deploy-55fbd9fd6d-kwf4k   0/1     ContainerCreating   0          15s
mynginx-deploy-55fbd9fd6d-dwljg   0/1     ContainerCreating   0          15s
mynginx-deploy-55fbd9fd6d-p75wx   1/1     Running             0          15s
jinsu@jinsu:~$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
mynginx-deploy   1/5     5            1           17s
jinsu@jinsu:~$

# deployment 설정값 확인
jinsu@jinsu:~$ kubectl get deployment mynginx-deploy -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas":5,"selector":{"matchLabels":{"app":"nginx"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx"}]}}}}
  creationTimestamp: "2022-08-14T08:24:38Z"
  generation: 1
  name: mynginx-deploy
  namespace: default
  resourceVersion: "16065"
  selfLink: /apis/apps/v1/namespaces/default/deployments/mynginx-deploy
  uid: 8262ede4-69af-499f-9f93-cba18f9b31c1
spec:
  progressDeadlineSeconds: 600
  replicas: 5
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.7.9
        imagePullPolicy: IfNotPresent
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 5
  conditions:
  - lastTransitionTime: "2022-08-14T08:25:02Z"
    lastUpdateTime: "2022-08-14T08:25:02Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2022-08-14T08:24:38Z"
    lastUpdateTime: "2022-08-14T08:25:06Z"
    message: ReplicaSet "mynginx-deploy-55fbd9fd6d" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
  readyReplicas: 5
  replicas: 5
  updatedReplicas: 5
jinsu@jinsu:~$ 

# deployment로 생성한 레플리카셋 확인
jinsu@jinsu:~$ kubectl get rs
NAME                        DESIRED   CURRENT   READY   AGE
mynginx-deploy-55fbd9fd6d   5         5         5       5m44s
jinsu@jinsu:~$

 

deployment 배포시 image 에러가 발생

# 존재하지 않는 이미지로 이미지를 업데이트 하였을 때
jinsu@jinsu:~$ kubectl set image deployment mynginx-deploy nginx=nginx:1.9.30 --record
deployment.apps/mynginx-deploy image updated
jinsu@jinsu:~$

# deploy 하였을 때 maxUnavailabel을 25% 설정
jinsu@jinsu:~$ kubectl get deploy mynginx-deploy -oyaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "3"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas":5,"selector":{"matchLabels":{"app":"nginx"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx"}]}}}}
    kubernetes.io/change-cause: kubectl set image deployment mynginx-deploy nginx=nginx:1.9.30
      --record=true
  creationTimestamp: "2022-08-14T08:24:38Z"
  generation: 3
  name: mynginx-deploy
  namespace: default
  resourceVersion: "16969"
  selfLink: /apis/apps/v1/namespaces/default/deployments/mynginx-deploy
  uid: 8262ede4-69af-499f-9f93-cba18f9b31c1
spec:
  progressDeadlineSeconds: 600
  replicas: 5
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate


# pod에 에러가 발생하여도 전부 변경되지 않음
jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS         RESTARTS   AGE
mynginx-deploy-7f9686c8fd-fbtxv   1/1     Running        0          9m20s
mynginx-deploy-7f9686c8fd-h7pms   1/1     Running        0          9m7s
mynginx-deploy-7f9686c8fd-4q92b   1/1     Running        0          9m5s
mynginx-deploy-7f9686c8fd-vq8lt   1/1     Running        0          9m20s
mynginx-deploy-69d67779d8-zq7bz   0/1     ErrImagePull   0          45s
mynginx-deploy-69d67779d8-lxkhm   0/1     ErrImagePull   0          45s
mynginx-deploy-69d67779d8-jhvcm   0/1     ErrImagePull   0          45s
jinsu@jinsu:~$

 

 

 

Deployment 명령어

# 이미지 변경
kubectl set image

jinsu@jinsu:~$ kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record
deployment.apps/mynginx-deploy image updated
jinsu@jinsu:~$

jinsu@jinsu:~$ kubectl get deploy
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
mynginx-deploy   4/5     3            4           9m9s
jinsu@jinsu:~$

# 이미지가 변경된 것을 확인
jinsu@jinsu:~$ kubectl get pod mynginx-deploy-7f9686c8fd-vq8lt -oyaml |  grep image
  - image: nginx:1.9.1
    imagePullPolicy: IfNotPresent
    image: nginx:1.9.1
    imageID: docker-pullable://nginx@sha256:2f68b99bc0d6d25d0c56876b924ec20418544ff28e1fb89a4c27679a40da811b
jinsu@jinsu:~$ 


# 업데이트 상태 확인
kubectl rollout status deployment mynginx-deploy

jinsu@jinsu:~$ kubectl rollout status deployment mynginx-deploy
deployment "mynginx-deploy" successfully rolled out
jinsu@jinsu:~$ 


# 업데이트 히스토리 확인
kubectl rollout history deployment mynginx-deploy

jinsu@jinsu:~$ kubectl rollout history deployment mynginx-deploy       
deployment.apps/mynginx-deploy 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record=true

jinsu@jinsu:~$ 

# deployment 세부정보 가져오기
jinsu@jinsu:~$ kubectl describe deployment mynginx-deploy
Name:                   mynginx-deploy
Namespace:              default
CreationTimestamp:      Sun, 14 Aug 2022 08:24:38 +0000
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 2
                        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"mynginx-deploy","namespace":"default"},"spec":{"replicas"...
                        kubernetes.io/change-cause: kubectl set image deployment mynginx-deploy nginx=nginx:1.9.1 --record=true
Selector:               app=nginx
Replicas:               5 desired | 5 updated | 5 total | 5 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.9.1
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   mynginx-deploy-7f9686c8fd (5/5 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  14m    deployment-controller  Scaled up replica set mynginx-deploy-55fbd9fd6d to 5
  Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled up replica set mynginx-deploy-7f9686c8fd to 2
  Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled down replica set mynginx-deploy-55fbd9fd6d to 4
  Normal  ScalingReplicaSet  5m43s  deployment-controller  Scaled up replica set mynginx-deploy-7f9686c8fd to 3
  Normal  ScalingReplicaSet  5m30s  deployment-controller  Scaled down replica set mynginx-deploy-55fbd9fd6d to 3
  Normal  ScalingReplicaSet  5m30s  deployment-controller  Scaled up replica set mynginx-deploy-7f9686c8fd to 4
  Normal  ScalingReplicaSet  5m28s  deployment-controller  Scaled down replica set mynginx-deploy-55fbd9fd6d to 2
  Normal  ScalingReplicaSet  5m28s  deployment-controller  Scaled up replica set mynginx-deploy-7f9686c8fd to 5
  Normal  ScalingReplicaSet  5m26s  deployment-controller  Scaled down replica set mynginx-deploy-55fbd9fd6d to 1
  Normal  ScalingReplicaSet  5m26s  deployment-controller  (combined from similar events): Scaled down replica set mynginx-deploy-55fbd9fd6d to 0
jinsu@jinsu:~$ 


# 롤백 기능
kubectl rollout undo deployment mynginx-deploy

# 해당 상태에서
jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS         RESTARTS   AGE
mynginx-deploy-7f9686c8fd-fbtxv   1/1     Running        0          9m20s
mynginx-deploy-7f9686c8fd-h7pms   1/1     Running        0          9m7s
mynginx-deploy-7f9686c8fd-4q92b   1/1     Running        0          9m5s
mynginx-deploy-7f9686c8fd-vq8lt   1/1     Running        0          9m20s
mynginx-deploy-69d67779d8-zq7bz   0/1     ErrImagePull   0          45s
mynginx-deploy-69d67779d8-lxkhm   0/1     ErrImagePull   0          45s
mynginx-deploy-69d67779d8-jhvcm   0/1     ErrImagePull   0          45s
jinsu@jinsu:~$

# 롤백
jinsu@jinsu:~$ kubectl rollout undo deployment mynginx-deploy
deployment.apps/mynginx-deploy rolled back
jinsu@jinsu:~$

jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
mynginx-deploy-7f9686c8fd-fbtxv   1/1     Running   0          13m
mynginx-deploy-7f9686c8fd-h7pms   1/1     Running   0          13m
mynginx-deploy-7f9686c8fd-4q92b   1/1     Running   0          13m
mynginx-deploy-7f9686c8fd-vq8lt   1/1     Running   0          13m
mynginx-deploy-7f9686c8fd-vn2gf   1/1     Running   0          13s
jinsu@jinsu:~$ 



# scaling 기능
kubectl scale deployment mynginx-deploy --replicas=5 --record

jinsu@jinsu:~$ kubectl scale deployment mynginx-deploy --replicas=10 --record
deployment.apps/mynginx-deploy scaled
jinsu@jinsu:~$ 

# pod가 10개로 생성
jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS    RESTARTS   AGE
mynginx-deploy-7f9686c8fd-fbtxv   1/1     Running   0          15m
mynginx-deploy-7f9686c8fd-h7pms   1/1     Running   0          15m
mynginx-deploy-7f9686c8fd-4q92b   1/1     Running   0          15m
mynginx-deploy-7f9686c8fd-vq8lt   1/1     Running   0          15m
mynginx-deploy-7f9686c8fd-vn2gf   1/1     Running   0          2m11s
mynginx-deploy-7f9686c8fd-jxjrc   1/1     Running   0          15s
mynginx-deploy-7f9686c8fd-xv69q   1/1     Running   0          15s
mynginx-deploy-7f9686c8fd-r2dzt   1/1     Running   0          15s
mynginx-deploy-7f9686c8fd-vvvfp   1/1     Running   0          15s
mynginx-deploy-7f9686c8fd-576xz   1/1     Running   0          15s
jinsu@jinsu:~$ 

# 레플리카셋 확인
jinsu@jinsu:~$ kubectl get rs
NAME                        DESIRED   CURRENT   READY   AGE
mynginx-deploy-55fbd9fd6d   0         0         0       25m
mynginx-deploy-69d67779d8   0         0         0       7m27s
mynginx-deploy-7f9686c8fd   10        10        10      16m
jinsu@jinsu:~$

 

 

deployment 삭제

# 현재 동작중인 deployment
jinsu@jinsu:~$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
mynginx-deploy   5/5     5            4           25s
jinsu@jinsu:~$

# deployment 삭제
jinsu@jinsu:~$ kubectl delete deploy mynginx-deploy
deployment.apps "mynginx-deploy" deleted
jinsu@jinsu:~$ 

# 삭제되는 pod들 
jinsu@jinsu:~$ kubectl get pod
NAME                              READY   STATUS        RESTARTS   AGE
mynginx-deploy-7f9686c8fd-jxjrc   1/1     Terminating   0          2m23s
mynginx-deploy-7f9686c8fd-vq8lt   1/1     Terminating   0          17m
mynginx-deploy-7f9686c8fd-576xz   1/1     Terminating   0          2m23s
mynginx-deploy-7f9686c8fd-xv69q   1/1     Terminating   0          2m23s
mynginx-deploy-7f9686c8fd-vvvfp   1/1     Terminating   0          2m23s
jinsu@jinsu:~$

 

 

한번에 원하는 이미지로 deployment 생성

# 원하는 정보를 한번에 생성
kubectl create deployment httpd-frontend --image=httpd:2.4-alpine --replicas=3

 

 

 

 

 

참고자료

https://kubernetes.io/ko/docs/concepts/workloads/controllers/deployment/

 

 

반응형

+ Recent posts