쿠버네티스 컨트롤러
- 기본적인 개념은 여기에서
ReplicaSet
- 파드를 복제(replicate)하여 오토스케일링
- 장애 대처 및 안정적 집합 유지
- AWS의 ASG와 같다.
ReplicaSet 예제
# replicaset.yaml
# common API
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset
spec:
# 복제할 개수
replicas: 2
selector:
# 해당 label을 기반으로 복제함
matchLabels:
run: nginx-rs
# 복제할 pod 정의
template:
metadata:
# label 지정. selector에서 참고함
labels:
run: nginx-rs
spec:
containers:
- name: nginx
image: nginx
# manifest 붙여넣기
vi replicaset.yaml
# replicaset 생성
kubectl apply -f replicaset.yaml
# replicaset 확인 (rs로 축약해도 됨)
kubectl get replicaset
# 스케일링 규모 3으로 조정
kubectl scale rs --replicas 3 replicaset
# 파드 개수 확인
kubectl get pods
# 생성된 파드에서 임의로 하나 제거
kubectl delete pod replicaset-65rwm
# 다시 파드 개수 확인 (개수가 동일해야 함)
kubectl get pods
Deployment
- deployment를 생성하면 replicaset도 같이 생성함
Strategy
- RollingUpdate: 일부만 교체해서 다운 타임 없이 업데이트
- 아래 값들을 크게 설정하면 빠르지만, 리소스 부담이 커질 수 있다.
- maxUnavailable: 롤링 업데이트 시 삭제되는 파드의 수 혹은 비율
- maxSurge: 롤링 업데이트 시 생성되는 파드의 수 혹은 비율
- Recreate: 한번에 교체
롤링업데이트 예제
# rolling.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rolling
spec:
# deployment는 replicaset을 포함
replicas: 4
selector:
matchLabels:
run: nginx
# 배포 전략
strategy:
type: RollingUpdate
rollingUpdate:
# 동시 삭제 가능 pod 비율
maxUnavailable: 25%
# 동시 생성 가능 pod 비율
maxSurge: 25%
# 파드 템플릿
template:
metadata:
labels:
run: nginx
spec:
containers:
- name: nginx
image: nginx
# manifest 붙여넣기
vi rolling.yaml
# deployment 생성. record 옵션은 변경 사항 기록 (deprecated)
kubectl apply --record -f rolling.yaml
# deployment 확인 (deploy로 축약 가능)
kubectl get deployment
# replicaset 확인
kubectl get rs
# 파드 확인
kubectl get pods
# 이미지 업데이트 수행
kubectl set image deploy rolling nginx=nginx:1.7.9 --record
# ContainerCreating 상태인 파드 확인
kubectl get pods
# 배포 상태 확인
kubectl rollout status deploy rolling
# 배포 기록 확인 (record=true인 명령만)
kubectl rollout history deploy rolling
# 이미지 정보 확인 (nginx 버전)
kubectl get pod rolling-bd497645f-9lzxf -o yaml | grep "image: nginx"
롤백
- rollout history를 조회하여 롤백 가능 (history 내역 저장은 기본으로 10개)
자동 롤백 예제
# 위의 rollout 예제에서 이어서 진행
# 존재하지 않는 버전으로 업데이트
kubectl set image deploy rolling nginx=1.7.30 --record
# 파드 확인 (ErrImagePull 혹은 ImagePullBackOff가 있어야 함)
# 한 개(25%)씩 변경하는데, 잘못된 시도가 반복되므로 총 파드는 3개가 되어야 함.
kubectl get pods
# 히스토리 확인
kubectl rollout history deploy rolling
# 이전 단계로 롤백
kubectl rollout undo deployment rolling
# 버전 재확인 (1.7.9)
kubectl get deploy rolling -o yaml | grep "image: nginx"
# 특정 단계로 롤백
kubectl rollout undo deploy rolling --to-revision=1
# 버전 재확인 (latest)
kubectl get deploy rolling -o yaml | grep "image: nginx"
스케일링 예제
# 이전 단계에서 그대로 진행
# 8개로 파드 개수 증가
kubectl scale deploy --replicas 8 rolling
# 파드 개수 확인
kubectl get pods
StatefulSet
- Stateful한 Pod를 생성하는 워크로드
- 인덱스 부여
- 삭제 및 생성 순서 보장 (인덱스 0부터 생성, n부터 삭제)
- 파드는 고유한 스토리지 소유
- 파드에 고유한 DNS 부여
주의 사항
- 고유한 DNS를 제어하기 위해 사용자가 헤드리스 서비스를 미리 생성해야 한다.
- 파드가 소유한 스토리지는 persistent해야 한다. 파드가 재시작하더라도 동일한 스토리지를 소유한다.
- Persistent Storage Claim을 통해 파드에 지정할 스토리지를 미리 요청하거나, manifest에 명시해야 한다.
- StatefulSet의 삭제는 파드의 삭제를 보장하지 않는다.
- 롤링 업데이트로 인한 롤백 시, StatefulSet은 파드의 시작만 담당한다. 교체를 위한 파드 삭제는 사용자가 해야 한다.
예제
추가 예정
DeamonSet
'GitOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Pod (0) | 2025.01.16 |
---|---|
[Kubernetes] 리소스 (0) | 2025.01.15 |
[Kubernetes] 클러스터 생성 (0) | 2025.01.14 |
[Kubernetes] 개념 (0) | 2025.01.13 |