Terraform + Kubernetes 운영

Terraform + Kubernetes 운영 심화: ConfigMap/Secret 변경 반영을 “예측 가능하게” 만드는 체크섬(Annotation) 패턴

운영에서 자주 터지는 유형이 있습니다. ConfigMap/Secret은 바뀌었는데 서비스 동작(특히 기능 플래그, 엔드포인트, 타임아웃 등)은 그대로인 상황입니다. 원인은 단순합니다. Kubernetes는 ConfigMap/Secret의 변경을 자동으로 Pod 재시작으로 연결하지 않기 때문입니다.

이 글은 Kubernetes 공식 문서의 동작 설명을 기준으로, Terraform로 관리하는 환경에서 ConfigMap/Secret 변경 → Deployment 롤링 업데이트를 자동화하는 실무 패턴을 정리합니다. (추정/허구 없이, 공식 문서에 있는 사실만 확정합니다.)

0) TL;DR (요약)

  • ConfigMap을 env로 주입(env/envFrom)하면 자동 업데이트가 되지 않으며 Pod 재시작이 필요합니다. (Kubernetes 공식 문서 명시)
  • ConfigMap을 volume으로 마운트하면 kubelet의 주기 sync/캐시 정책에 따라 eventually 파일이 갱신될 수 있습니다. (Kubernetes 공식 문서 명시)
  • 운영에서 “항상 동일하게” 반영되게 하려면, ConfigMap/Secret 내용의 해시(checksum)를 Deployment Pod template annotation에 연결해 변경 시점에 롤링 업데이트가 일어나게 만드세요.
ConfigMap 변경 반영 경로(env vs volume)와 체크섬 롤링 업데이트 도식
요약 도식(직접 제작). 무단 사용 금지.

1) 문제 정의: “ConfigMap은 바뀌었는데 왜 서비스가 안 바뀌나?”

Kubernetes 공식 문서는 ConfigMap을 Pod에서 사용하는 방법을 4가지로 분류합니다(컨테이너 args, env, volume, API 직접 조회). 이 중 가장 많이 쓰는 방식이 env 및 volume인데, 둘의 업데이트 특성이 다릅니다.

1-1. env로 주입했을 때: 자동 업데이트되지 않음

Kubernetes ConfigMap 문서에는 다음이 명시되어 있습니다:

  • “ConfigMaps consumed as environment variables are not updated automatically and require a pod restart.”

즉, env/envFrom로 넣은 값은 컨테이너(프로세스) 시작 시점에 확정됩니다. ConfigMap이 갱신되어도 기존 Pod는 그대로이며, 환경변수는 바뀌지 않습니다.

1-2. volume으로 마운트했을 때: eventually 업데이트(지연 가능)

같은 문서에는 volume으로 소비할 때의 갱신 특성도 설명합니다. 요지는 다음입니다:

  • volume으로 소비 중인 ConfigMap이 업데이트되면 projected keys는 eventually 업데이트될 수 있음
  • kubelet은 periodic sync 때 마운트된 ConfigMap이 최신인지 확인
  • kubelet은 캐시를 사용하며, configMapAndSecretChangeDetectionStrategy에 따라 watch/ttl/direct 등 전략이 달라짐
  • 결과적으로 지연은 kubelet sync period + cache propagation delay까지 커질 수 있음

운영 관점에서 중요한 포인트는 “언젠가 업데이트될 수 있다”이지 “즉시/항상 업데이트된다”가 아닙니다. 특히 애플리케이션이 파일을 읽는 타이밍/캐시 방식에 따라 체감은 더 달라집니다.

2) 실무 해법: ConfigMap/Secret 변경을 Deployment 롤링 업데이트로 “승격”시키기

Deployment는 PodTemplateSpec이 변경되면 새로운 ReplicaSet을 만들고, 롤링 업데이트로 Pod를 교체합니다(Deployment 컨트롤러 동작). 따라서 ConfigMap/Secret 변경을 Pod template 변경으로 연결하면, “설정 변경이 곧 롤링 업데이트”라는 예측 가능한 운영 루틴이 됩니다.

