
데몬셋 배포 후 찾아오는 갑작스러운 클러스터 장애
새벽 2시, 갑자기 울리는 알람 소리에 잠에서 깨어나 모니터를 켭니다. 로그 수집을 위해 새로 배포한 데몬셋(DaemonSet)이 모든 노드의 메모리를 순식간에 점유해 버렸어요. 클러스터의 모든 노드가 NotReady 상태로 변했고, 서비스는 완전히 멈췄습니다. 혼자서 서버를 관리하는 상황이라면 이 공포는 상상 이상으로 크게 다가와요.
데몬셋은 모든 노드에 특정 포드를 자동으로 배치하기 때문에, 설정 하나만 잘못되어도 클러스터 전체에 영향을 미치는 파괴적인 영향력을 가집니다. 일반적인 디플로이먼트(Deployment)와 달리 노드 단위로 동작하기 때문에, 실수로 배포했다가는 모든 서버가 동시에 비명을 지르게 돼요. 단순히 ‘잘 돌아가겠지’라는 마음으로 배포 버튼을 누르는 것은 매우 위험해요.
이런 사고를 방지하려면 배포 전 단계부터 꼼꼼한 검증 과정이 필요합니다. 운영 경험이 부족한 초보 관리자부터, 리소스가 한정적인 스타트업의 1인 담당자까지 반드시 거쳐야 할 검증 절차가 있어요. 이 글을 끝까지 읽고 나면, 데몬셋을 배포할 때 무엇을 확인해야 하는지 명확한 기준을 갖게 될 거예요.
오늘 다룰 내용은 다음과 같아요.
- 설계 단계에서 놓치기 쉬운 리소스 및 스케줄링 기준
- 배포 직전 반드시 체크해야 할 설정값들
- 배포 후 정상 작동 여부를 판단하는 검증 방법
- 정기적인 운영 관리를 위한 유지보수 항목
사전 준비 — 안정적인 데몬셋을 위한 설계 원칙
데몬셋을 만들기 전에 가장 먼저 고민해야 할 것은 어떤 노드에, 어떤 권한으로, 얼마나 많은 자원을 사용할 것인가 하는 문제입니다. 무턱대고 YAML 파일을 작성하기 전에, 우리 클러스터의 환경과 데몬셋의 목적을 일치시키는 작업이 선행되어야 해요. 이 준비 과정이 부실하면 배포 이후에 수많은 수정 작업을 반복해야 하거든요.
핵심 결정 사항과 판단 기준
데몬셋을 설계할 때 관리자는 크게 세 가지 선택지 사이에서 결정을 내려야 합니다. 노드 선택 방식, 리소스 할당량, 그리고 업데이트 전략이에요. 각 기준에 따라 클러스터의 안정성이 결정되므로 신중하게 선택해야 해요.
| 구분 항목 | 선택 옵션 | 특징 및 주의사항 |
|---|---|---|
| 노드 선택 방식 | NodeSelector | 간단한 라벨 기반 선택, 유연성이 다소 부족함 |
| 노드 선택 방식 | Affinity | 복잡한 조건 설정 가능, 스케줄링 연산량 증가 |
| 업데이트 전략 | RollingUpdate | 순차적 교체, 서비스 중단 최소화 가능 |
| 업데이트 전략 | OnDelete | 수동 삭제 시에만 업데이트, 제어권이 높음 |
스케줄링 전략의 중요성
모든 노드에 데몬셋이 돌아가야 한다고 해서 아무런 제약 없이 배포하는 것은 위험해요. 예를 들어, 마스터 노드(Control Plane)는 클러스터의 두뇌 역할을 하기 때문에 로그 수집기나 보안 에이전트 같은 부가적인 작업이 돌아가는 것을 방지해야 합니다. 이를 위해 Taints(테인트)와 Tolerations(톨러레이션) 개념을 정확히 이해하고 설계에 반영해야 해요.
Taint는 노드에 ‘이런 조건이 아니면 들어오지 마’라고 설정하는 것이고, Toleration은 포드가 ‘그 조건을 견딜 수 있어’라고 선언하는 것입니다. 데몬셋이 마스터 노드에 배포되지 않게 하려면 마스터 노드의 Taint를 확인하고, 반대로 배포되어야 한다면 적절한 Toleration을 추가해야 해요.
또한, 리소스 예산(Resource Budget)을 미리 계산해야 합니다. 클러스터의 총 노드 수가 100대라면, 데몬셋 하나가 사용하는 메모리가 500MB일 때 클러스터 전체에서는 50GB의 메모리가 추가로 소요된다는 점을 잊지 마세요. 소규모 클러스터라면 이 차이는 매우 치명적일 수 있습니다.
단계별 실행 — 실무 데몬셋 배포 및 운영 프로세스
이제 본격적으로 데몬셋을 안전하게 배포하고 운영하는 단계를 살펴볼게요. 이 과정은 크게 설계, 배포 전 검증, 배포 후 모니터링, 그리고 정기 점검의 4단계로 나뉩니다. 각 단계를 건너뛰지 않고 차근차근 진행하는 것이 사고를 막는 가장 빠른 길이에요.
STEP 1. 리소스 제한 및 스케줄링 설계
가장 먼저 해야 할 일은 리소스 요청(Requests)과 제한(Limits)을 설정하는 거예요. 데몬셋은 모든 노드에 뜨기 때문에, 만약 Limit을 설정하지 않으면 특정 상황에서 노드 전체의 자원을 고갈시킬 수 있습니다. 로그 수집기(Fluentd 등)나 모니터링 에이전트(Prometheus Node Exporter 등)는 CPU 사용량보다 메모리 누수에 훨씬 취약하니, 메모리 Limit을 넉넉하면서도 보수적으로 잡는 것이 좋아요.
또한, 노드 셀렉터를 통해 배포 대상을 명확히 하세요. 예를 들어, GPU가 있는 노드에만 특정 가속 도구 데몬셋을 띄우고 싶다면 `accelerator: nvidia` 같은 라벨을 활용해야 합니다. 단순히 모든 노드에 띄우는 것은 자원 낭비의 지름길이에요.
STEP 2. 배포 직전 YAML 파일 정밀 검토
배포 명령어를 입력하기 직전, 마지막으로 체크리스트를 확인하세요. 특히 UpdateStrategy 설정을 유심히 봐야 합니다. `RollingUpdate`를 사용할 경우, 한 번에 몇 개의 노드에서 포드가 교체될지 결정하는 `maxUnavailable` 값을 설정할 수 있어요. 만약 이 값이 너무 크면, 업데이트 중에 클러스터의 특정 기능이 일시적으로 마비될 수 있으니 주의해야 합니다.
데몬셋의 이미지 태그를 `latest`로 사용하는 것은 절대 금물이에요. 어떤 노드에는 구버전 이미지가, 어떤 노드에는 신버전 이미지가 뜨는 혼란이 생길 수 있고, 장애 발생 시 롤백이 매우 어려워집니다. 반드시 특정 버전(예: `v1.2.3`)을 명시하세요.
STEP 3. 배포 후 상태 및 로그 검증
배포가 완료되었다면 즉시 `kubectl get pods -o wide` 명령어를 통해 모든 노드에 포드가 정상적으로 생성되었는지 확인하세요. 일부 노드에서 `Pending` 상태이거나 `CrashLoopBackOff`가 발생하고 있다면, 해당 노드의 리소스가 부족하거나 스케줄링 조건(Taint)이 맞지 않는 상태일 가능성이 높습니다.
로그 검증도 필수입니다. 포드가 실행 중이라고 해서 작업이 제대로 되고 있는 것은 아니에요. `kubectl logs [포드이름]` 명령어를 통해 에러 메시지가 찍히고 있지는 않은지, 특히 권한 문제로 인해 로그를 읽지 못하거나 시스템 파일을 수정하지 못하는 상황은 없는지 직접 확인해야 합니다.
STEP 4. 클러스터 규모에 따른 리소스 영향도 모니터링
배포 직후 1시간 동안은 메트릭을 집중적으로 관찰하세요. Grafana나 Prometheus를 사용 중이라면, 데몬셋이 차지하는 CPU와 메모리 점유율이 노드의 여유 자원을 얼마나 갉아먹고 있는지 확인해야 합니다. 노드 하나당 데몬셋이 차지하는 비중이 10%를 넘어간다면, 설계 단계에서 리소스 제한을 다시 검토해야 할 신호입니다.
[실무 시나리오] 로그 수집기 배포 사례
한 스타트업에서 노드 5대 규모의 클러스터에 로그 수집 데몬셋을 배포하는 상황을 가정해 볼게요.
- 상황: 모든 노드의 로그를 수집하기 위해 Fluent Bit 데몬셋 배포 결정
- 실수 사례: 리소스 Limit을 설정하지 않고 배포함
- 결과: 특정 노드에서 로그 폭증 발생 $
ightarrow$ Fluent Bit이 메모리 전체 점유 $
ightarrow$ 해당 노드의 Kubelet이 죽음 $
ightarrow$ 노드 NotReady 상태 진입 - 올바른 대응: 메모리 Limit을 200MiB로 엄격히 제한하고, `maxUnavailable: 1`로 설정하여 한 번에 하나의 노드만 업데이트되도록 관리함
STEP 5. 정기적인 업데이트 및 생명주기 관리
데몬셋은 한 번 배포하고 끝나는 것이 아니에요. 쿠버네티스 버전이 올라가거나 데몬셋 소프트웨어 자체에 보안 패치가 나오면 정기적으로 업데이트해야 합니다. 이때도 반드시 롤링 업데이트 전략을 사용하여 클러스터 전체의 안정성을 유지하며 단계적으로 진행해야 합니다.
자주 하는 실수와 해결법 및 자주 묻는 질문
데몬셋 운영 과정에서 관리자들이 가장 빈번하게 겪는 문제들을 정리했습니다. 비슷한 상황을 겪고 있다면 아래 내용을 통해 빠르게 해결책을 찾아보세요.
자주 하는 실수와 해결법
❌ 실수: 모든 노드에 데몬셋이 뜨도록 아무 설정도 안 함
이유: 마스터 노드나 전용 워커 노드(GPU 노드 등)에 불필요한 리소스가 낭비되거나 충돌이 발생해요.
✅ 해결법: NodeSelector나 Affinity를 사용하여 꼭 필요한 노드에만 스케줄링되도록 범위를 좁히세요.
❌ 실수: 데몬셋 이미지 태그를 ‘latest’로 사용함
이유: 노드마다 실행 중인 이미지 버전이 달라져서 디버깅이 불가능해지고 롤백이 안 돼요.
✅ 해결법: 반드시 `v1.2.3`과 같이 고유한 버전 태그를 명시해서 사용하세요.
❌ 실수: 리소스 Limit(제한) 설정을 누락함
이유: 데몬셋의 버그나 로그 폭증 시 노드 전체의 자원을 점유하여 클러스터를 다운시켜요.
✅ 해결법: CPU와 메모리에 대해 반드시 적절한 Requests와 Limits를 설정하세요.
❌ 실수: Taint가 걸린 노드에 배포하려고 함
이유: 포드가 생성되지 않고 계속 Pending 상태로 머물게 됩니다.
✅ 해결법: 해당 노드의 Taint를 확인하고, 포드 설정에 적절한 Toleration을 추가하세요.
❌ 실수: 업데이트 전략을 고려하지 않고 대량 배포함
이유: 모든 노드의 포드가 동시에 재시작되어 서비스 가용성이 떨어질 수 있어요.
✅ 해결법: `maxUnavailable` 값을 사용하여 순차적으로 업데이트되도록 설정하세요.
자주 묻는 질문
Q. 데몬셋과 디플로이먼트의 가장 큰 차이점은 무엇인가요?
데몬셋은 노드당 하나씩 포드를 띄우는 것이 목적이고, 디플로이먼트는 설정한 개수만큼 포드를 유지하는 것이 목적이에요. 데몬셋은 노드가 추가되면 자동으로 포드가 따라붙는다는 점이 핵심입니다.
Q. 특정 노드에는 데몬셋이 절대 뜨지 않게 할 수 있나요?
네, 가능해요. 해당 노드에 Taint를 설정하고, 데몬셋 설정에 그 Taint를 견딜 수 있는 Toleration을 넣지 않으면 됩니다. 또는 NodeSelector를 사용하여 특정 라벨이 없는 노드는 제외할 수도 있어요.
Q. 데몬셋 업데이트 중에 노드가 죽으면 어떻게 하나요?
업데이트 전략의 `maxUnavailable` 설정을 확인해야 해요. 이 값이 0이면 기존 포드가 정상적으로 떠야 새 포드를 띄우므로 안정적이지만, 업데이트 속도는 느려질 수 있습니다.
Q. 데몬셋 포드가 계속 Pending 상태인데 왜 그런가요?
주로 두 가지 이유예요. 첫째, 노드의 리소스(CPU/메모리)가 부족해서 요청한 양을 채울 수 없는 경우이고, 둘째, 노드에 설정된 Taint를 포드가 Toleration으로 견디지 못하는 경우입니다. `kubectl describe pod` 명령어로 상세 원인을 확인하세요.
Q. 데몬셋을 삭제하면 노드의 데이터도 삭제되나요?
아니요, 데몬셋은 포드를 관리하는 컨트롤러일 뿐이에요. 데몬셋을 삭제하면 해당 포드들은 사라지지만, 포드가 생성했던 로그 파일이나 데이터는 노드에 그대로 남을 수 있으니 별도로 정리해줘야 합니다.
안전한 운영을 위한 마무리 요약
데몬셋은 쿠버네티스 클러스터의 눈과 귀가 되어주는 고마운 존재이지만, 관리가 소홀하면 클러스터 전체를 위협하는 시한폭탄이 될 수도 있습니다. 오늘 살펴본 내용들을 다시 한번 복기하며 실무에 적용해 보세요.
- 모든 데몬셋은 반드시 리소스 Requests와 Limits를 명시해야 해요.
- 노드 선택을 위해 NodeSelector나 Affinity를 적극 활용하세요.
- 이미지 태그는 ‘latest’ 대신 구체적인 버전을 사용하세요.
- 업데이트 전략(RollingUpdate)의 가용성 범위를 설정하세요.
- 마스터 노드 배포 여부는 Taint와 Toleration으로 결정하세요.
- 배포 후에는 반드시 로그와 리소스 사용량을 모니터링해야 해요.
데몬셋 운영이 처음이라 막막하시다면, 지금 바로 실습 환경에서 작은 규모의 로그 수집기를 배포하며 위 체크리스트를 하나씩 적용해 보세요. 직접 겪어보는 시행착오가 가장 큰 자산이 될 거예요.
실행을 위한 다음 단계
- 오늘 할 일: 현재 운영 중인 데몬셋의 리소스 Limit 설정 여부 확인하기
- 이번 주 할 일: 데몬셋 이미지 태그가 버전 기반으로 관리되고 있는지 전수 조사하기
- 실행 직전 할 일: 배포 전 YAML 파일에 Taint/Toleration 설정이 적절한지 재검증하기
실습 중에 설정이 꼬이거나 예상치 못한 오류가 발생한다면 주저하지 말고 댓글로 질문을 남겨 주세요. 함께 고민하며 해결해 나가겠습니다!
함께 읽으면 좋은 글: 쿠버네티스 데몬셋 기본 개념 가이드, 클러스터 구축 입문 및 운영 기초