Pod를 정해진 수만큼 복제하고 관리
쿠버네티스 : 사용자가 요청한 상태 (자동으로) 유지관리 목적
Pod : 쿠버네티스 기본 단위; 한 개 또는 여러 개의 컨테이너를 추상화해 하나의 어플리케이션으로 동작하도록 만드는 컨테이너 묶음
사용자가 직접 또는 YAML 파일을 정의해 Pod를 생성하면 해당 Pod의 생명주기는 오직 사용자에 의해서만 관리
마이크로 서비스 아키텍처 구조의 어플리케이션을 배포하기 위해서는 여러 개의 Pod를 생성하여 배포
따라서 사용자는 여러개의 Pod를 생성하여 외부 요청을 여러 Pod에 분배하는 방식으로 구성
정해진 동일한 Pod가 항상 실행되도록 관리 => 사용자가 요구하는 상태가 되도록 Pod 관리
노드 (워커 노드) 장애 등의 이유로 Pod를 사용할 수 없다면 다른 노드 (워커 노드)에서 Pod를 재생성
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-nginx-pods-label
template:
metadata:
name: my-nginx-pod
labels:
app: my-nginx-pods-label
spec:
containers:
- name: nginx
image: nginx:1.20.0
ports:
- containerPort: 80
Deployment는 ReplicaSet을 관리하는 컨트롤러 역할; 쿠버네티스에서 가장 많이 사용되는 오브젝트
=> ReplicaSet을 이용하여 Pod 업데이트하고 이력을 관리하여 rollback하거나 특정 버전(Revision)으로 돌아가는 기능 제공
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pods
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
기본적으로 Deployment와 ReplicaSet의 YAML 내용은 차이 X
but ReplicaSet과 차이점은 kind에 Deployment로 기술
(Deployment는 ReplicaSet을 제어하여 Pod 관리)
kubectl apply -f <Deployment YAML 파일명> : Deployment 생성
kubectl get pod --show-labels : Pod 목록
kubectl get replicaset -o wide : ReplicaSet 목록
kubectl get deployments -o wide : Deployment 목록
[Deployment 이름]-[pod-template-hash 값]
kubectl get replicaset/deployment-nginx-xxxxxxx -o yaml : ReplicaSet을 YAML 형식으로 출력
kubectl get pod/deployment-nginx-xxxxxxx-xxxxx -o yaml : Pod을 YAML 형식으로 출력
서비스 제공을 위한 어플리케이션 배포 의미,
어플리케이션 배포시 기존 서비스를 제공하는 어플리케이션을 중단하고 배포하면 서비스 중단 시점 발생
downtime : 서비스가 중단되는 시점, 이를 줄이거나 없애기 위해 무중단 배포 방식 사용
무중단 방식의 가장 기본적인 방식; 사용중 인 인스턴스 내에서 새 버전을 점진적으로 교체
Blue는 구버전, Green은 신버전
운영중인 구버전과 동일한 신버전의 인스턴스 구성 후 Load Balancer를 통해 모든 트래픽을 한 번에 신버전 쪽으로 전환하는 방식
옛날 광부들이 유독가스 감지를 위해 카나리아 새를 이용한 것에서 유래, 잠재적 문제 상황을 미리 발견
Deployment는 ReplicaSet과 다르게 어플리케이션 업데이트 기능 가짐
Deployment YAML 파일의 spec.strategy 필드에 update 종류를 명시 + 생략시 RollingUpdate 기본 적용
watch "kubectl get deployment deployment-nginx"
kubectl apply -f <Deployment YAML 파일명>
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx-pods
strategy:
type: Recreate
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
strategy.rollingUpdate.maxSurge
strategy.rollingUpdate.maxUnavailable
kubectl apply -f <Deployment YAML 파일명>
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-nginx
labels:
app: deployment-nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx-pods
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 50%
maxUnavailable: 50%
template:
metadata:
name: nginx-pod
labels:
app: nginx-pods
spec:
containers:
- name: nginx
image: nginx:1.20.2
ports:
- containerPort: 80
- watch "kubectl get deployment"
- watch "kubectl get pods"
kubectl set image deployment/deployment-nginx nginx=nginx:1.23.0
kubectl rollout status deployment/deployment-nginx
Rollback : 새로운 어플리케이션을 배포했다가 문제가 생겨 이전 버전으로 되돌리는 과정
Deployment는 Rollback 기능 사용 가능
- kubectl rollout history deployment/<Deployment 이름>
: Deployment 배포 이력 확인- kubectl rollout history deployment/<Deployment 이름> --revision=<revision 번호>
: Deployment revision 에 대한 배포 정보 확인
- kubectl rollout undo deployment/<Deployment 이름>
: 이전 버전으로 롤백- kubectl rollout undo deployment/<Deployment 이름> --to-revision=<revision 번호>
: 특정 revision 번호로 롤백