728x90
■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 개요
- 디플로이먼트에서 의도하는 상태를 설명하고, 디플로이먼트 컨트롤러(Controller, API 서버를 통해 K8S 클러스터를 모니터링 하고, 현재 상태를 원하는 상태로 이행 시키는 역할 수행)는 현재 상태에서 의도하는 상태로 비율을 조정하며 변경 한다.
- 디플로이먼트는 파드와 레플리카셋(ReplicaSet)에 대한 선언적 업데이트를 제공 한다.
- 선언적 업데이트란 원하는 상태를 정의하고 쿠버네티스가 이를 자동으로 달성하도록 하는 방식. 사용자는 시스템의 최종 상태를 선언하고, 쿠버네티스는 현재 상태를 이 최종 상태로 맞추기 위해 필요한 모든 작업을 수행합니다. 이를 통해 사용자는 복잡한 업데이트 절차를 직접 관리할 필요 없이, 단순히 원하는 상태를 정의하면 됩니다.
■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
- 3개의 nginx 파드를 불러오기 위한 레플리카셋을 생성하는 yaml 코드이며 해당 코드에 대한 설명은 아래와 같다
- `.metadata.name` 필드에 따라 nginx-deployment 이름을 가진 디플로이먼트 생성
- `spec.replicas` 필드에 따라 드플로이먼트는 3개의 레플리카 파드를 생성하는 레플리카셋 생성
- `.spec.selector` 필드는 생성된 레플리카셋이 관리할 파드를 찾는 방법을 정의한다. 해당 예제 에서는 `.spec.template.metadata.lables`에 있는 app:nginx 를 의미한다
- `.spec.template.spec.containers` 필드를 통해 파드에 부여될 이름, 이미지, 서비스 포트를 정의 한다
- 디플로이먼트 실행 과정
항목 | 명령어 | 설명 |
생성 | kubectl apply -f [파일명.yaml] | 디플로이먼트 생성 명령 수행 |
생성 확인 |
kubectl get deployments | 디플로이먼트의 생성을 확인 할 수 있다. 아래는 결과값의 필드가 내포하는 의미 이다. ▪ NAME : 네임스페스이스에 있는 디플로이먼트 이름 ▪ READY : 사용자가 사용할 수 있는 애플리케이션 레플리카의 수 . ready/desired 패턴을 따른다 ▪ UP-TO-DATE : 의도한 상태를 얻기 위해 업데이트된 레플리카의 수 ▪ AVAILABLE : 사용자가 사용할 수 있는 애플리케이션 레플리카의 수 ▪ AGE : 애플리케이션의 실행된 시간을 표시 |
롤-아웃 확인 |
kubectl rollout status deployment/nginx-deployment | 디플로이먼트의 롤-아웃 상태를 확인 한다. |
레플리카셋 확인 | kubectl get rs | 레플리카셋의 상태 정보를 확인 한다. 아래는 결과값의 필드가 내포하는 의미이다. ▪ NAME: 네임스페이스에 있는 레플리카셋 이름의 목록이며, 레플리카셋의 이름은 항상 [DEPLOYMENT-NAME]-[HASH] 형식이다. HASH 문자열은 레플리카셋의 pod-template-hash 레이블과 같다 ▪ DESIRED: 디플로이먼트의 생성 시 정의된 의도한 애플리케이션 레플리카 의 수를 표시한다. (의도한 상태) ▪ CURRENT: 현재 실행 중인 레플리카의 수를 표시한다. ▪ READY: 사용자가 사용할 수 있는 애플리케이션의 레플리카의 수를 표시한다. ▪ AGE: 애플리케이션의 실행된 시간을 표시한다. |
※ 템플릿에는 레이블과 셀렉터를 반드시 명시 해야 한다. 레이블 또는 셀렉터가 다른 디플로이먼트 컨트롤러와 겹치게 될 경우 예상치 못한 동작이 수행 될 수 있다.
※ 쿠버네티스에서는 셀렉터 및 레이블에 대한 중복 검사를 수행 하지 않는다
■ pod-template-hash 레이블
- 디플로이먼트 컨트롤러에 의해 생성 또는 채택한 모든 레플리카셋에 추가되며, 해당 레이블 정보를 통해 디플로이먼트 자식 레플리카셋이 겹치지 않도록 보장한다.
- 레플리카셋의 PodTemplate 을 해싱하고, 해시 결과를 레플리카셋 셀렉터, 파드 템플릿 레이블 및 레플리카셋 이 가질 수 있는 기존의 모든 파드에 레이블 값으로 추가해서 사용하도록 생성한다
반응형
■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 업데이트
- 디플로이먼트 파드 템플릿 (.spec.template)이 변경된 경우에만 디플로이먼트의 롤아웃이 트리거 됩니다.
- nginx 1.14.2 → nginx 1.16.1 이미지 변경 방법
- `kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1`
- `kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1`
- `kubectl edit deployment/nginx-deployment`
- image: nginx:1.14.2 → image: nginx:1.16.1 수정
- 롤-아웃 상태 확인
- `kubectl rollout status deployment/[deployment-name]`, 앞서 사용한 yaml 코드의 deployment의 name 부분 입력. 결과값은 롤-아웃이 진행 및 성공 여부를 확인할 수 있다.
- 롤-아웃이 성공하면 kubectl get deployments를 실행하여 디플로이먼트의 정보를 확인 할 수 있다.
- 레플리카셋 확인
- `kubectl get rs` 명령어를 통해 이전 레플리카셋 정보와 디플로이먼트를 통해 생성된 신규 레플리카셋이 있는 것을 확인할 수 있다. 이전 레플리카셋은 0개로 스케일 다운되고 신규 레플리카셋은 3개로 스케일 업 된다.
- 파드
- 디플로이먼트 파드 템플릿을 업데이트하면 파드가 업데이트 된다. 파드는 레플리카셋에 의해 그룹으로 관리되고 일괄적인 중지가 아닌 일정한 수의 파드만 중단이 된다.
- 디플로이먼트는 작업 과정에서 일정 수준 이하의 파드만 동작하는 것도 제한하지만 일정 수준 이상의 파드가 동작하는 것도 제한한다. 최소 수준의 기준값의 75% 최대 수준은 기준값의 125%까지 보장 한다.
- 예를 들어 레플리카 기준값이 4일 경우 최소 제한은 3개의 파드 (4*0.75)이고 최대 제한은 5개 파드 (4*1.25) 이다.
- nginx 1.14.2 → nginx 1.16.1 이미지 변경 방법
- 롤-오버 (다중 업데이트)
- 디플로이먼트 컨트롤러는 디플로이먼트에서 레플리카셋이 의도한 파드를 생성하는 것을 모니터링 하는데, 만약 디플로이먼트가 업데이트 되면 기존 레플리카셋에서 selector 레이블과 일치하는 파드는 컨트롤 하지만 파드 템플릿 항목을 업데이트 하게 되면 HASH 값이 기존과 달라지게 된다. 결과적으로 기존의 레플리카셋의 파드의 수량은 0개로 스케일 다운 된다.
- 기존 레플리카셋을 롤-아웃 하는 과정에서 새로운 레플리카셋을 업데이트하게 되면 디플로이먼트가 새로운 레플리카 셋을 생성하게 되고 스케일 업을 수행 한다. 컨트롤러는 기존 레플리카셋에서 생성되는 파드를 즉시 제거 한다.
- 즉, nginx:1.14.2 레플리카 5개를 생성하는 작업에서 파드 3개가 생성 되었을 때 nginx:1.16.1 로 업데이트를 수행하게 되면 컨트롤러는 즉시 기존에 생성된 1.14.2 파드 3개를 죽이기(terminating) 시작하고 nginx:1.16.1 파드를 생성하기 시작한다. 1.14.2 파드 5개가 생성이 완료 이후 작업이 수행되는 것이 아니라 새로운 명령을 받는 즉시 작업이 수행 되기 때문에 다중 업데이트라고 표현 한다.
- 레이블 셀렉터 업데이트
- 쿠버네티스에서는 레이블 셀렉터를 업데이트하는 것을 권장하지 않고, 셀렉터를 미리 계획하여 사용하는 것을 권장 한다. 만약 셀렉터를 업데이트 해야 한다면 영향도 파악이 필수적이다.
- API 버전 apps/v1에서 디플로이먼트 레이블 셀렉터는 생성 이후 변경 할 수 없다.
■ 쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 롤아웃 중지와 재개
- 디플로이먼트를 업데이트할 때 롤아웃을 중지 시킬 수 있는데, 불필요한 롤아웃을 발생 시키지 않고 디플로이먼트를 수정한 뒤 롤아웃을 재개하여 업데이트를 수행 시킬 수 있다.
- `kubectl rollout pause deployment/[이름]` pause 명령을 통해 롤아웃을 중지 시킨다.
- `kubectl set image deployment/[이름] nginx=nginx:1.16.1 ` 으로 수정해도 롤아웃은 발생 하지 않는다.
- `kubectl rollout history deployment/[이름]` 으로 확인 하면 롤백을 위한 버전이 생성되지 않았다
- `kubectl rollout resume deployment/[이름]` resume 명령어로 롤아웃을 재개 시킨다. 이후 롤아웃이 정상적으로 수행 되는 것을 확인 할 수 있다.
728x90
'K8S' 카테고리의 다른 글
쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 스케일링 (0) | 2024.09.22 |
---|---|
쿠버네티스(Kubernetes) 디플로이먼트 (Deployment) 롤백 & 상태 (0) | 2024.09.13 |
쿠버네티스(Kubernetes) 중단 (Disruption) (0) | 2024.08.30 |
쿠버네티스(Kubernetes) NameSpace CPU 자원 할당 (1) | 2024.08.25 |
쿠버네티스(Kubernetes) NameSpace 메모리 자원 할당 (0) | 2024.08.25 |