ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Udemy] Deployments
    kubernetes/udemy 2025. 2. 13. 10:28

    Deployments

    • ReplicaSet을 제어해주는 부모 역할
    • ReplicaSet을 컨트롤해서 Pod 수 조절
      • Deployment -> ReplicaSet -> Pod 순으로 컨트롤
      • Deployment가 ReplicaSet을 Control하고, ReplicaSet이 Pod를 컨트롤
    • 목적 : Pod 수 조절 & Rolling update & Rolling back
      • Rolling update? 
        • 애플리케이션의 새로운 버전을 점진적으로 배포하는 방법으로, 서비스의 가용성을 유지하면서 업데이트를 수행할 수 있도록 돕습니다.
        • kubectl set image deployment <deploy_name> <container_name> = <new_version_image>
        • kubectl rollout history deployment <deploy_name> # 업데이트 히스토리 확인
      • Rolling Back?
        • 애플리케이션의 이전 버전으로 되돌리는 과정입니다. 이는 주로 새로운 버전의 배포 중에 문제가 발생했을 때 사용되며, 서비스의 가용성을 유지하면서 신속하게 안정적인 상태로 복구할 수 있도록 돕습니다.
        • kubectl rollout undo deploy <deploy_name>
      • Rolling update control
        • kubectl rollout status deployment app-deploy # 업데이트 상태 확인
        • kubectl rollout pause deployment app-deploy # 업데이트 중지
        • kubectl rollout resume deployment app-deploy # 업데이트 재개
     

    [따배쿠] Controller - Deployment

    DeploymentReplicaSet을 제어해주는 부모 역할ReplicaSet을 컨트롤해서 Pod 수 조절Deployment -> ReplicaSet -> Pod 순으로 컨트롤Deployment가 ReplicaSet을 Control하고, ReplicaSet이 Pod를 컨트롤목적 : Pod 수 조절 & Rolling u

    bbiyak-cloud.tistory.com

     

     

    Deployment 생성

     

    # Deployment 생성

    # Create Deployment
    kubectl create deployment <Deplyment-Name> --image=<Container-Image>
    kubectl create deployment my-first-deployment --image=stacksimplify/kubenginx:1.0.0

     

    # Deployment 확인

    # Verify Deployment
    kubectl get deployments
    kubectl get deploy
    ---
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    my-first-deployment   1/1     1            1           3m22s

     

    # Deployment 자세히 확인

    # Describe Deployment
    kubectl describe deployment <deployment-name>
    kubectl describe deployment my-first-deployment

     

    # ReplicaSet 확인

    # Verify ReplicaSet
    kubectl get rs  
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   1         1         1       3m15s

     

    # Pod 확인

    # Verify Pod
    kubectl get po
    ---
    NAME                                   READY   STATUS    RESTARTS   AGE
    my-first-deployment-5bb6fc76f8-6rdk5   1/1     Running   0          3m24s

     

    Deployment Scale up

     

    # Deployment Scale up

    # Scale Up the Deployment
    kubectl scale --replicas=10 deployment/<Deployment-Name>
    kubectl scale --replicas=10 deployment/my-first-deployment

     

    # Deployment 확인

    # Verify Deployment
    kubectl get deploy
    ---
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    my-first-deployment   10/10   10           10          15m

     

    # ReplicaSet 확인

    # Verify ReplicaSet
    kubectl get rs
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   10        10        10      15m

     

    # Pod 확인

    # Verify Pods
    kubectl get po
    ---
    NAME                                   READY   STATUS    RESTARTS   AGE
    my-first-deployment-5bb6fc76f8-22pzl   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-5vbhb   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-6rdk5   1/1     Running   0          16m
    my-first-deployment-5bb6fc76f8-c5wg5   1/1     Running   0          12m
    my-first-deployment-5bb6fc76f8-gb9zh   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-hn2vd   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-l6266   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-pmzwx   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-v9ldr   1/1     Running   0          106s
    my-first-deployment-5bb6fc76f8-xxdfp   1/1     Running   0          106s

     

     

    Deployment Scale down

     

    # Deployment Scale down

    kubectl scale --replicas=2 deployment/my-first-deployment 
    deployment.apps/my-first-deployment scaled

     

    # Deployment 확인

    kubectl get deploy
    ---
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    my-first-deployment   2/2     2            2           17m

     

    # ReplicaSet 확인

    kubectl get rs    
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   2         2         2       17m

     

    # Pod 확인

    kubectl get pods
    ---
    NAME                                   READY   STATUS    RESTARTS   AGE
    my-first-deployment-5bb6fc76f8-6rdk5   1/1     Running   0          17m
    my-first-deployment-5bb6fc76f8-c5wg5   1/1     Running   0          13m

     

    Deployment를 Service를 통해 노출

     

    # Deployment를 Service를 통해 노출

    # Expose Deployment as a Service
    kubectl expose deployment <Deployment-Name>  --type=LoadBalancer --port=80 --target-port=80 --name=<Service-Name-To-Be-Created>
    kubectl expose deployment my-first-deployment --type=LoadBalancer --port=80 --target-port=80 --name=my-first-deployment-service

     

    # Service 확인

    # Get Service Info
    kubectl get svc                     
    ---
    NAME                          TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
    kubernetes                    ClusterIP      10.0.0.1      <none>          443/TCP        20h
    my-first-deployment-service   LoadBalancer   10.0.232.64   20.214.196.89   80:30778/TCP   12m

     

     

    # Service의 External IP를 통해, Pod 내 애플리케이션 접근

    http://<External-IP-from-get-service-output>

     

     

    Service를 통해 Deployment에 접근하고, 그 안에 있는 Pod 내 애플리케이션까지 접근하였다.

     

    Deployment Rolling Update

     

    # Rolling Update (컨테이너 이미지 업데이트)

    # Update Deployment - SHOULD WORK NOW
    kubectl set image deployment/<Deployment-Name> <Container-Name>=<Container-Image> --record=true
    kubectl set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true

     

    my-first-deployment 내 컨테이너 이미지를 1.0.0 버전에서 2.0.0으로 업그레이드

     

    더보기

    ** container name 확인 방법

    kubectl get deploy <Deployment-Name> -o yaml

    kubectl get deploy my-first-deployment -o yaml

    ---
    ...
        spec:
          containers:
          - image: stacksimplify/kubenginx:2.0.0
            imagePullPolicy: IfNotPresent
            name: kubenginx
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    ...

     

    여기서는 container name이 kubenginx고, container image는 stacksimplify/kubenginx:2.0.0임을 확인 가능

    # Rolling Update 상태 확인

    kubectl rollout status deployment/my-first-deployment
    ---
    deployment "my-first-deployment" successfully rolled out

     

    # ReplicaSet 확인

    # Verify ReplicaSet
    kubectl get rs
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   0         0         0       44m
    my-first-deployment-c4bf784bc    2         2         2       17m

     

    Rolling Update와 동시에 기존 ReplicaSet은 0으로 변하고 신규 ReplicaSet이 생김

     

    # Pod 확인

    # Verify pods
    kubectl get pods
    ---
    NAME                                  READY   STATUS    RESTARTS   AGE
    my-first-deployment-c4bf784bc-78vzk   1/1     Running   0          19m
    my-first-deployment-c4bf784bc-hnrwk   1/1     Running   0          19m

     

    다시 Pod도 생성됨

     

    # Rolling Update 히스토리 확인

    # Check the Rollout History of a Deployment
    kubectl rollout history deployment/<Deployment-Name>
    kubectl rollout history deployment/my-first-deployment
    ---
    REVISION  CHANGE-CAUSE
    1         <none>
    2         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true

     

    # Service의 External IP를 통해, Pod 내 애플리케이션 접근

     

    kubectl get svc
    ---
    NAME                          TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
    kubernetes                    ClusterIP      10.0.0.1      <none>          443/TCP        20h
    my-first-deployment-service   LoadBalancer   10.0.232.64   20.214.196.89   80:30778/TCP   44m

     

    External IP로 다시 접근해보자

    http://<External-IP-from-get-service-output>/

     

    이미지 버전 2.0.0으로 정상적으로 바뀐 것을 확인 가능하다.

     

    # edit 명령어를 통해 직접 파일을 수정하여 컨테이너를 3.0.0 이미지로 업데이트

    # Edit Deployment
    kubectl edit deployment/<Deployment-Name> --record=true
    kubectl edit deployment/my-first-deployment --record=true

     

    해당 명령어를 수정하면 yml 파일이 열리는데,

     

     

    이미지 버전을 3.0.0 버전으로 수정해주자

     

    # Deployment 확인

    kubectl get deploy
    ---
    NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
    my-first-deployment   2/2     2            2           59m

     

    # ReplicaSet 확인

    kubectl get rs
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   0         0         0       59m
    my-first-deployment-75df965dd    2         2         2       2m49s
    my-first-deployment-c4bf784bc    0         0         0       33m

     

    기존 ReplicaSet들은 0으로 변하고, 신규 ReplicaSet이 생성된 것을 확인

     

    # Pod 확인

    kubectl get pods
    ---
    NAME                                  READY   STATUS    RESTARTS   AGE
    my-first-deployment-75df965dd-2xcgq   1/1     Running   0          2m53s
    my-first-deployment-75df965dd-w9d6h   1/1     Running   0          3m

     

    새로운 Pod가 생성된 것을 확인

     

    # Rolling Update 상태 & 히스토리 확인

    kubectl rollout status deployment/my-first-deployment 
    deployment "my-first-deployment" successfully rolled out
    kubectl rollout history deployment/my-first-deployment
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true
    3         kubectl.exe edit deployment/my-first-deployment --record=true

     

    # Service의 External IP로 Pod 내 애플리케이션에 접근

     

    해당 컨테이너의 이미지가 3.0.0 버전으로 잘 변경된 것을 확인 가능하다.

     

    Deployment Rolling back

     

    # Rolling Update history 확인

    # List Deployment Rollout History
    kubectl rollout history deployment/<Deployment-Name>
    kubectl rollout history deployment/my-first-deployment
    ---
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true
    3         kubectl.exe edit deployment/my-first-deployment --record=true

     

     

    # 특정 버전으로 Rollback을 해보자 (revision = 1)

    kubectl rollout history deployment/my-first-deployment --revision=1
    ---
    deployment.apps/my-first-deployment with revision #1
    Pod Template:
      Labels:       app=my-first-deployment
            pod-template-hash=5bb6fc76f8
      Containers:
       kubenginx:
        Image:      stacksimplify/kubenginx:1.0.0
        Port:       <none>
        Host Port:  <none>
        Environment:        <none>
        Mounts:     <none>
      Volumes:      <none>

     

    history의 revision=1로 rollback이 되었고,

    하단에 Image: stacksimplify/kubenginx:1.0.0를 보면 어떤 이미지로 업데이트 되었는지 확인 가능하다.

     

    # rollout undo 명령어로 Rollback

    kubectl rollout history deployment/my-first-deployment
    ---
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    4         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true
    5         kubectl.exe edit deployment/my-first-deployment --record=true

     

    kubectl rollout undo deployment/my-first-deployment
    --
    deployment.apps/my-first-deployment rolled back
    kubectl rollout history deployment/my-first-deployment
    ---
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    5         kubectl.exe edit deployment/my-first-deployment --record=true
    6         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true

     

    현재 2.0.0 버전으로 rollback 되었다.

     

    # ReplicaSet 확인

    kubectl get rs
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   0         0         0       90m
    my-first-deployment-75df965dd    0         0         0       33m
    my-first-deployment-c4bf784bc    2         2         2       63m

     

    다시 2.0.0 버전의 컨테이너를 갖고 있는 ReplicaSet이 활성화되었다.

     

    # Service의 External IP로 접근

     

    Deployment Rollout Restart

     

     # Deployment 재시작

    # Rolling Restarts
    kubectl rollout restart deployment/<Deployment-Name>
    kubectl rollout restart deployment/my-first-deployment

     

    Kubernetes에서 특정 배포(Deployment)를 재시작하는 데 사용됩니다.

    이 명령은 배포의 파드를 종료하고 새로운 파드를 생성하여 애플리케이션을 재시작하는 역할을 합니다.

     

     

    # Pod 확인

    kubectl get pods
    ---
    NAME                                   READY   STATUS    RESTARTS   AGE
    my-first-deployment-6c86bcddf6-8zn2f   1/1     Running   0          21s
    my-first-deployment-6c86bcddf6-jj4b4   1/1     Running   0          20s

     

     

    Deployment Rollout Pause & Resume

     

    # Deployment의 Rollout pause

    # Pause the Deployment
    kubectl rollout pause deployment/<Deployment-Name>
    kubectl rollout pause deployment/my-first-deployment

     

    Kubernetes에서 특정 배포(Deployment)의 롤아웃을 일시 중지하는 데 사용됩니다.

    이 명령은 배포의 업데이트 프로세스를 중단하여, 현재 진행 중인 변경 사항이 적용되지 않도록 합니다.

     

    # Rolling Update (컨테이너 이미지 업데이트)

    # Update Deployment - Application Version from V3 to V4
    kubectl set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:4.0.0 --record=true

     

    컨테이너의 이미지를 3.0.0에서 4.0.0으로 변경해보자

    명령을 실행해도 지금은 rollout이 pause 상태이기 때문에, 즉시 변경되지 않는다.

    kubectl rollout history deployment/my-first-deployment
    ---
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    6         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true
    7         kubectl.exe edit deployment/my-first-deployment --record=true
    8         kubectl.exe edit deployment/my-first-deployment --record=true
    # Get list of ReplicaSets
    kubectl get rs        
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   0         0         0       3h40m
    my-first-deployment-6c86bcddf6   2         2         2       10m
    my-first-deployment-75df965dd    0         0         0       163m
    my-first-deployment-c4bf784bc    0         0         0       3h13m

     

    # 컨테이너의 리소스 사용량 변경

    kubectl set resources deployment/my-first-deployment -c=kubenginx --limits=cpu=20m,memory=30Mi

     

    테스트를 위해, 컨테이너의 리소스 사용량도 변경해보자

    해당 작업도 즉시 변경되지 않는다. rollout pause 상테이기 때문이다.

     

    # Deployment의 Rollout Resume

    kubectl rollout resume deployment/my-first-deployment 
    ---
    deployment.apps/my-first-deployment resumed

     

    Rollout을 재개해보자

     

    # Deployment의 Rollout Resume 확인

    kubectl rollout history deployment/my-first-deployment
    ---
    deployment.apps/my-first-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    6         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:2.0.0 --record=true
    7         kubectl.exe edit deployment/my-first-deployment --record=true
    8         kubectl.exe edit deployment/my-first-deployment --record=true
    9         kubectl.exe set image deployment/my-first-deployment kubenginx=stacksimplify/kubenginx:4.0.0 --record=true

     

    재개하자마자 아까 실행했던 4.0.0 버전 이미지 업데이트가 진행되었다.

     

    kubectl get rs
    ---
    NAME                             DESIRED   CURRENT   READY   AGE
    my-first-deployment-5bb6fc76f8   0         0         0       3h48m
    my-first-deployment-6c86bcddf6   0         0         0       19m
    my-first-deployment-75df965dd    0         0         0       171m
    my-first-deployment-8dfd9f847    2         2         2       85s
    my-first-deployment-c4bf784bc    0         0         0       3h21m

     

    재개하자마자 replicaSet도 추가된 것을 볼 수 있고

     

    kubectl get pods
    ---
    NAME                                  READY   STATUS    RESTARTS   AGE
    my-first-deployment-8dfd9f847-hpvmn   1/1     Running   0          78s
    my-first-deployment-8dfd9f847-mlb68   1/1     Running   0          89s

     

    Pod도 이미지에 맞게 다시 생성되었다.

     

    # Service의 External IP로 접근

     

    Pod 내 애플리케이션 버전이 V4로 정상적으로 바뀐 것을 확인 가능하다.

     

    Delete

     

    # Deployment 삭제

    # Delete Deployment
    kubectl delete deployment my-first-deployment

     

    # Service 삭제

    # Delete Service
    kubectl delete svc my-first-deployment-service

     


    [참고 영상]

    Udemy - Azure Kubernetes Service with Azure DevOps and Terraform

    섹션 4 : Kubernetes Fundamentals with kubectl - Imperative Approach

    29. Step-12 : Introduction ot Kubernetes Deployments

    30. Step-13 : Create Deployment, Expose with a Service, Scale Up and Down Replicas

    31. Step-14: Understand how to Update Deployments in Kubernetes

    32. Step-15: Understand how to rollback deployments in Kubernetes

    33. Step-16: Understand how to pause and resume deployments in kubernetes

     

     

    [참고 문서]

    https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/03-Kubernetes-Fundamentals-with-kubectl/03-03-Deployments-with-kubectl/03-03-01-CreateDeployment-Scaling-and-Expose-as-Service

     

     

Designed by Tistory.