[Kubernetes] 쿠버네티스 사용해보기 - Deployment

아현·2023년 1월 9일
0

Kubernetes

목록 보기
5/9
post-thumbnail

출처

1. 시작하기


Docker Desktop 설치

출처


  1. 도커 데스크탑 다운로드

Docker Desktop

  1. 쿠버네티스 사용가능 설정

  1. 쿠버네티스 설치 확인
$ kubectl version

$ kubectl get nodes



2. 디플로이먼트의 생성과 삭제


디플로이먼트 생성


  • 매니패스트 파일 생성

    • deployment1.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        
$ kubctl apply -f deployment.yml

$ kubectl get po -o wide



디플로이먼트 삭제

$ kubectl delete -f deployment1.yml



3. 스케일 기능


  • 스케일 기능

    • 레플리카의 값을 변경하여 파드의 개수를 조절하여 처리능력을 높이거나 낮추는 기능.
  • 여기서는 수동으로 변경하는 방법을 사용

    CPU 사용량과 연동해서 동적으로 레플리카의 값을 조절하는 오토스케일 기능도 존재한다.

    1. 매니페스트를 변경한 후 적용하는 방법

    2. kubectl scale 명령을 사용하여 파드의 개수를 늘리는 방법


$ kubectl apply -f deployment1.yml

$ kubectl scale --replicas=10 deployment.apps/web-deploy

$ kubectl get deploy
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
web-deploy   10/10   10           10          76s



4. 롤아웃 기능


  • 롤아웃 기능

    • 쿠버네티스에서 컨테이너의 업데이트를 의미한다.
  • 롤아웃을 할 때는 사용자의 요청을 처리할 수 있도록 정해진 개수만큼 업데이트를 진행할 수 있다.

    • 쿠버네티스 롤아웃 디폴트 전략은 RollingUpdateStrategy를 사용한다.

ex) 디플로이먼트로 배포된 웹 서버 Nginx 의 버전을 업그레이드



  • deployment2.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 10
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
  • deployment3.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-deploy
spec:
  replicas: 10
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.17 #2와 차이점



  • 디플로이먼트 상세정보 조회
$ kubectl describe deployment web-deploy


RollingUpdateStrategy: 25% max unavailable, 25% max surge

  • 위 디플로이먼트 상태에서 RollingUpdateStrategy: 25% max unavailable, 25% max surge를 확인할 수 있다.
    • 최대 25%의 파드를 정지할 수 있고, 최대 25%만큼 초과할 수 있음을 의미한다.
    • 가령 레필라카 값이 10이면, 최소 파드수는 10-10X0.25=7.5라는 계산식이 나오는데 소수점을 올려 8이 된다. 초과 파드수는 12.5이므로 13이 된다.

  • 정리하면 최소 8개의 파드를 유지하면서 최대 13개의 파드가 되도록 롤아웃이 점진적으로 진행된다.

$ kubectl apply -f deployment3.yml
$ kubectl get po
$ kubectl apply -f deployment2.yml



5. 롤백 기능


  • 롤백 기능

    • 롤아웃 전에 사용하던 예전 컨테이너로 되돌리는 기능
kubectl rollout undo deployment web-deploy
PS C:\Users\ICTUSER> kubectl apply -f deployment2.yml
deployment.apps/web-deploy configured
PS C:\Users\ICTUSER> kubectl describe deployment web-deploy
Name:                   web-deploy
Namespace:              default
CreationTimestamp:      Fri, 13 Jan 2023 13:44:20 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 5
Selector:               app=web
Replicas:               10 desired | 10 updated | 10 total | 9 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=web
  Containers:
   nginx:
    Image:        nginx:1.16
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  <none>
NewReplicaSet:   web-deploy-865777c965 (10/10 replicas created)
Events:
  Type    Reason             Age                  From                   Message
  ----    ------             ----                 ----                   -------
  Normal  ScalingReplicaSet  19m                  deployment-controller  Scaled up replica set web-deploy-865777c965 to 3
  Normal  ScalingReplicaSet  18m                  deployment-controller  Scaled up replica set web-deploy-865777c965 to 10 from 3
  Normal  ScalingReplicaSet  8m27s                deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 3
  Normal  ScalingReplicaSet  8m27s                deployment-controller  Scaled down replica set web-deploy-865777c965 to 8 from 10
  Normal  ScalingReplicaSet  8m27s                deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 5 from 3
  Normal  ScalingReplicaSet  8m9s                 deployment-controller  Scaled down replica set web-deploy-865777c965 to 7 from 8
  Normal  ScalingReplicaSet  8m9s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 6 from 5
  Normal  ScalingReplicaSet  8m7s                 deployment-controller  Scaled down replica set web-deploy-865777c965 to 6 from 7
  Normal  ScalingReplicaSet  8m7s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 7 from 6
  Normal  ScalingReplicaSet  82s (x26 over 8m7s)  deployment-controller  (combined from similar events): Scaled up replica set web-deploy-5dbf99b688 to 3 from 0
