역할 이해하기
디플로이먼트의 주된 역할은 파드의 개수를 관리하는 것이다.
기존의 로드밸런스의 경우 클라이언트로부터 받은 요청을 여러 서버 중 한대에 전송한다. 애플리케이션의 처리를 여러 서버가 분담하는 구조인 것이다. 이러한 구조는 서버의 대수를 늘려 처리능력을 향상시킬 수 있다. 그리고 여분의 서버를 미리 투입하면 한 대의 서버에 장애가 발생해도 문제없이 서비스를 지속할 수 있다.
K8s 클러스터에서는 파드가 서버의 역할을 담당한다. 그래서 처리 능력을 높이고 싶은 경우에는 파드의 수를 늘리면 된다. 그리고 여분의 파드를 가동해 두면 일부 파드에 문제가 생겨도 큰 문제 없이 서비스를 지속할 수 있다.
이처럼 파드의 개수를 관리하는 것은 시스템의 처리 능력, 서비스를 중단하지 않는 가용성, 그리고 비용 측면에서 매우 중요하다. 디플로이먼트는 요청한 개수만큼 파드를 기동하여, 장애 등의 이유로 파드의 개수가 줄어들면 새롭게 파드를 만들어 기동한다. 그리고 애플리케이션의 버전을 업그레이드할 때 새로운 버전의 파드로 조금씩 바꾸는 기능도 제공한다.
하지만 로드밸런서에 해당하는 기능은 디플로이먼트에 포함되어 있지 않다. 이 기능은 쿠버네티스의 서비스라는 오브젝트가 담당함.
example yml
## 디플로이먼트
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deploy
spec:
replicas: 3
selector: # deployment - pod 대응용
matchLabels:
app: web
template: # 여기서부터 파드 템플릿
metadata:
labels:
app: web # 파드의 라벨
spec:
containers:
- name: nginx
image: nginx:latest
스케일 기능
스케일 기능이란 레플릴카의 값을 변경하여 파드의 개수를 조절해서 처리 능력을 높이거나 낮추는 기능을 말한다. 여기서는 수동으로 레플리카값을 변경하는 방법을 배운다. 오토 스케일링은 14장에서 배움
→ yml 파일의 replicas 값만 변경 후 apply 커맨드를 실행시키면 된다. 동일한 메타데이터인 web-deploy 디플로이먼트가 이미 있으므로 해당 디플로이먼트의 설정만 변경됨.
디플로이먼트로 늘릴 수 있는 것은 파드의 개수뿐이다. 파드의 개수를 늘리는 중에 K8s 클러스터의 자원이 부족해지면 노드를 추가하여 자원이 생길 때까지 파드 생성이 보류된다. 메모리가 부족한 상황에서 리눅스의 가상 메모리를 사용하여 메인 메모리를 페이징하면서까지 파드를 늘려주지는 않는다. 따라서 파드의 개수를 늘리기 전에 클러스터의 가용 자원을 확인하여 노드의 증설을 검토할 필요가 있다.
롤아웃 기능
쿠버네티스에서 롤아웃은 컨테이너의 업데이트를 의미한다.
롤아웃을 하기 위해서는 사전에 새로운 이미지를 빌드하고, 리포지터리에 등록해 놓아야 한다. 그리고 새로운 이미지를 매니페스트의 Image 항목에 기재하고 ‘kubectl apply -f’를 적용하면 롤아웃이 시작된다.
롤백 기능
롤백도 롤아웃과 마찬가지로 사용자의 요청을 처리하면서 파드를 점진적으로 교체한다.
하지만 데이터베이스 등에 적재된 데이터까지 롤백되는 것은 아니다. 데이터 리커버리는 별도로 구현해야 한다.
kubectl rollout undo deployment web-deploy
자동 복구
파드 내의 컨테이너가 어떠한 이유로 종료한 경우, 기본 동작으로 파드가 컨테이너를 재시작한다. 즉, 파드는 컨테이너 수준의 장애에 대해 자동 복구를 시작한다.
디플로이먼트를 이용한 고가용성 구성
하나의 파드와 퍼시스턴트 볼륨을 사용하면 액티브 스탠바이 고가용성 구성(HA구성)을 만들 수 있다.
kubectl cordon node1
- node1 스케줄 중지kubectl drain node1 --ignore-daemonsets
- 가동 중인 파드를 다른 노드에 이동
Loading Comments...