본문 바로가기
K8S

Kubernetes ConfigMap & Secret 자동 반영 — Stakater Reloader

by Rainbound-IT 2025. 10. 17.
반응형

Kubernetes를 운영하다 보면 ConfigMap이나 Secret을 수정했는데,

이를 참조하는 Pod가 자동으로 재시작되지 않아 새로운 설정이 반영되지 않는 경우가 많습니다.

이 문제를 해결하기 위해 탄생한 오픈소스 컨트롤러가 바로 Stakater Reloader입니다.

👉 GitHub 저장소

👉 공식 문서


📘 1. Stakater Reloader란?

Reloader는 Kubernetes에서 ConfigMap 또는 Secret이 변경되었을 때

이를 사용하는 Deployment, StatefulSet, DaemonSet 등의 롤링 업데이트(rolling update) 를 자동으로 트리거해주는 Controller입니다.

👉 How it works (공식 문서)

이 프로젝트는 오픈소스로 제공되며,

라이선스는 Apache 2.0 License 입니다.


⚙️ 2. 내부 동작 원리

Reloader는 단순한 Pod가 아니라,

Kubernetes API Server와 통신하는 Controller로 동작합니다.

즉, ConfigMap이나 Secret의 변경 이벤트를 API Server로부터 실시간으로 전달받아,

변경된 리소스를 사용하는 워크로드를 찾아내어 재배포를 유도합니다.

👉 Controller 코드 보기


🔹 동작 단계 요약

단계 설명

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는 어떻게 “다른 노드의 파드”를 재시작시키는가?

  1. Reloader는 ConfigMap/Secret 변경 이벤트를 감지하면,👉 코드 참고 (configmap.go)
  2. 해당 리소스를 사용하는 워크로드(Deployment 등)를 API로 검색합니다.
  3. 이후 해당 워크로드의 .spec.template.metadata.annotations에👉 패치 로직
  4. reloader.stakater.com/lastReloadTime: <timestamp> 값을 패치합니다.
  5. Kubernetes는 Deployment의 Pod Template이 변경된 것으로 인식하여
  6. 새로운 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 차트 페이지

👉 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. 장점

  1. 완전 자동화된 설정 반영 — CI/CD 파이프라인, cert-manager 등과 궁합이 뛰어남.
  2. 👉 GitHub Discussion
  3. 유연한 제어 — 애노테이션 기반으로 감시 범위 세밀하게 설정 가능.
  4. GitOps 호환성 — 템플릿 해시 기반 변경이므로 ArgoCD와 병행 사용 가능.
  5. 실제 운영 검증 — Reddit 등에서 다수의 프로덕션 사례 존재.👉 Reddit Discussion 2
  6. 👉 Reddit Discussion 1

⚠️ 8. 주의할 점

  1. 무분별한 롤아웃 방지 — 모든 리소스에 auto:true 설정 시 불필요한 재시작이 빈번할 수 있음.
  2. 👉 관련 토론
  3. GitOps 충돌 가능성 — ArgoCD가 파드 템플릿 변경을 “드리프트”로 인식할 수 있음.
  4. 리소스 사용량 고려 — 많은 네임스페이스를 감시하면 Reloader Pod의 CPU/메모리 부하 증가.
  5. 간접 참조 미지원 — 동적으로 로드하는 설정 파일은 감지 불가.
  6. 핫 리로드 불가 — Pod 재시작 기반이므로 애플리케이션 레벨 실시간 반영은 별도 구현 필요.

🔁 9. 대안 및 비교

  • Helm/Kustomize를 이용해 ConfigMap 이름에 해시를 추가하는 방식도 존재.
  • 👉 Reddit 토론
  • Kubernetes 커뮤니티에서는 Reloader와 유사한 기능을👉 Kubernetes Discuss Thread
  • 공식 기능으로 통합하자는 논의도 진행 중.

🧭 10. 결론

Reloader는 Kubernetes 설정 변경 자동 반영의 사실상 표준 도구입니다.

ConfigMap 또는 Secret이 자주 변경되는 환경이라면

운영 안정성과 배포 자동화를 크게 향상시킬 수 있습니다.

단, GitOps 환경에서는 rollout-strategy: restart를 활용하여

드리프트 충돌을 피하는 것이 좋습니다.

👉 Reloader GitHub

👉 Stakater 공식 블로그


💬 마무리

“Pod 하나로 클러스터 전체 변경을 감시할 수 있는 이유는

Reloader가 Kubernetes API Server를 통해 이벤트를 실시간으로 Watch하기 때문입니다.

결국 Reloader는 ‘노드 단위 에이전트’가 아닌,

클러스터 전역 컨트롤러(Controller) 로 동작하는 것이죠.”

반응형

댓글