콘텐츠로 이동

ConfigMap과 Secret

개요

같은 코드인데 환경(개발·운영)에 따라 설정값이 달라지는 경우가 많아요. DB 호스트, 기능 플래그, API 키 같은 값까지 이미지 안에 하드코딩하면 환경마다 이미지를 다르게 만들어야 해요. 쿠버네티스는 이 설정값을 이미지에서 분리해 두는 객체를 제공하는데, 일반 설정은 ConfigMap, 비밀값은 Secret에 담아요.

상위 문서: Kubernetes · 파드 · 디플로이먼트

핵심 개념

ConfigMap. 키-값 쌍으로 설정 데이터를 저장하는 API 객체예요. 비밀 정보는 넣지 않아요. 코드는 DATABASE_HOST 같은 환경변수를 읽고, 실제 값은 ConfigMap이 제공하는 구조로 "코드와 설정을 분리"해요. 파드와 ConfigMap은 같은 네임스페이스에 있어야 해요.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: postgres
  LOG_LEVEL: info

Secret. ConfigMap과 같은 용도지만 비밀값을 담아요. 자격증명, API 키, 토큰 등이 여기에 들어가요. 값은 base64로 인코딩되어 저장되고, etcd에는 암호화되어 보관할 수 있어요. 하지만 base64는 인코딩이지 암호화가 아니라는 점을 기억해야 해요. 그래서 더 강한 보호가 필요하면 외부 시크릿 도구를 함께 써요.

파드에 주입하는 방법. 설정은 크게 두 가지로 넣어요.

  • 환경변수env.valueFrom.configMapKeyRef / secretKeyRef로 특정 키를 환경변수로 넣어요.
  • 볼륨 마운트 — 볼륨으로 마운트하면 ConfigMap의 각 키가 파일이 되어 /config/...처럼 읽혀요. 설정 파일 전체를 통째로 주입할 때 유용해요.
spec:
  containers:
    - name: app
      image: myapp
      env:
        - name: DATABASE_HOST
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: DATABASE_HOST
        - name: API_KEY
          valueFrom:
            secretKeyRef:
              name: app-secret
              key: api-key

갱신 동작. 마운트된 볼륨의 ConfigMap 값은 쿠버네티스가 주기적으로 갱신해 주지만, 환경변수로 넣은 값은 파드를 재시작하기 전엔 바뀌지 않아요. 그래서 설정을 바꿨는데 안 바뀌면 파드 롤아웃이 필요할 수 있어요.

주의점. ConfigMap 데이터는 1MiB를 넘길 수 없어요. 큰 설정은 볼륨이나 별도 저장소를 써야 해요. 또 immutable: true를 붙이면 값을 바꿀 수 없게 해서, 실수로 인한 장애를 막고 API 서버 부하를 줄여요.

실제 적용(데이터스케쳐스)

각 네임스페이스(마케팅·위키·백엔드)에서 환경별 설정은 ConfigMap으로, 자격증명 같은 비밀값은 Secret으로 관리해요. 이미지 안에 값이 박혀 있지 않으니 같은 이미지로 여러 환경에 배포할 수 있어요. 다만 비밀값이 Git 저장소에 평문으로 들어가지 않도록, 배포 시점에 Secret을 어떻게 공급하는지(시크릿 도구 연동 등)를 ArgoCD와 함께 관리해요.

더 알아보기