
데몬셋 운영 중 마주치는 당혹스러운 순간들
새로운 워커 노드를 클러스터에 추가했는데, 보안 로그를 수집해야 하는 에이전트가 작동하지 않는다는 알람을 받은 적이 있나요? 분명 데몬셋(DaemonSet)으로 설정해 두었는데, 왜 특정 노드에서만 파드(Pod)가 생성되지 않는지 원인을 찾지 못해 당황스러운 경험은 보안 담당자나 운영자라면 한 번쯤 겪게 되는 문제입니다.
보안 정책을 수립하는 입장에서는 모든 노드에 동일한 보안 솔루션이나 모니터링 도구가 반드시 떠 있어야 해요. 하지만 쿠버네티스 환경은 매우 동적이기 때문에, 노드가 추가되거나 설정이 변경되는 과정에서 데몬셋이 의도대로 동작하지 않는 예외 상황이 빈번하게 발생합니다. 이때 데몬셋 kubectl 명령어를 능숙하게 다루지 못하면, 보안 공백이 발생하는 시간을 줄이기 매우 어려워요.
이 글은 단순히 명령어를 나열하는 사전이 아니에요. 실제 클러스터 운영 현장에서 보안 에이전트의 상태를 점검하고, 문제가 생긴 노드를 빠르게 찾아내며, 설정을 안전하게 변경하는 실전 흐름을 담고 있습니다. 이 가이드를 모두 읽고 나면, 복잡한 터미널 화면 앞에서도 당황하지 않고 즉시 문제를 해결할 수 있는 능력을 갖추게 될 거예요.
이번 글에서 함께 살펴볼 내용은 다음과 같아요.
- 데몬셋의 핵심 개념과 관리 전 필수 체크리스트
- 조회, 생성, 수정, 삭제를 위한 실무 명령어 세트
- 문제가 생겼을 때 사용하는 디버깅과 로그 확인 기법
- 효율적인 운영을 돕는 필터링과 출력 포맷 활용 팁
- 실무에서 자주 범하는 실수와 해결 방법
데몬셋 명령어를 쓰기 전 반드시 알아야 할 기본 지식
데몬셋 명령어를 본격적으로 사용하기 전에, 우리가 관리하려는 대상이 정확히 무엇인지, 그리고 명령어를 실행하기 위해 어떤 준비가 필요한지 명확히 이해해야 해요. 데몬셋은 클러스터의 모든 노드(또는 특정 조건의 노드)에 파드를 하나씩 배치하는 아주 특수한 컨트롤러예요. 보안 솔루션, 로그 수집기, 네트워크 모니터링 도구처럼 모든 노드에 반드시 존재해야 하는 서비스를 관리할 때 사용하죠.
명령어 실행을 위한 전제 조건
명령어를 입력하기 전, 다음 세 가지가 준비되었는지 먼저 확인해 보세요. 이 조건이 충족되지 않으면 아무리 정확한 명령어를 입력해도 오류 메시지만 보게 될 거예요.
- kubectl 권한 확인: 사용 중인 계정이 데몬셋 리소스를 조회(get)하고 수정(patch/edit)할 수 있는 RBAC 권한을 가지고 있어야 해요. 특히 보안 담당자라면 읽기 권한뿐만 아니라 긴급 수정을 위한 편집 권한도 확보되어 있는지 확인이 필요합니다.
- 클러스터 컨텍스트 설정: 현재 터미널이 운영 중인 클러스터에 올바르게 연결되어 있는지 `kubectl config current-context` 명령어로 반드시 점검하세요. 엉뚱한 개발 환경에 명령어를 날리는 실수는 치명적이에요.
- 노드 상태 파악: 데몬셋이 정상적으로 뜨려면 노드 자체가 Ready 상태여야 해요. 노드에 문제가 있다면 데몬셋 파드도 당연히 생성되지 않습니다.
워크로드 유형별 비교 가이드
데몬셋을 언제 써야 할지 헷갈린다면 아래 표를 참고해 보세요. 상황에 맞는 컨트롤러를 선택하는 것이 운영의 시작이에요.
| 유형 | 배치 방식 | 주요 용도 | 비고 |
|---|---|---|---|
| 데몬셋(DaemonSet) | 모든 노드에 1개씩 | 로그 수집, 보안 에이전트, 모니터링 | 노드 추가 시 자동 배포 |
| 디플로이먼트(Deployment) | 지정된 개수만큼 분산 | 웹 서버, API 서버 등 일반 앱 | 복제본 수 조절 가능 |
| 스테이트풀셋(StatefulSet) | 고유 ID와 함께 순차 배치 | 데이터베이스, 메시지 큐 | 상태 유지 및 순서 중요 |
데몬셋은 노드의 레이블(Label)이나 테인트(Taint) 설정에 따라 특정 노드에만 실행되도록 제한할 수 있어요. 모든 노드가 아니라 ‘GPU가 있는 노드’에만 보안 에이전트를 띄우고 싶다면 이 기능을 활용해야 해요.
실전 데몬셋 관리를 위한 단계별 kubectl 활용법
이제 실제 터미널을 열고 데몬셋을 조작해 볼 시간이에요. 단순히 명령어를 치는 것을 넘어, 각 명령어가 어떤 의미를 갖는지 그리고 보안 운영 관점에서 무엇을 확인해야 하는지 단계별로 깊이 있게 다뤄볼게요.
STEP 1. 데몬셋의 현재 상태와 노드별 배치 확인하기
가장 먼저 해야 할 일은 현재 클러스터에 어떤 데몬셋이 돌아가고 있고, 모든 노드에 정상적으로 배치되었는지 확인하는 거예요. 보안 에이전트가 빠진 노드가 있다면 즉시 대응해야 하니까요.
가장 기본이 되는 명령어는 kubectl get ds예요. 하지만 기본 출력만으로는 부족해요. 노드 이름과 파드의 IP까지 한눈에 보고 싶다면 kubectl get ds -o wide를 사용하세요. 이때 출력되는 DESIRED(희망 개수), CURRENT(현재 실행 중), READY(준비 완료) 컬럼을 유심히 살펴봐야 해요. 만약 DESIRED는 10인데 READY가 8이라면, 2개의 노드에서 보안 에이전트가 작동하지 않고 있다는 위험 신호예요.
더 자세한 정보가 필요할 때는 kubectl describe ds [데몬셋_이름] 명령어를 사용하세요. 이 명령어는 데몬셋의 상세 설정뿐만 아니라, 최근에 발생한 이벤트(Events)를 보여줘요. 파드가 왜 생성되지 않았는지, 이미지 다운로드에 실패했는지 등의 구체적인 이유가 여기에 적혀 있습니다. 보안 담당자라면 이 이벤트 로그를 통해 인프라 팀에 노드 이슈를 전달할 수 있어요.
STEP 2. 데몬셋 생성, 수정 및 안전한 삭제 절차
데몬셋의 설정(이미지 버전, 환경 변수 등)을 변경해야 할 때가 있어요. 보안 정책이 업데이트되어 에이전트의 버전을 올려야 하는 상황이 대표적이죠. 이때 사용할 수 있는 방법은 세 가지예요.
첫째, kubectl apply -f [파일명].yaml이에요. 가장 권장되는 방법으로, 관리하고 있는 설정 파일(YAML)을 기반으로 상태를 일치시켜요. 운영 환경에서는 반드시 GitOps 환경을 통해 이 명령어를 사용해야 나중에 설정이 꼬이지 않아요.
둘째, kubectl edit ds [데몬셋_이름]이에요. 터미널에서 즉석으로 YAML 설정을 열어 수정할 수 있어 매우 편리하지만, 주의가 필요해요. 임시로 테스트할 때는 좋지만, 실제 운영 환경에서 이 명령어를 남용하면 관리 중인 코드와 실제 클러스터 상태가 달라지는 ‘설정 드리프트’ 현상이 발생할 수 있어요.
셋째, kubectl patch ds [데몬셋_이름] -p '[JSON_패치_문구]'이에요. 특정 필드 하나만 아주 빠르게 바꾸고 싶을 때 유용해요. 예를 들어, 보안 에이전트의 로그 레벨만 `debug`로 바꾸고 싶을 때 유용하게 쓸 수 있죠.
마지막으로 삭제할 때는 kubectl delete ds [데몬셋_이름]을 사용해요. 데몬셋을 삭제하면 해당 데몬셋에 의해 관리되던 모든 노드의 파드도 함께 삭제된다는 점을 반드시 기억하세요. 보안 도구가 사라지는 순간, 해당 노드들은 감시 사각지대가 됩니다.
STEP 3. 문제가 생긴 파드 파고들기: 디버깅과 로그 확인
상태 확인 결과 READY가 0이거나 파드가 CrashLoopBackOff 상태라면 이제 디버깅에 들어가야 해요. 데몬셋 자체의 문제인지, 아니면 개별 파드의 문제인지 구분하는 것이 핵심이에요.
가장 먼저 확인해야 할 것은 로그예요. kubectl logs -l app=[레이블] 명령어를 사용하면, 특정 레이블을 가진 모든 데몬셋 파드의 로그를 한 번에 확인할 수 있어요. 어떤 노드에서 에러가 발생하는지 패턴을 찾기에 아주 좋죠. 만약 특정 노드의 파드 하나만 문제가 있다면 kubectl logs [파드_이름]으로 정밀 타격하세요.
로그만으로 부족하다면 파드 내부로 직접 들어가야 해요. kubectl exec -it [파드_이름] -- /bin/sh 명령어를 통해 파드 안의 쉘을 실행할 수 있어요. 보안 에이전트가 실제 호스트의 파일 시스템을 잘 보고 있는지, 프로세스가 살아있는지 내부에서 직접 명령어를 날려 확인해 보세요. 예를 들어, ls /var/log 명령을 통해 로그 경로에 접근 가능한지 확인하는 식이죠.
STEP 4. 대규모 클러스터 운영을 위한 필터링과 자동화 팁
관리해야 할 노드가 수백 개라면 일일이 확인하는 것은 불가능해요. 이때는 필터링 기능을 적극 활용해야 합니다. 특정 레이블을 가진 데몬셋만 골라내려면 kubectl get ds -l security=true처럼 사용하세요.
또한, 운영 자동화나 감사(Audit)를 위해 데이터를 뽑아낼 때 유용합니다. kubectl get ds -o json 또는 kubectl get ds -o yaml을 사용하면 전체 설정을 기계가 읽기 좋은 포맷으로 출력해 줘요. 이를 스크립트와 결합하면 “매일 아침 9시에 모든 데몬셋의 상태를 체크해서 보고서를 만드는” 자동화 시스템을 구축할 수 있습니다.
데몬셋의 이미지를 업데이트할 때, 한꺼번에 모든 노드의 에이전트를 바꾸는 것은 위험할 수 있어요. 배포 전략(RollingUpdate) 설정을 확인하여, 한 번에 너무 많은 파드가 동시에 재시작되지 않도록 관리해야 보안 공백을 최소화할 수 있습니다.
[실전 시나리오: 보안 에이전트 업데이트]
1. 현재 상태 확인: kubectl get ds security-agent
2. 설정 파일 수정: `security-agent.yaml` 파일의 image 태그를 최신 버전으로 변경
3. 안전하게 적용: kubectl apply -f security-agent.yaml
4. 진행 상황 모니터링: kubectl rollout status ds/security-agent
5. 문제 발생 시 즉시 복구: kubectl rollout undo ds/security-agent
자주 하는 실수와 해결법 + FAQ
자주 하는 실수와 해결법
현장에서 데몬셋을 운영하며 자주 발생하는 실수들을 정리했어요. 비슷한 상황을 겪고 있다면 아래 해결법을 즉시 적용해 보세요.
- ❌ 실수: 새로운 노드를 추가했는데 데몬셋 파드가 안 떠요.
→ 왜 발생하나요? 노드에 설정된 ‘테인트(Taint)’가 데몬셋의 ‘톨러레이션(Toleration)’과 맞지 않기 때문이에요.
→ ✅ 해결법: 데몬셋 설정 파일에 해당 노드의 테인트를 허용하는 톨러레이션 설정을 추가하세요. - ❌ 실수: 데몬셋 설정을 바꿨는데 아무 변화가 없어요.
→ 왜 발생하나요? YAML 파일의 레이블(Label)이나 셀렉터(Selector)를 잘못 건드려 기존 파드와 연결이 끊겼을 수 있어요.
→ ✅ 해결법:kubectl describe ds로 셀렉터가 의도한 대로 설정되어 있는지 확인하세요. - ❌ 실수: 파드가 계속 재시작(CrashLoopBackOff)돼요.
→ 왜 발생하나요? 주로 권한(RBAC) 부족이나 호스트 경로(HostPath) 접근 권한 문제인 경우가 많아요.
→ ✅ 해결법:kubectl logs를 통해 권한 거부(Permission Denied) 메시지가 있는지 확인하세요. - ❌ 실수: 데몬셋을 삭제했는데 일부 노드에 파드가 남아있어요.
→ 왜 발생하나요? 명령어가 중간에 실패했거나, 다른 컨트롤러가 해당 파드를 관리하고 있을 가능성이 있어요.
→ ✅ 해лок법: 남은 파드를 수동으로 삭제하거나, 데몬셋의 셀렉터가 정확했는지 다시 점검하세요. - ❌ 실수: 이미지 업데이트를 했는데 버전이 안 바뀌어요.
→ 왜 발생하나요? 이미지 태그를 `latest`로 쓰고 있어서 쿠버네티스가 이미 같은 이미지라고 판단했을 수 있어요.
→ ✅ 해결법: 가능하면 `버전 번호가 명시된 태그`를 사용하고, 필요시 `imagePullPolicy: Always` 설정을 추가하세요.
자주 묻는 질문
Q. 데몬셋이 모든 노드에 떠 있는지 한 번에 확인하는 가장 빠른 방법은 무엇인가요?
가장 빠른 방법은 kubectl get ds -o wide를 입력한 뒤, DESIRED 수치와 READY 수치가 일치하는지 보는 거예요. 만약 숫자가 다르다면 바로 문제가 있는 겁니다.
Q. 특정 노드에서만 데몬셋을 실행하고 싶을 때는 어떻게 하나요?
노드에 특정 레이블(예: `role=security`)을 붙이고, 데몬셋의 `nodeSelector` 설정에 해당 레이블을 지정하면 됩니다. 이렇게 하면 모든 노드가 아닌 특정 조건의 노드에만 파드가 배치됩니다.
Q. 데몬셋 파드가 Pending 상태에서 안 넘어갑니다. 이유가 뭘까요?
주로 리소스 부족(CPU, 메모리)이거나 노드의 테인트(Taint) 때문일 확률이 높아요. kubectl describe pod [파드_이름]을 실행해 맨 아래 ‘Events’ 섹션을 보면 정확한 이유가 나옵니다.
Q. 데몬셋 이미지 업데이트 시 서비스 중단을 막으려면 어떻게 해야 하나요?
데몬셋의 `updateStrategy`를 `RollingUpdate`로 설정하세요. 그리고 `maxUnavailable` 값을 1 정도로 설정하면, 한 번에 한 개의 노드씩만 업데이트하므로 전체 서비스의 가용성을 유지할 수 있습니다.
Q. 데몬셋을 통해 보안 도구를 설치할 때 주의할 점은 무엇인가요?
보안 도구는 보통 호스트의 파일을 읽어야 하므로 Privileged 모드나 HostPath 볼륨을 사용하는 경우가 많아요. 이는 보안상 매우 강력한 권한이므로, 최소한의 권한만 부여하도록 RBAC를 정교하게 설계하는 것이 매우 중요합니다.
안정적인 데몬셋 운영을 위한 마지막 점검
데몬셋은 클러스터의 기초 체력을 담당하는 보안 및 모니터링의 핵심 요소예요. 명령어를 아는 것만큼이나, 그 명령어가 가져올 파급 효과를 이해하는 것이 운영자의 실력입니다. 오늘 배운 내용을 바탕으로 클러스터의 안정성을 한 단계 높여보세요.
- 상태 확인은
kubectl get ds -o wide로 DESIRED와 READY 숫자를 대조하세요. - 상세 원인 파악은
kubectl describe ds의 이벤트를 확인하는 것이 가장 빨라요. - 설정 변경은
kubectl apply를 통해 관리 코드와 일치시키는 습관을 가지세요. - 디버깅 시에는
kubectl logs와kubectl exec를 적절히 혼용하세요. - 노드 추가/삭제 시 데몬셋의 톨러레이션과 셀렉터를 반드시 점검하세요.
오늘 바로 실습 환경에서 다음 작업들을 해보시는 건 어떨까요?
- 현재 운영 중인 클러스터의 데몬셋 리스트를 전체 조회해 보기
- 임의의 데몬셋에 대해
describe명령어로 이벤트 로그 읽어보기 - 보안 에이전트의 이미지 태그를 변경해 보는 시뮬레이션 해보기
실행 과정에서 막히는 부분이나, 특정 상황에서 명령어가 뜻대로 동작하지 않는다면 주저하지 말고 댓글로 질문을 남겨 주세요. 함께 고민하면 더 안전한 클러스터를 만들 수 있습니다.
관련하여 더 깊이 있는 공부를 원하신다면, 쿠버네티스 데몬셋 기본 개념 글이나 클러스터 구축 입문 글을 함께 읽어보시는 것을 추천드려요.