2-1. 체크섬(annotation) 패턴이 작동하는 이유

  • ConfigMap/Secret의 data가 바뀐다
  • Terraform이 sha256(jsonencode(...)) 등으로 내용을 해시한다
  • 해시 값을 Deployment .spec.template.metadata.annotations에 넣는다
  • annotation이 바뀌면 Pod template이 바뀌고, Deployment 컨트롤러가 새 ReplicaSet을 만든다
  • 롤링 업데이트로 Pod가 교체되며, 새 Pod는 시작 시 최신 env/volume을 읽는다

Terraform의 sha256 함수는 문자열을 UTF-8로 인코딩 후 SHA-256을 적용하고 hex로 반환한다고 문서화되어 있습니다. 또한 jsonencode는 값을 JSON 문법으로 인코딩한다고 문서화되어 있습니다. (HashiCorp 공식 문서)

2-2. Terraform 예시: ConfigMap 데이터 해시를 Deployment annotation으로 연결

resource "kubernetes_config_map_v1" "app_config" {
  metadata {
    name      = "app-config"
    namespace = "prod"
  }

  data = {
    FEATURE_X_ENABLED = "true"
    API_BASE_URL      = "https://api.example.com"
  }
}

resource "kubernetes_deployment_v1" "app" {
  metadata {
    name      = "app"
    namespace = "prod"
  }

  spec {
    replicas = 3

    selector {
      match_labels = {
        app = "app"
      }
    }

    template {
      metadata {
        labels = {
          app = "app"
        }

        annotations = {
          config_checksum = sha256(jsonencode(kubernetes_config_map_v1.app_config.data))
        }
      }

      spec {
        container {
          name  = "app"
          image = "ghcr.io/example/app:1.0.0"

          env_from {
            config_map_ref {
              name = kubernetes_config_map_v1.app_config.metadata[0].name
            }
          }
        }
      }
    }
  }
}

3) 운영 의사결정 표 (env/volume/체크섬)

패턴 장점 주의점 권장 상황
env 주입 + 수동 재시작 구현 단순 공식 문서 기준 자동 업데이트 불가 → 운영 누락이 가장 큰 리스크 개발/테스트, 단발성 서비스
volume 마운트(파일) 공식 문서 기준 eventually 업데이트 가능 kubelet sync/캐시 전략 및 앱의 파일 로딩 방식에 따라 반영 지연/불확실 앱이 파일을 주기적으로 다시 읽도록 설계된 경우
체크섬 annotation + 롤링 업데이트 변경 반영이 예측 가능(설정 변경=롤링) 사소한 변경도 롤링 발생(의도된 동작) 운영 표준 경로(권장)

4) 장애 재현 및 복구 Runbook

4-1. 재현(예: envFrom 사용 중)

# 1) 현재 Pod가 보는 값 확인
kubectl -n prod exec deploy/app -- printenv FEATURE_X_ENABLED

# 2) ConfigMap 변경
kubectl -n prod patch configmap app-config 
  --type merge 
  -p '{"data":{"FEATURE_X_ENABLED":"false"}}'

# 3) 동일 Pod에서 재확인(값이 그대로면 “문제”가 재현된 것)
kubectl -n prod exec deploy/app -- printenv FEATURE_X_ENABLED

4-2. 즉시 복구(응급): 롤아웃 재시작

kubectl -n prod rollout restart deploy/app
kubectl -n prod rollout status deploy/app

4-3. 근본 대책: 체크섬 패턴 적용

  • Terraform에서 ConfigMap/Secret 내용 해시를 Deployment annotation으로 연결
  • 설정 변경은 Terraform 단일 경로로만 수행(드리프트 방지)
  • 배포 후 kubectl rollout status로 완료 자동 확인

5) 체크리스트 (운영 표준화)

  • ConfigMap/Secret 변경이 반드시 Terraform PR/Apply로만 일어나도록 통제
  • Deployment .spec.template.metadata.annotations에 checksum이 실제로 들어가는지 확인
  • 설정 변경이 잦은 서비스는 “사소한 변경도 롤링”이 허용되는지(릴리즈 정책) 합의
  • 긴급 대응 절차에 rollout restart + rollout status 포함

6) 공식 원문 링크(근거)

결론: 운영에서 설정 변경이 항상 반영되게 하려면, “ConfigMap이 바뀌면 Pod가 바뀐다”를 시스템적으로 보장해야 합니다. 체크섬(annotation) 패턴은 Kubernetes/Deployment의 선언적 업데이트 모델과 가장 잘 맞는 기본 해법입니다.

위로 스크롤
WordPress Appliance - Powered by TurnKey Linux