Kubernetes

워크로드 API 카테고리(디플로이먼트)

jih0ssang 2024. 1. 7. 15:41

워크로드 API 카테고리

컨테이너 실행에 관련된 리소스

- 파드

- 레플리케이션 컨트롤러

- 레플리카셋

- 디플로이먼트

- 데몬셋

- 스테이트풀셋

- 잡

- 크론잡

 

디플로이먼트

  • 레플리카셋의 롤링 업데이트나 롤백 등을 적용하여 여러 레플리카셋을 관리하는 리소스이다.
  • 디플로이먼트가 레플리카셋을 관리하고 레플리카셋이 파드를 관리하는 관계이다.
  • 예) 롤링 업데이트
    1. 신규 레플리카셋 생성
    2. 신규 레플리카셋의 레플리카 수(파드 수) 단계적으로 늘림
    3. 기존 레플리카셋의 레플리카 수 단계적으로 줄임
    4. 기존 레플리카셋의 레플리카 수 0으로 유지

디플로이먼트 없이, 레플리카셋만으로도

기존 레플리카셋을 삭제하고 신규 레플리카셋을 생성하여 롤링 업데이트가 가능하지만,

디플로이먼트는 서비스 중단 최소화, 자동 롤백 기능 등의 기능을 가지고 있어

디플로이먼트를 사용하여 레플리카셋을 관리하는 것이 훨씬 편리하다.

그래서 Replicaset.yaml 작성하기보다 처음부터 Deployment.yaml을 작성하여 ReplicaSet을 생성한다.

 

Deployment 생성

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

 

Deployment 변경 (Rollout)

Deployment가 변경(RollOut)되면 신규 ReplicaSet이 생성(RollingUpdate)된다.

이 '변경'은 레플리카셋의 수의 변경이 아닌, spec.template에 변경이 있으면 신규 ReplicaSet이 생성된다.

즉, Template으로 생성된 파드의 내용 변경이 있으면 신규가 생기는 것이다.

나머지의 변경은 기존 레플리카셋을 이용한다.

 

업데이트 방식은

  • manifest 파일 업데이트 후 kubectl apply -f 명령어 사용
  • kubectl set image 명령어 사용

두 가지가 있다.

 

여기서는 kubectl set image 명령어를 사용해보겠다.

# 컨테이너 이미지 업데이트
$ kubectl set image deployment sample-deployment nginx-container=nginx:1.17
deployment.apps/sample-deployment image updated

nginx:1.16 이미지를 nginx:1.17 이미지로 업데이트한다.

 

업데이트 상태 확인

# 디플로이먼트 업데이트 상태 확인
$ kubectl rollout status deployment sample-deployment
...(생략)...
Waiting for deployment "sample-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "sample-deployment" rollout to finish: 1 old replicas are pending termination...

# kubectl rollout status 명령어를 사용하여 디플로이먼트 업데이트 상태를 확인할 수 있다.

 

# 디플로이먼트 확인
$ kubectl get deployments
NAME			READY	UP-TO-DATE	AVAILABLE	AGE
sample-deployment	3/3	3		3		6m19S

# 레플리카셋 확인
$ kubectl get replicasets
NAME				DESIRED	CURRENT	READY	AGE
sample-deployment-5988b 	3	3	3	2m31s  # 신규 레플리카셋
sample-deployment-7bf98 	0	0	0	6m31s  # 기존 레플리카셋

기존 레플리카셋이 하나씩 Delete되고, 신규 레플리카셋이 하나씩 Create 되면서

단계적으로 롤링 업데이트가 진행된다.

 

롤백(RollBack)

기존 레플리카셋은 레플리카 수가 0인 상태로 남아 있기 때문에 레플리카 수를 변경시켜 다시 사용할 수 있는 상태가 된다.

# 버전 번호를 지정하여 롤백
$ kubectl rollout undo deployment sample-deployment --to-revision 1
deployment.apps/sample-deployment rolled back

# 바로 이전 버전으로 롤백하는 경우(기본값인 --to-revision 0이 지정되어 바로 이전 버전으로 롤백)
$ kubectl rollout undo deployment sample-deployment
deployment.apps/sample-deployment rolled back

 

롤백한 후에는 이전 레플리카셋의 파드가 기동된다.

# 롤백한 후 이전 레플리카셋에서 파드가 기동됨
$ kubectl get replicasets
NAME			DESIRED	CURRENT	READY	AGE
sample-deployment-5988	  0	  0	  0	 31m		# 신규 레플리카셋
sample-deployment-7bf9	  3       3	  3	 35m		# 이전 레플리카셋

 

 

변경 이력 확인

# kubectl rollout history deployment [디플로이먼트명]

디플로이먼트 생성 시에 --record 옵션을 사용했다면, 변경 이력에서 CHANGE-CAUSE 항목 내용을 볼 수 있다.

# 초기 상태의 deployment
$ kubectl rollout history deployment sample-deployment --revision 1
deployments.apps/sample-deployment with revision #1
Pod Template:
  Labels:	app=sample-app
  		pod-template-hash=7bf986f9cf
  Annotations:	kubernetes.io/change-cause: kubectl apply --filename=sample-deployment.yaml --record=true
  Containers:
    nginx-container:
     Image: nginx1.16
     Port: <none>

해당 수정 버전에 대한 상세 정보를 가져오려면 --revision 옵션을 지정한다.

2를 지정하면 롤링 업데이트 한 번 이후의 디플로이먼트 버전을 가져 온다.

 

디플로이먼트 변경 일시 중지

새 버전 디플로이먼트를 즉시 적용하지 못하는 상황 및 기타 등등의 상황으로 Rollout을 일시 정지한다.

# 업데이트 일시 정지
$ kubectl rollout pause deployment sample-deployment
deployment.apps/sample-deployment paused

# 업데이트 일시 정지 해제
$ kubectl rollout resume deployment sample-deployment
deployment.apps/sample-deployment resumed

pause 상황에서는 # kubectl set image 명령어를 사용해도 업데이트가 즉시 반영되지 않는다. (롤백도 불가능)

 

디플로이먼트 업데이트 전략

디플로이먼트를 업데이트하면 롤링 업데이트가 실행된다.

spec.strategy.type 항목의 기본값이 RollingUpdate로 되어 있기 때문이다.

 

업데이트 전략에는

  • RollingUpdate
  • Recreate

두 가지가 있다.

 

Recreate

모든 파드를 한 번 삭제하고 다시 파드를 생성하기 때문에 다운타임이 발생하지만,

추가 리소스를 사용하지 않고 전환이 빠른 것이 장점이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: sample-recreate-deployment
spec:
  strategy:
    type: Recreate
  replicas: 3
  selector:
    matchLabels:
      apps: value
  template:
    labels:
      apps: value
    spec:
      containers:
      - name: nginx-app
        image: nginx:1.16

Recreate의 경우 기존 레플리카셋의 레플리카 수를 0으로 하고 리소스를 반환한다.

이후 신규 레플리카셋을 생성하고 레플리카 수를 늘린다.

일괄적 업데이트를 실행하므로 비교적 빠르게 전환할 수 있다.