[kubernetes] Controller - Deployment - 2

박원균·2021년 11월 8일
0

Kubernetes

목록 보기
10/24
post-thumbnail

디플로이먼트 업데이트

디플로미너트의 파드 템플릿 .spec.template이 변경된 경우에만 디플로이먼트의 롤아웃이 트리거됩니다.
예를 들면 템플릿의 레이블이나 컨테이너 이미지가 업데이트된 경우입니다. 디플로이먼트의 스케일링과 같은 다른 업데이트는 롤아웃을 트리거하지 말아야합니다.

업데이트 방법

현재 실행중인 deployment.apps/nginx-deployment를 업데이트할려합니다.

  1. kubectl 명령어로 조작하는 방법
$ kubectl --record deployment.apps/nginx-deployment set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

#result
deployment.apps/nginx-deployment edited

# 위 두 명령어는 nginx 이미지의 버전 1.14.1을 1.16.1로 업데이트 시켜주는 명령입니다.
  1. 명세를 이용하여 업데이트하는 방법
$ kubectl edit deployment.v1.apps/nginx-deployment

# editting

apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "2"
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-deployment","namespace":"ingress-nginx"},"spec":{"replicas":3,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx","ports":[{"containerPort":80}]}]}}}}
    kubernetes.io/change-cause: kubectl deployment.apps/nginx-deployment set image
      deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1 --record=true
  creationTimestamp: "2021-11-07T15:14:18Z"
  generation: 2
  labels:
    app: nginx
  name: nginx-deployment
  namespace: ingress-nginx
  resourceVersion: "409043"
  uid: 9fc0a70a-3e19-46da-af4c-031cf22f1290
spec:
  progressDeadlineSeconds: 600
  replicas: 3
  revisionHistoryLimit: 10
  selector:
    matchLabels:
   .
   .
   .
# 이렇게 나오는 명세를 조작하여 업데이트할 수 있습니다.
# result
deployment.apps/nginx-deployment edited

롤 아웃

롤 아웃 상태를 보려면
kubectl rollout status deployment.v1.apps/nginx-deployment 명령어를 이용하여 상태를 볼 수 있습니다.
deployment "nginx-deployment" successfully rolled out 라는 결과가 나옵니다.

업데이트된 디플로이먼트에 대해 자세한 정보를 보기 위해서는

  • kubectl get deployments를 이용하면 아래와 같은 정보가 출력이 됩니다.
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           23h
  • kubect get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-559d658b74   3         3         3       23h
nginx-deployment-66b6c48dd5   0         0         0       23h

디플로이먼트는 업데이트 되는 동안 일정한 수의 파드만 중단되도록 보장합니다. 기본적으로 적어도 의도한 파드 수의 75% 이상이 동작하도록 보장합니다 ( 최대 25% 불가)

또한 디플로이먼트는 의도한 파드 수보다 더 많이 생성되는 파드의 수를 제한합니다. 기본적으로 의도한 파드의 수 기준 최대 125%까지만 추가 파드가 동작할 수 있도록 제한합니다(25%까지)

롤오버 ( 인-플라이트 다중 업데이트 )

디플로이먼트 컨트롤러는 각 시간마다 새로운 디플로이먼트에서 레플리카셋이 의도한 파드를 생성하고 띄우는 것을 주시합니다. 만약 디플로이먼트가 업데이트되면, 기존 레플리카셋에서 .spec.selector 레이블과 일치하는 파드를 컨트롤 하지만, 템플릿과 .spec.template이 불일치하면 스케일 다운이 됩니다. 결국 새로운 레플리카셋은 .spec.replicas로 스케일이 되고 모든 기존 레플리카셋은 0개로 스케일됩니다.

만약 기존 롤아웃이 진행되는 중에 디플리먼트를 업데이트하는 경우 디플로이먼트가 업데이트에 따라 새레플리카셋을 생성하고 스케일 업하기 시작합니다 그리고 이전에 스케일 업하던 레플리카셋을 롤 오버합니다.

예를 들어 디플로이먼트로 nginx:1.14.2 레플리카를 5개 생성을 한다. 하지만 nginx:1.14.2 레플리카 3개가 생성되었을 때 디플로이먼트를 업데이트해서 nginx:1.16.1 레플리카 5개를 생성성하도록 업데이트를 한다고 가정한다. 이 경우 디플로이먼트는 즉시 생성된 3개의 nginx:1.14.2 파드 3개를 죽이기 시작하고 nginx:1.16.1 파드를 생성하기 시작한다. 이것은 과정이 변경되기 전 nginx:1.14.2 레플리카 5개가 생성되는 것을 기다리지 않는다.

레이블 셀럭터 업데이트

일반적으로 레이블 셀렉터를 업데이트하는 것을 권장하지 않으며 셀럭터를 미리 계획하는 것을 권장합니다.

어떤 경우든 레이블 셀렉터의 업데이트를 해야하는 경우 매우 주의하고,모든 영향을 파악했는지 확인해야합니다.

참고: API 버전 apps/v1 에서 디플로이먼트의 레이블 셀렉터는 생성 이후에는 변경할 수 없다.

  • 셀렉터 추가 시 디플로이먼트의 spec에 있는 파드 템플릿 레이블도 새 레이블로 업데이트 해야합니다. 그렇지 않으면 유효성 검사 오류가 반환됩니다. 이 변경은 겹치지 않는 변경으로 새 셀렉터가 이전 셀렉터로 만든 레플리카셋과 파드를 선택하지 않게 되고, 그 결과로 모든 기존 레플리카셋은 고아가 되며, 새로운 레플리카셋을 생성하게 됩니다.

--> .spec.selector업데이트시 .spec.template.labels를 업데이트 해야한단 말입니다.

  • 셀럭터 업데이트는 기존 셀렉터 키 값을 변경하며, 결과적으로 추가와 동일한 동작을 합니다.

  • 셀렉터 삭제는 디플로이먼트 셀렉터의 기존 키를 삭제하며 파드 템플릿 레이블의 변경을 필요로 하지 않습니다. 기존 레플리카셋은 고아가 아니고, 새 레플리카셋은 생성되지 않습니다. 그러나 제거된 레이블은 기존 파드와 레플리카셋에 여젼히 존재한다는 점을 생각해야합니다.

profile
함바라기

0개의 댓글