Kubernetes ConfigMap & Secret

2025. 4. 16. 16:38Kubernetes

ConfigMap & Secret

Kubernetes에서는 애플리케이션 설정 정보(환경 변수, 설정 파일, API 키, 인증 정보 등)을 애플리케이션 컨테이너 Image 와 분리해 관리할 수 있도록 ConfigMap 과 Secret Resource를 제공한다. 이를 통해 보안 및 유연성을 모두 확보할 수 있다.

ConfigMap 이나 Secret을 사용하면 컨테이너이미지를 동일하게 유지하면서 환경별로 다른 설정 정보를 주입할 수 있다.

DB 암호나 API 키와 같은 민감한 정보를 따로 안전하게 관리하고 Runtime에만 Pod에 주입함으로써 노출 가능성을 줄인다.

설정이 바뀌어도 이미지를 재빌드하지 않고 ConfigMap/Secret만 업데이트하면 되기 때문에 애플리케이션 수정 없이 설정을 간단하게 변경할 수 있다.

 

ConfigMap

ConfigMap은 애플리케이션에 사용되는 환경 변수, 설정 파일, 구성 스크립트, 짧은 텍스트 데이터 등을 평문(plain text)으로 저장한다. ConfigMap에 저장된 데이터는 암호화되지 않고 평문 형식으로 저장되므로, 민감한 정보(비밀번호, API 키 등)는 보안상의 이유로 Secret 리소스를 사용한다.

위 명령어를 사용해서 Cluster 에 ConfigMap을 생성할 수 있다.

# YAML 파일로 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_MODE: "production"
  LOG_LEVEL: "info"
  config.json: |
    {
      "key1": "value1",
      "key2": "value2"
    }

위 예시에서는 APP_MODE 와 LOG_LEVEL 환경변수와 JSON 형식의 설정 파일에 내용을 저장한다.

kubectl create configmap my-config --from-literal=APP_MODE=production --from-literal=LOG_LEVEL=info

위 명령어를 통해서도 생성할 수 있다.

 

사용방법

환경 변수로 주입:
Pod의 컨테이너에서 환경 변수 형태로 ConfigMap 데이터를 주입할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: APP_MODE
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_MODE

Volume으로 Mount
ConfigMap 데이터를 파일로 변환하여 Pod의 볼륨에 마운트 할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config
  volumes:
  - name: config-volume
    configMap:
      name: my-config

이 경우, /etc/config 디렉터리 아래에 ConfigMap에 정의된 각 키가 파일 이름이 되고, 그 내용이 파일 내용으로 기록된다.

 

ConfigMap의 장점

애플리케이션 코드를 동일하게 유지하면서 환경에 따라 설정 정보를 별도로 관리할 수 있어서 이미지의 재사용성이 높아진다. 

일부 ConfigMap은 Pod 내에서 동적으로 읽혀 변경을 감지하도록 설계할 수 있다. (애플리케이션이 변경을 감지하는 로직이 필요하다) 

Cluster 전반에서 일관된 설정을 유지하는 데 유리하

 

Secret

기본적으로 Base64 Encoding 된 형태로 etcd로 저장된다. (Base64는 누구나 디코딩이 가능하기 때문에 보안 목적이 없다)

하지만 최근에는 Encrytion at Rest 방식을 권장한다

(물리 디스크에 기록되는 데이터를 암호화해서 특정 키가 있어야 복호화가 가능하게 방식)

관리자 권한이나 적절한 접근 권한이 없으면 kubectl 로 내용을 볼 수 없도록 제어할 수 잇다.

CofigMap과 유사하게 Pod의 env 나 volume 형태로 주입이 가능하다.

 

보안 & Best Practice

  • RBAC(Role-Based Access Control)
    • Secret, ConfigMap에 접근할 수 있는 권한을 최소화하여, 민감 정보를 무분별하게 열람하지 못하도록 설정.
  • Encryption at Rest
    • 쿠버네티스 etcd에 저장되는 Secret 데이터를 추가적으로 암호화하여 관리자라도 물리 디스크를 확보하지 않는 이상 볼 수 없도록 구성.
  • 이미지에 포함하지 말 것
    • DB 비밀번호나 API 키를 절대 소스 코드나 이미지에 직접 하드코딩하지 않고, 런타임 시점에만 주입하도록 함.
  • 주기적 로테이션
    • Secret을 정기적으로 변경(로테이션)해 보안을 강화하거나, 오래된 API 키/비밀번호가 유출돼도 오래 사용되지 않도록 한다.

 

 

'Kubernetes' 카테고리의 다른 글

Kubernetes Observability  (0) 2025.04.17
Kubernetes RBAC & ServiceAccount  (0) 2025.04.16
Kubernetes Storage  (0) 2025.04.16
Kubernets Ingress & Load Balancing  (0) 2025.04.16
Kubernetes Workload Controller  (0) 2025.04.15