전공영역 공부 기록

쿠버네티스 statefulset OnDelete 전략

악분 2024. 10. 10. 00:47
반응형

 

 

OnDelete배포전략이란?

spec.updateStrategyOnDelete로 설정되어 있으면 onDelete 배포전략을 사용한다고 말합니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ondelete
spec:
  replicas: 3
  updateStrategy:
    type: OnDelete

 

onDelete 전략은 pod가 삭제될 때만 업데이트된 내용이 적용되는 방식입니다. 자동으로 pod가 업데이트되는 것을 방지하고, 사용자가 직접 pod를 하나씩 수동으로 업데이트할 때 사용합니다. 특히 pod 변경 사항이 큰 영향을 미칠 때 유용합니다.

 

언제 사용할까?

onDelete 전략은 스토리지에 영향을 주는 애플리케이션에서 사용됩니다. StatefulSet을 사용하는 애플리케이션은 보통 클러스터 모드로 구성되며, 각 애플리케이션은 자체 스토리지를 가지고 데이터를 동기화합니다. pod가 종료되고 다시 생성되면 클러스터에 합류하고, 그 사이의 공백 시간 동안 누락된 데이터를 동기화합니다. 관리자는 데이터 동기화 상태를 실시간으로 모니터링하고, 이를 기반으로 다음 pod를 업데이트하고 싶어할 겁니다. 이럴 때 onDelete 전략이 적합합니다.

 

OnDelete 배포 전략 실습

아래 statefulset을 배포합니다. nginx컨테이너를 사용하는 간단한 예제입니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: ondelete
spec:
  serviceName: "ondelete-headless"
  replicas: 3
  updateStrategy:
    type: OnDelete
  selector:
    matchLabels:
      app: ondelete
  template:
    metadata:
      labels:
        app: ondelete
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
      volumes:
      - name: emptydir-storage
        emptyDir: {}

 

pod를 조회하면 nginx pod 3개가 있습니다.

 

steatefulset에서 nginx 컨테이너 이미지 태그를 1.22로 변경하세요.

$ kubectl edit sts ondelete
image: nginx:1.22

 

실행중인 pod 컨테이너 이미지 태그가 변경되었는지 확인해보세요. 놀랍게도 컨테이너 이미지 태그가 변경이 안되었습니다.

kubectl get pod -o custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image"

 

컨테이너 이미지 태그를nginx 1.22로 변경했지만 변경이 안되었습니다. 그 이유가 onDelete모드이기 때문입니다. pod를 종료해야 새로운 pod가 생성되면서 컨테이너 이미지가  변경됩니다. ondelete-2pod를 종료시키고 다시 pod목록을 조회해보세요. ondelete-2pod만 컨테이너 이미지가 변경되었습니다.

 

onDelete모드의 단점

pod업데이트가 사람이 수동으로 한땀한땀 하다보니 휴먼에러가 발생할 수 있습니다. 작업자가 깜박하고 pod몇 개를 업데이트 안할 수 있습니다.

 

따라서 작업자는 작업을 마치기전에 모든 pod가 업데이트 되었는지 확인해야 합니다. steatefulsetcontrollerrevisions로 버전관리를 합니다. 이 특징을 이용해서 마지막 statefulset revisionpod revision이 일치하는지 검사합니다.

kubectl get controllerrevisions.apps
kubectl get pods -o custom-columns="NAME:.metadata.name,REVISION_HASH:.metadata.labels.controller-revision-hash"

반응형