안녕하세요.
이번 글에서는 Kubernetes Patterns 책의 21장 Immutable Configuration 패턴을 중심으로,
Kubernetes v1.35 기준 최신 기능과 실무 적용까지 하나의 흐름으로 정리해 보겠습니다.
이 글은 단순 요약이 아니라
문제 제시 → 이론적 해결책 → Kubernetes 최신 기능 → 실무 도구 적용
이라는 구조로 Immutable Configuration을 깊이 이해하는 것을 목표로 합니다.
Kubernetes 환경에서 애플리케이션 설정(configuration)은 코드만큼이나 중요한 자산입니다.
전통적으로 설정은 다음과 같은 방식으로 관리되어 왔습니다.
하지만 이러한 방식은 구조적인 한계를 가지고 있습니다.
ConfigMap과 Secret은 기본적으로 변경 가능(mutable) 한 리소스입니다.
이로 인해 운영 환경에서는 다음과 같은 문제가 반복적으로 발생합니다.
책에서는 이러한 현상을 Configuration Drift라고 정의합니다.
Configuration Drift란
Git에 선언된 설정 상태와 실제 클러스터에 적용된 설정 상태가 점점 어긋나는 현상을 의미합니다.
Immutable Configuration 패턴은
이 Drift를 구조적으로 방지하기 위한 설계 원칙입니다.
Immutable Configuration의 핵심 철학은 다음 한 문장으로 요약할 수 있습니다.
애플리케이션 설정은 수정(Edit)되지 않고, 항상 교체(Replace)되어야 합니다.
이 원칙을 따르면 다음과 같은 이점을 얻을 수 있습니다.
설정 변경 시 기존 리소스를 수정하지 않고,
항상 새로운 ConfigMap 또는 Secret을 생성합니다.
app-config-v1
app-config-v2
Deployment는 항상 특정 버전의 설정을 명시적으로 참조합니다.
설정을 컨테이너 이미지로 패키징하여
Init Container 또는 Sidecar Container를 통해 전달하는 방식입니다.

Immutable Configuration은 더 이상 운영자의 규칙에 의존하지 않습니다.
Kubernetes는 이 패턴을 플랫폼 차원에서 직접 강제하기 시작했습니다.
immutable: true
이 옵션을 활성화하면 다음이 보장됩니다.
kubectl edit, patch 시도 시 API 서버에서 즉시 거부Native Sidecar는 책의 Data Container 패턴의 현대적 진화형입니다.
이를 통해 애플리케이션 코드와 설정 관리 로직의 완벽한 분리가 가능해집니다.
“검증된(Validated) 설정만 불변(Immutable) 상태로 배포한다”
immutable: true는 수정만 막을 뿐, 설정 값 자체의 옳음까지 보장하지는 않습니다.
이를 해결하는 것이 ValidatingAdmissionPolicy + CEL 입니다.
운영팀은 다음 규칙을 강제하고 싶습니다.
prod, staging, dev 중 하나apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: force-config-standards
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["configmaps"]
validations:
- expression: "int(object.data.db_port) >= 1024 && int(object.data.db_port) <= 65535"
message: "db_port는 1024에서 65535 사이의 숫자여야 합니다."
- expression: "object.data.env in ['prod', 'staging', 'dev']"
message: "env 값은 prod, staging, dev 중 하나여야 합니다."
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config-v2
data:
db_port: "80"
env: "local-test"
The configmaps "app-config-v2" is invalid: db_port는 1024에서 65535 사이의 숫자여야 합니다. (and 1 other error)
immutable: true 적용즉,
Validated → Immutable
흐름이 완성될 때 21장에서 말하는 신뢰할 수 있는 설정 관리가 구현됩니다.
실무에서 Immutable Configuration을 가장 현실적으로 구현하는 도구는
Kustomize의 configMapGenerator 입니다.
configMapGenerator:
- name: app-config
files:
- application.yaml