mingming

kubernetes controller - Deployment 본문

kubernetes

kubernetes controller - Deployment

mingming_96 2023. 9. 4. 17:36

Deployment

ReplicaSet을 컨트롤해서 Pod 수를 조절 

Rolling Update & Rolling Back 

 

Deployment가 ReplicaSet을 컨트롤하고 ReplicaSet이 Pod를 컨트롤하는 형태

 

RollingUpdate

롤링 업데이트는 파드 인스턴스를 점진적으로 업데이트하여  서비스 중단 없이 이루어 질 수 있도록 해줍니다.

- 하나의 환경에서 또 다른 환경으로의 애플리케이션 프로모션

- 이전 버전으로의 롤백

- 서비스 중단없는 애플리케이션의 지속적인 통합과 지속적인 전달 

 

Deployment Definition

nginx-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

 

nginx-rs.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

RollingUpdate 기능을 제외하면 ReplicaSet과 거의 동일한 형태를 갖는 컨트롤러 입니다.

Deployment를 생성하면 ReplicaSet이 생성됩니다.

 

kubectl get deploy,rs,pod

 

 

Deployment Rolling Update & Rolling Back

Rolling Update

 

1. application rolling update 

kubectl set image deployment <deploy_name> <container_name>=<new_version_image>

kubectl set image deploy nginx-deployment nginx-container=nginx:1.15 --record

kubectl descirbe pods <pod_name>

 

 

2. controlling rolling update

 

 

RollBack

kubectl rollout history deployment <deploy_name>
kubectl rollout undo deploy <deploy_name>

history 확인

kubectl rollout history deployment <deployment_name>

바로 전 단계로 rollback

kubectl rollout undo deployment nginx-deployment

특정 history로 rollback

kubectl rollout undo deployment nginx-deployment --to-revision=3

 

 

deployment yaml format으로 확인 

kubectl get deployment nginx-deployment -o yaml

history size는 10  

progressDeadlineSeconds : 일정 시간동안 업데이트가 되지 않으면 롤백 

maxSurge : replicas=3 25%=0.75 ~> 3+1 = 4 running 중인 Pod를 최대 4개로 설정한다 

 

 

Sample-deployment.yaml

apiVersion: apps/v1
kind: Deployment 
metadata:
  name: deploy-nginx
  annotations:
    kubernetes.io/change-cause: version 1.14
  spec:
    progressDeadlineSeconds: 600
    revisionHistoryLimit: 10
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
      type: RollingUpdate
    replicas: 3 
    selector:
      matchLabels:
        app:web
    template:
      metadata:
        name: nginx-pod
        labels:
          app: web
      spec:
        containers:
        - name: nginx-container
          image: nginx:1.14

 

EXAMPLE

1. 다음 조건으로 Deployment를 사용하는 dep-lab.yaml 파일을 생성하고 apply 명령으로 동작시킵니다.

- labels(name: apache, app: main, rel: stable)를 가지는 httpd:2.2 버전의 Pod를 2개 히스토리를 기록하며 운영합니다.

- annotations( kubernetes .io/change-cause: version 2.2) 를 추가로 설정합니다.

   deployment name: dep-mainui

   container: httpd:2.2

dep-mainui.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dep-mainui
  annotation:
    kubernetes.io/change-cause: version 2.2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: main
  template:
    metadata:
      name: http-pod
      labels:
        name: apache
        app: main
        rel: stable
    spec:
      containers:
      - name: apache
        image: httpd:2.2
kubectl create -f dep-mainui.yaml

2. 동작되는 dep-lab.yaml 의 이미지를 httpd:2.4 버전으로 rolling update 합니다. 단 apply 명령어를 통해 rolling update 진행합니다.

 

kubectl set image deployment dep-mainui apache=httpd:2.4 --record

vi 편집기를 열고 nginx version 수정 후 

kubectl apply -f dep-mainui.yaml

 

3. 현재의 dep-mainui 히스토리를 확인하고 rollback 시킵니다.

kubectl rollout history deployment dep-mainui
kubectl rollout undo deployment dep-mainui --to-revision=3

 

 

4. 현재 동작중인 Pod의 httpd 이미지 버전은 어떻게 되는지 확인합니다. 

kubectl describe pods <pod_name>