Kubernetes를 운영하다 보면 ConfigMap이나 Secret을 수정했는데,
이를 참조하는 Pod가 자동으로 재시작되지 않아 새로운 설정이 반영되지 않는 경우가 많습니다.
이 문제를 해결하기 위해 탄생한 오픈소스 컨트롤러가 바로 Stakater Reloader입니다.
👉 공식 문서
📘 1. Stakater Reloader란?
Reloader는 Kubernetes에서 ConfigMap 또는 Secret이 변경되었을 때
이를 사용하는 Deployment, StatefulSet, DaemonSet 등의 롤링 업데이트(rolling update) 를 자동으로 트리거해주는 Controller입니다.
이 프로젝트는 오픈소스로 제공되며,
라이선스는 Apache 2.0 License 입니다.
⚙️ 2. 내부 동작 원리
Reloader는 단순한 Pod가 아니라,
Kubernetes API Server와 통신하는 Controller로 동작합니다.
즉, ConfigMap이나 Secret의 변경 이벤트를 API Server로부터 실시간으로 전달받아,
변경된 리소스를 사용하는 워크로드를 찾아내어 재배포를 유도합니다.
🔹 동작 단계 요약
단계 설명
| 1. 감시 (Watch) | Reloader는 클러스터 내의 모든 ConfigMap과 Secret을 감시합니다. 문서 보기 |
| 2. 변경 감지 (Detect) | 리소스의 data 필드가 변경되면, 기존 값과 새 값을 비교하여 차이를 탐지합니다. 참고 |
| 3. 대상 탐색 (Find Target) | 해당 리소스를 참조하는 Deployment, StatefulSet, DaemonSet 등을 찾아냅니다. 설명 |
| 4. 해시 비교 (Compare Hash) | ConfigMap/Secret의 내용을 SHA-1 해시로 계산하여, 이전 값과 다를 경우 롤아웃 트리거를 준비합니다. 해시 메커니즘 |
| 5. 롤아웃 트리거 (Trigger Rollout) | 대상 워크로드의 Pod Template에 애노테이션을 패치하여 새로운 ReplicaSet을 생성하게 합니다. 롤아웃 전략 |
🧠 API 기반 감시 구조
Reloader는 각 노드의 Pod를 직접 스캔하지 않습니다.
대신 Kubernetes API Server로부터 변경 이벤트를 Watch 스트림으로 받아 처리합니다.
즉, Pod가 1개만 존재해도 클러스터 전체의 ConfigMap/Secret 변경을 감지할 수 있습니다.
+-----------------------+
| Kubernetes API Server |
+-----------+-----------+
|
| (Watch Stream)
v
+-----------------------+
| Stakater Reloader Pod |
| (client-go Controller)|
+-----------------------+
👉 client-go Watch 메커니즘 참고
🚀 3. Reloader는 어떻게 “다른 노드의 파드”를 재시작시키는가?
- Reloader는 ConfigMap/Secret 변경 이벤트를 감지하면,👉 코드 참고 (configmap.go)
- 해당 리소스를 사용하는 워크로드(Deployment 등)를 API로 검색합니다.
- 이후 해당 워크로드의 .spec.template.metadata.annotations에👉 패치 로직
- reloader.stakater.com/lastReloadTime: <timestamp> 값을 패치합니다.
- Kubernetes는 Deployment의 Pod Template이 변경된 것으로 인식하여
- 새로운 ReplicaSet을 생성 → 기존 Pod 종료 → 새 Pod 생성 과정을 수행합니다.
즉, Reloader가 직접 노드에 명령을 내리는 것이 아니라
**“API Server에 Patch 요청을 보내어 Kubernetes의 기본 롤아웃 메커니즘을 활용”**하는 구조입니다.
🧩 4. 설치 방법
✅ YAML 매니페스트로 설치
kubectl apply -f <https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml>
👉 매니페스트 원본
✅ Helm 차트로 설치
helm repo add stakater <https://stakater.github.io/stakater-charts>
helm repo update
helm install reloader stakater/reloader
👉 Helm values 설정
기본적으로 Reloader는 모든 네임스페이스를 감시(watchGlobally=true)하지만,
특정 네임스페이스만 감시하도록 제한할 수도 있습니다:
helm install reloader stakater/reloader \\
--set reloader.watchGlobally=false \\
--set reloader.watchNamespace=dev
🧠 5. 주요 애노테이션 정리
👉 Annotation Reference
애노테이션 설명
| reloader.stakater.com/auto: "true" | 워크로드가 참조하는 모든 ConfigMap/Secret 변경 시 자동 롤아웃 |
| configmap.reloader.stakater.com/reload: "my-config" | 지정된 ConfigMap만 감시 |
| secret.reloader.stakater.com/reload: "my-secret" | 지정된 Secret만 감시 |
| reloader.stakater.com/ignore: "true" | 해당 리소스는 무시 |
| reloader.stakater.com/rollout-strategy: "restart" | 롤아웃 대신 단순 Pod 재시작 방식 (GitOps 충돌 방지용) |
💡 6. 예시 구성
전체 자동 감지 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
annotations:
reloader.stakater.com/auto: "true"
spec:
replicas: 2
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app
image: my-image:latest
envFrom:
- configMapRef:
name: my-config
- secretRef:
name: my-secret
👉 Docs Example
특정 리소스만 감지 예시
metadata:
annotations:
configmap.reloader.stakater.com/reload: "config-prod"
secret.reloader.stakater.com/reload: "secret-prod"
👉 Selective Reload Example
✅ 7. 장점
- 완전 자동화된 설정 반영 — CI/CD 파이프라인, cert-manager 등과 궁합이 뛰어남.
- 👉 GitHub Discussion
- 유연한 제어 — 애노테이션 기반으로 감시 범위 세밀하게 설정 가능.
- GitOps 호환성 — 템플릿 해시 기반 변경이므로 ArgoCD와 병행 사용 가능.
- 실제 운영 검증 — Reddit 등에서 다수의 프로덕션 사례 존재.👉 Reddit Discussion 2
- 👉 Reddit Discussion 1
⚠️ 8. 주의할 점
- 무분별한 롤아웃 방지 — 모든 리소스에 auto:true 설정 시 불필요한 재시작이 빈번할 수 있음.
- 👉 관련 토론
- GitOps 충돌 가능성 — ArgoCD가 파드 템플릿 변경을 “드리프트”로 인식할 수 있음.
- 리소스 사용량 고려 — 많은 네임스페이스를 감시하면 Reloader Pod의 CPU/메모리 부하 증가.
- 간접 참조 미지원 — 동적으로 로드하는 설정 파일은 감지 불가.
- 핫 리로드 불가 — Pod 재시작 기반이므로 애플리케이션 레벨 실시간 반영은 별도 구현 필요.
🔁 9. 대안 및 비교
- Helm/Kustomize를 이용해 ConfigMap 이름에 해시를 추가하는 방식도 존재.
- 👉 Reddit 토론
- Kubernetes 커뮤니티에서는 Reloader와 유사한 기능을👉 Kubernetes Discuss Thread
- 공식 기능으로 통합하자는 논의도 진행 중.
🧭 10. 결론
Reloader는 Kubernetes 설정 변경 자동 반영의 사실상 표준 도구입니다.
ConfigMap 또는 Secret이 자주 변경되는 환경이라면
운영 안정성과 배포 자동화를 크게 향상시킬 수 있습니다.
단, GitOps 환경에서는 rollout-strategy: restart를 활용하여
드리프트 충돌을 피하는 것이 좋습니다.
💬 마무리
“Pod 하나로 클러스터 전체 변경을 감시할 수 있는 이유는
Reloader가 Kubernetes API Server를 통해 이벤트를 실시간으로 Watch하기 때문입니다.
결국 Reloader는 ‘노드 단위 에이전트’가 아닌,
클러스터 전역 컨트롤러(Controller) 로 동작하는 것이죠.”
'K8S' 카테고리의 다른 글
| Kubernetes에서 Vault로 비밀 다루기: Seal, Sync, 주입 (1) | 2025.11.27 |
|---|---|
| Kubernetes에서 애플리케이션 설정 우선순위 이해하기 (0) | 2025.10.23 |
| _helpers.tpl란? (0) | 2025.09.18 |
| [kubernetes] kind 명령어 정리 (0) | 2025.09.06 |
| [kubernetes] kind 설치 및 간단한 실행방법 (0) | 2025.09.06 |
댓글