Kubernetes Deployment

uuuu.jini·2022년 9월 19일
0

Kubernetes

목록 보기
8/14

참고: [Kubernetes] 쿠버네티스 Deployment란?

1] ReplicaSet


Replication Controller의 새로운 버전으로 Label Selector를 통해 노드 상의 여러 Pod의 생성/복제/삭제 등의 라이프 사이클을 관리한다.

  • 지정한 Replica의 숫자만큼 Pod 수 생성/유지
  • Label Selector를 통한 Pod 타겟팅

2] Deployment


Kubernetes에서 어플리케이션 단위를 관리하는 Controller이며 Kubernetes의 최소 유닛인 Pod에 대한 기준 스펙을 정의한 object 이다.

Kubernetes에서는 각 Object를 독립적으로 생성하기 보단 Deployment를 통해서 생성하는 것을 권장하고 있으며, Pod와 ReplicaSet의 기준 정보를 지정할 수 있다.

이러한 Deployment는

  • Pod의 scale in/out 되는 기준을 정의한다.
  • Pod의 배포되고 update되는 모든 버전을 추적할 수 있다.
  • 배포된 Pod에 대한 rollback을 수행할 수 있다.

즉, 개념적으로 Deployment = ReplicaSet + Pod + history이며 ReplicaSet을 만드는 것보다 더 윗 단계의 선언(추상표현)이다.

3] Templates


Deployment는 위에서 보았듯이 Deployment 안에 ReplicaSet과 Pod를 담을 수 있는 구조로 되어 있다.

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  # Deployment 객체의 Unique한 명칭
  name: deployment-example
spec:
  # Deployment label selector for pod
  selector:
    matchLabels:
      app: nginx
  # 3 Pods should exist at all times.
  replicas: 3
  template:
    metadata:
      labels:
        # Pod의 라벨
        app: nginx
    spec:
      containers:
      - name: nginx
        # Run this image
        image: nginx:1.10

4] 실습 예제


4-1] Deployment 파일 생성 및 배포

  • Deployment yml 파일 생성
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx-container
        image: nginx
        imagePullPolicy: Always
        ports:
        - containerPort: 80
  • Deployment 생성
kubectl apply -f /lab/deployment/nginx-deployment.yaml --record=true
  • 결과 확인
root@master:/k8s/metallb# kubectl get deployment
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
curl                  1         1         1            1           110m
my-nginx-deployment   2         2         2            2           15s
 
root@master:/k8s/metallb# kubectl get rs
NAME                             DESIRED   CURRENT   READY   AGE
curl-5cc7b478b6                  1         1         1       111m
my-nginx-deployment-6877c7847d   2         2         2       65s
 
root@master:/k8s/metallb# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
curl-5cc7b478b6-vwtmj                  1/1     Running   2          111m
my-nginx-deployment-6877c7847d-j6nml   1/1     Running   0          71s
my-nginx-deployment-6877c7847d-wr7c9   1/1     Running   0          71s

status
Desired: displays the desired number of replicas of the application, which you defined when you create the Deployment (desire state)
Current: displays how many replicas are currently running
Up-to-date: displays the number of replicas that have been updated to achieve the desired state
Available: displays how many replicas of the application are available to your users
Age: displays the amount of time that the application has been running.

4-2] Delete Pod(장애 상황 표현)

장애가 발생한 상황을 가정하여 Pod 한개를 삭제

root@master:/k8s/metallb# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
curl-5cc7b478b6-vwtmj                  1/1     Running   2          111m
my-nginx-deployment-6877c7847d-j6nml   1/1     Running   0          71s
my-nginx-deployment-6877c7847d-wr7c9   1/1     Running   0          71s
 
root@master:/k8s/metallb# kubectl delete pod my-nginx-deployment-6877c7847d-j6nml
pod "my-nginx-deployment-6877c7847d-j6nml" deleted
 
root@master:/k8s/metallb# kubectl get pod
NAME                                   READY   STATUS        RESTARTS   AGE
curl-5cc7b478b6-vwtmj                  1/1     Running       2          114m
my-nginx-deployment-6877c7847d-7pm2c   1/1     Running       0          5s
my-nginx-deployment-6877c7847d-j6nml   0/1     Terminating   0          4m4s
my-nginx-deployment-6877c7847d-wr7c9   1/1     Running       0          4m4s

삭제를 하자마자 Deployment 에서 선언한 replicas에 의해 신규로 1개의 pod가 생성되었음을 알 수 있다.

4-3] Updating a Deployment

  • ReplicaSet Edit

ReplicaSet의 replicas의 숫자를 2에서 4로 변경

spec:
	progressDeadlineSeconds: 600
    replicas: 4

결과확인 시

root@master:/k8s/metallb# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
my-nginx-deployment-6877c7847d-9vwwj   1/1     Running   0          22s
my-nginx-deployment-6877c7847d-gqp2g   1/1     Running   0          22s
my-nginx-deployment-6877c7847d-nx9zq   1/1     Running   0          22s
my-nginx-deployment-6877c7847d-sqg22   1/1     Running   0          22s
  • Rolling Back a Deployment

이미지를 다른 버전으로 업데이트하고 이전 버전의 이미지로 돌리는 과정을 실습한다.

Pod의 이미지를 nginx:latest에서 nginx:1.9.1로 변경한다.

변경에 대한 이력을 기록하기 위해 annotationschange-cause를 추가할 수 있다. 이것은 추후에 이력 조회시 변경내용으로 조회되는 항목이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx-deployment
  annotations:
    kubernetes.io/change-cause: "set image nginx 1.9.1"
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 4
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx-container
        image: nginx:1.9.1
        imagePullPolicy: Always
        ports:
        - containerPort: 80
  • Deployment 생성
kubectl apply -f /lab/deployment/nginx-deployment.yml
  • 결과 확인
root@master:/k8s/metallb# kubectl get deployment
NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
curl                  1         1         1            1           110m
my-nginx-deployment   2         2         2            2           15s
 
root@master:/k8s/metallb# kubectl get rs
NAME                             DESIRED   CURRENT   READY   AGE
curl-5cc7b478b6                  1         1         1       111m
my-nginx-deployment-6877c7847d   2         2         2       65s
 
root@master:/k8s/metallb# kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
curl-5cc7b478b6-vwtmj                  1/1     Running   2          111m
my-nginx-deployment-6877c7847d-j6nml   1/1     Running   0          71s
my-nginx-deployment-6877c7847d-wr7c9   1/1     Running   0          71s
  • 버전 1로 롤백
kubectl rollout undo deployment.v1.apps/my-nginx-deployment --to-revision=1

4-4] Delete Deployment

Deployment는 하위의 ReplicaSet과 Pod를 관리하는 리소스이다. 따라서 Deployment를 삭제하면 하위의 ReplicaSet과 Pod가 함께 삭제된다.

# kubectl delete deployment my-nginx-deployment
deployment.extensions "my-nginx-deployment" deleted
 
# kubectl get rs
No resources found.
 
# kubectl get pods
NAME                                   READY   STATUS        RESTARTS   AGE
my-nginx-deployment-6877c7847d-sm4cs   0/1     Terminating   0          2m35s
my-nginx-deployment-6877c7847d-zbqxk   0/1     Terminating   0          2m38s
my-nginx-deployment-6877c7847d-zxhlq   0/1     Terminating   0          2m38s
profile
멋쟁이 토마토

0개의 댓글