PS C:\Users\ICTUSER> kubectl rollout undo deployment web-deploy
deployment.apps/web-deploy rolled back
PS C:\Users\ICTUSER> kubectl describe deployment web-deploy
Name:                   web-deploy
Namespace:              default
CreationTimestamp:      Fri, 13 Jan 2023 13:44:20 +0900
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 6
Selector:               app=web
Replicas:               10 desired | 5 updated | 13 total | 8 available | 5 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=web
  Containers:
   nginx:
    Image:        nginx:1.17
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  web-deploy-865777c965 (8/8 replicas created)
NewReplicaSet:   web-deploy-5dbf99b688 (5/5 replicas created)
Events:
  Type    Reason             Age                   From                   Message
  ----    ------             ----                  ----                   -------
  Normal  ScalingReplicaSet  19m                   deployment-controller  Scaled up replica set web-deploy-865777c965 to 3
  Normal  ScalingReplicaSet  18m                   deployment-controller  Scaled up replica set web-deploy-865777c965 to 10 from 3
  Normal  ScalingReplicaSet  8m36s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 3
  Normal  ScalingReplicaSet  8m36s                 deployment-controller  Scaled down replica set web-deploy-865777c965 to 8 from 10
  Normal  ScalingReplicaSet  8m36s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 5 from 3
  Normal  ScalingReplicaSet  8m18s                 deployment-controller  Scaled down replica set web-deploy-865777c965 to 7 from 8
  Normal  ScalingReplicaSet  8m18s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 6 from 5
  Normal  ScalingReplicaSet  8m16s                 deployment-controller  Scaled down replica set web-deploy-865777c965 to 6 from 7
  Normal  ScalingReplicaSet  8m16s                 deployment-controller  Scaled up replica set web-deploy-5dbf99b688 to 7 from 6
  Normal  ScalingReplicaSet  91s (x26 over 8m16s)  deployment-controller  (combined from similar events): Scaled up replica set web-deploy-5dbf99b688 to 3 from 0



6. 자동 복구


  • 파드 내의 컨테이너가 모종의 이유로 죽으면, 기본적으로는 파드가 컨테이너를 재구동 시켜준다.

    • 즉, 파드는 컨테이너 수준의 장애에 대한 복구를 시도한다.
  • 디플로이먼트의 자동 복구 기능은 파드 단위로 복구

    • 디플로이먼트는 노드가 중지되더라도 성급하게 복구를 시도하지 않는다.
    1. 노드가 중지하면 디플로이먼트는 5분을 기다리며 거기서 1분이 경과하면 중지된 노드의 파드들의 상태가 UNKNOWN으로 바뀐다.

    2. 동시에 다른 노드에 UNKNOWN 상태의 파드만큼 새로운 파드를 실행한다.

    3. 여기서 중지된 노드가 다시 구동하면 그제서야 UNKNOWN 상태의 파드를 제거한다.

  • 디플로이먼트의 자동복구 기능은 최대한 신중하게 동작하도록 구성되어있다.



7. 디플로이먼트를 이용한 고가용성 구성


  • 파드는 어떤 노드에 있더라도 퍼시스턴트 볼륨을 마운트할 수 있다.

ex) 2개의 노드로 구성된 k8s 클러스터를 생성하고 파드가 배포된 노드를 중지시킨 이후 파드가 이동




profile
For the sake of someone who studies computer science

0개의 댓글