Kubernetes/Kubernetes Advanced

📌 [DaemonSet 심화편 #2] DaemonSet 업데이트 전략과 무중단 롤링 배포 적용

ygtoken 2025. 3. 21. 17:33
728x90

1️⃣ 개요

 

DaemonSet은 클러스터의 모든 노드에 Pod를 배포하는 강력한 도구이지만, 업데이트 전략을 적절히 구성하지 않으면

애플리케이션이 일시적으로 중단되거나 비효율적으로 배포될 수 있습니다.

 

이번 글에서는 DaemonSet의 업데이트 전략의 개념을 이해하고, 무중단 롤링 배포(Rolling Update)를 적용하는 방법을 소개합니다. 

 


2️⃣ DaemonSet 업데이트 전략이 필요한 이유

상황 문제점 업데이트 전략 필요성
이미지 버전 변경 기존 Pod가 중단되고 새로 생성됨 순차적 롤링 배포 필요
환경 변수 변경 모든 노드에서 한 번에 재시작 트래픽 손실 가능
설정 누락 시 업데이트 적용되지 않음 전략 명시 필요

업데이트 전략을 명확히 설정하지 않으면 수동 업데이트를 반복해야 하며, 장애나 서비스 중단 가능성이 커집니다.

 


3️⃣ DaemonSet의 기본 업데이트 전략 구성 방법

 

✅ RollingUpdate 전략을 명시적으로 설정

updateStrategy:
  type: RollingUpdate                 # 롤링 업데이트 방식으로 지정
  rollingUpdate:
    maxUnavailable: 1                # 동시에 업데이트될 수 있는 최대 노드 수

 

📌 주석 설명

type: RollingUpdate : DaemonSet의 기본 동작을 순차 업데이트로 전환합니다.

maxUnavailable: 1 : 전체 노드 중 최대 1개의 Pod만 동시에 중단될 수 있도록 설정합니다.

예를 들어, 노드가 10개면 한 번에 1개씩만 업데이트되므로 서비스 안정성을 유지할 수 있습니다.

 

이 전략을 사용하면 DaemonSet이 점진적으로 모든 노드의 Pod를 재생성합니다.

 


✅ 전체 DaemonSet 구성 예제 (Node Exporter 기준)

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: node-exporter
  labels:
    app: node-exporter
spec:
  selector:
    matchLabels:
      app: node-exporter             # Pod 선택 기준
  updateStrategy:
    type: RollingUpdate              # 업데이트 전략 설정
    rollingUpdate:
      maxUnavailable: 1              # 무중단 배포를 위한 제한
  template:
    metadata:
      labels:
        app: node-exporter
    spec:
      containers:
        - name: node-exporter
          image: prom/node-exporter:v1.7.0   # 특정 버전 명시 (버전 업데이트 테스트 가능)
          ports:
            - containerPort: 9100            # Node Exporter 기본 포트

📌 설명

이 설정은 node-exporter를 모든 노드에 배포하면서도, 최대 1개의 노드에서만 Pod를 동시에 재시작합니다.

운영 중에도 무중단으로 배포가 가능하도록 구성되었습니다.

 


4️⃣ DaemonSet 롤링 업데이트 수행 명령어

 

✅ 이미지 버전 변경 시 적용 방법

kubectl set image daemonset/node-exporter node-exporter=prom/node-exporter:v1.7.1

📌 설명

DaemonSet에 정의된 node-exporter 컨테이너 이미지를 v1.7.1로 변경합니다.

이 변경 사항은 RollingUpdate 전략에 따라 점진적으로 각 노드에 적용됩니다.

 


✅ 수동 롤링 업데이트 트리거 (내용은 동일하나 재시작 필요할 때)

kubectl rollout restart daemonset node-exporter

 

📌 설명

구성 값은 바뀌지 않았지만, 재시작이 필요할 때 사용하는 명령어입니다.

모든 노드에서 Pod가 순차적으로 재시작됩니다.

 


✅ 롤링 업데이트 상태 확인

kubectl rollout status daemonset node-exporter

 

📌 설명

업데이트가 정상적으로 완료되었는지 확인할 수 있습니다.

아직 업데이트 중인 노드가 있으면 출력에 남아있고, 모두 완료되면 메시지가 종료됩니다.

 


5️⃣ DaemonSet 업데이트 실패 시 롤백 방법

 

✅ 히스토리 확인

kubectl rollout history daemonset node-exporter

 

📌 설명

이전에 배포된 DaemonSet의 버전과 변경 사항을 확인할 수 있습니다.

 

✅ 롤백 실행

kubectl rollout undo daemonset node-exporter

 

📌 설명

마지막 안정된 버전으로 DaemonSet 구성을 되돌릴 수 있습니다.

롤링 업데이트와 동일한 방식으로 Pod가 다시 재시작됩니다.

 


6️⃣ DaemonSet 업데이트 전략 적용 시 고려 사항

항목 설명
Pod 수 노드 수가 많을 경우 maxUnavailable 값을 늘릴 수 있음
네트워크 부하 동시에 많은 Pod가 재시작되면 네트워크/디스크에 부담 가능
상태 점검 kubectl get ds -o wide, rollout status로 상태 지속 확인 필요
Sidecar 사용 시 Istio, Linkerd 등과 연동되는 경우 재시작 순서에 주의

✅ 특히 운영 환경에서는 maxUnavailable 값을 1~2 수준으로 유지하는 것을 추천합니다.

 


🔥 7️⃣ 결론

 

DaemonSet은 기본적으로 자동 롤링 업데이트가 활성화되지 않으므로 명시적 설정이 필요합니다.

RollingUpdate 전략을 활용하면 무중단 배포가 가능하며, 서비스 안정성을 유지할 수 있습니다.

업데이트 적용 후에는 rollout 명령어를 통해 상태를 반드시 확인해야 합니다.

이미지 변경, 환경 변수 변경 등 모든 변경 사항에 이 전략이 적용됩니다.

 

728x90