본문 바로가기
가상화/Kubernetes

[Kubernetes] Deployment

by JINJINC 2023. 5. 16.
728x90
반응형

▣ Deployment

디플로이먼트(Deployment)는 쿠버네티스에서 상태가 없는(stateless) 앱을 배포할 때 사용하는 가장 기본적인 컨트롤러입 니다. 쿠버네티스가 처음 등장했을 때는 Replication Controller에서 앱을 배포했는데 최근에는 디플로이먼트를 기본적인 앱 배포에 사용합니다

 

Stateless Application이란?

클라이언트와 서버의 연결 구조에서 불필요한 상태의 반영을 위한 데이터나 리소스가 사용되지 않는 형태의 서비스 구조

 

파드와 레플리카셋은 '이력'이라는 개념이 없기 때문에 릴리스 후에 변경이 없는 애플리케이션을 관리하는데 적합합니다.

 

디플로이먼트는 이름처럼 배포 기능을 세분화 한 것으로 파드와 레플리카셋에 버전 관리 기능을 추가한 것이라고 생각하 면 이해가 쉽습니다. 단순히 실행시켜야 할 파드 개수를 유지하는 것 뿐만 아니라 앱을 배포할 때 롤링 업데이트 하거나, 앰 배포 도중 잠시 멈췄다가 다시 배포할 수 있습니다. 또한 앱 배포 후 이전 버전으로 롤백할 수도 있습니다. 레플리카셋과 완전히 다른 기능이라고 보기는 어렵고, 디플로이먼트가 레플리카셋을 관리하며 앱 배포를 더 세밀하게 관 리하는 것이라고 할 수 있습니다. 

 

 

디플로이먼트는 컨테이너 이미지 버전업 등 업데이트가 있을 때 새로운 사양 의 레플리카셋을 작성하고 순서대로 새로운 파드로 대체하여 롤아웃을 수행 합니다. 디플로이먼트는 레플리카셋과 달리 이력을 관리하기 때문에 1세대 이 전으로 되돌리는 롤백을 할 수 있습니다.

 

※ 디플로이먼트를 이용하여 애플리케이션을 업데이트 하는 방식
-ReCreate
- Rolling Update
- Blue/Green
- Canary

[1]  매니페스트 기본항목

필드 데이터형 설명 예시
apiVersion 문자열 api 버전, 존재하지 않는 값을 설정하면 오류가 발생 apps/v1
kind 문자열 쿠버네티스 리소스의 종류 Deployment
metadate Object 레플리카셋의 이름이나 라벨과 같은 메타데이터 name:nginx-deploymnet
spec PodSpec 레플리카셋의 상세정보를 설정  

[2] 디플로이먼트 스펙

 

필드 데이터형 설명
replicas 정수 클러스터 안에서 가동시킬 파드이 수, ㄱ기본값은 1
seletor LabelSecetor 어떤 파드를 가동시킬지에 대한 셀렉터, 파드의 템플레이트에 설정된 라벨과 일치해야 한다.
template PodTemplateSpec 실제로 클러스터 안에서 움직이는 파드의 수가 replicas에 설정된 파드의 수를 만족시키지 않을 때 서로 작성되는 파드의 템플릿

[3] Pod 템플릿

 

필드 데이터형 설명
metadata object 템플리스이 이름이나 라벨과 같은 데이터
spec PodSpec 파드의 상세정보를 설정 

 

[4] Pod 스펙

spec.template 하위의 [spec] 필드에는 Pod의 상세 정보를 설정합니다.

특히 .spec.template.spec.containers[] 필드의 하위에 .name, .image, .ports[], .containerPort

필드를 이용해 컨테이너의 구체적인 명세를 설정합니다.

 

 

# watch kubectl get all -o wide

 

----------------------------------------------------------------------------

# kubectl scale deployment.apps/nginx-deployment --replicas=2

 

 

or

 

# kubectl edit deployment.apps/nginx-deployment

“1를 6로 수정하기“

 

# vi ex07.yaml “1를 6로 수정하기“

# kubectl apply -f ex07.yaml

# vi ex07.yaml “6를 1로 수정하기“

 

# kubectl apply -f ex07.yaml

-----------------------------------------------------------------------

# kubectl delete deployment.apps/nginx-deployment

 

◎ 디플로이먼트 수정

이 상태에서 nginx-deployment의 컨테이너 이미지 설정 정보를 업데이트해보겠습니다. 업데이트하는 방법은 크게 세 가지가 있습니다.

 

1. kubectl set 명령으로 직접 컨테이너 이미지를 지정

2. kubectl edit 명령으로 현재 파드의 설정 정보를 연 다음 컨테이너 이미지 정보를 수정

3. 처음 적용했던 템플릿의 컨테이너 이미지 정보를 수정한 다음 kubectl apply 명령을 실행해서 변경

 

# 1번 방식을 사용하여 실행 중인 디플로이먼트에서 image 필드를 nginx:1.9.1 버전으로 변경해보겠습니다.

# kubectl set image deployment/nginx-deployment nginx-deployment=nginx:1.9.1

=> 위의 그림과 그 이전의 image인 ngnix 에서 nginx:1.9.1로 변경된것을 볼 수 있습니다. 

 

 

◎ 디플로이먼트 롤백

# 컨테이너 이미지를 변경한 내역을 보기위하여 다음과 같이 명령어를 입력합니다.

# kubectl rollout history deploy nginx-deployment

#위에서 이미지를 한 번 변경하였기 때문에 두 개의 리비전이 보이며, 현재 리비전은 2입니다. 특정 리비전의 상세 내용을 확인 하려면 --revision=리비전번호 옵션을 사용합니다.

# kubectl rollout history deploy nginx-deployment --revision=2

 

#이 상태에서 컨테이너 이미지를 수정하기 전인 리비전 #1로 롤백해보겠습니다.

# kubectl rollout undo deploy nginx-deployment --to-revision=1

 

리비전#2의 레플리카셋인 7b779c9598에 있던 파드들이 삭제되고 다시 리비전#1의 레플리카셋인 69cfdf4bc에 파드들이 생성된 것을 확인할 수 있습니다.

#kubectl rollout history deploy nginx-deployment

728x90
반응형

'가상화 > Kubernetes' 카테고리의 다른 글

[Kubernetes] Deployment Strategy  (1) 2023.05.16
[Kubernetes] ReplicaSet  (0) 2023.05.16
[Kubernetes] kubectl  (0) 2023.05.12

댓글