본문 바로가기

GitOps/Kubernetes

[Kubernetes] Controller

쿠버네티스 컨트롤러

  • 기본적인 개념은 여기에서

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