ConfigMap과 Secret

Kubernetes 설정 관리와 민감 정보 처리 완벽 가이드


Kubernetes 설정 관리와 민감 정보 처리 완벽 가이드

목표: 애플리케이션 설정을 안전하고 유연하게 관리할 수 있는 수준


📋 ConfigMap

역할

비민감 설정 데이터를 저장.

  • 환경변수
  • 설정 파일
  • 명령줄 인자

생성 방법

# 1. 명령줄에서 직접 생성
kubectl create configmap my-config \
  --from-literal=APP_ENV=production \
  --from-literal=LOG_LEVEL=info

# 2. 파일에서 생성
kubectl create configmap my-config \
  --from-file=app.properties \
  --from-file=config.json

# 3. 디렉토리에서 생성
kubectl create configmap my-config \
  --from-file=config/

# 4. YAML로 생성
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: "production"
  LOG_LEVEL: "info"
  database.properties: |
    host=mysql
    port=3306
EOF

Pod에서 사용

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: my-app:latest
    
    # 방법 1: 환경변수로 주입
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_ENV
    
    # 방법 2: 모든 키를 환경변수로
    envFrom:
    - configMapRef:
        name: my-config
    
    # 방법 3: 볼륨으로 마운트
    volumeMounts:
    - name: config-vol
      mountPath: /etc/config
  
  volumes:
  - name: config-vol
    configMap:
      name: my-config

🔐 Secret

역할

민감 정보를 안전하게 저장.

  • 비밀번호
  • API 키
  • TLS 인증서
  • Docker Registry 인증

Base64 인코딩

# 인코딩
echo -n 'my-password' | base64
# bXktcGFzc3dvcmQ=

# 디코딩
echo 'bXktcGFzc3dvcmQ=' | base64 -d

Secret 생성

# 1. 명령줄에서 생성
echo -n 'my-password' | kubectl create secret generic db-password \
  --from-file=password=/dev/stdin

# 2. TLS 인증서
kubectl create secret tls my-tls \
  --cert=server.crt --key=server.key

# 3. Docker Registry
kubectl create secret docker-registry regcred \
  --docker-server=https://index.docker.io/v1/ \
  --docker-username=USER \
  --docker-password=PASS

# 4. YAML로 생성 (base64 인코딩 필요)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
  name: db-password
type: Opaque
data:
  password: bXktcGFzc3dvcmQ=
EOF

Pod에서 사용

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: app
    image: my-app:latest
    
    # 방법 1: 환경변수로 주입
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-password
          key: password
    
    # 방법 2: 볼륨으로 마운트
    volumeMounts:
    - name: secret-vol
      mountPath: /etc/secrets
      readOnly: true
  
  volumes:
  - name: secret-vol
    secret:
      secretName: db-password

🔒 보안 고려사항

Secret의 한계

graph TB
    subgraph "⚠️ 주의"
        A["Secret은 etcd에 저장됨"]
        B["base64 인코딩 ≠ 암호화"]
        C["Pod 내부에서 메모리에 노출"]
    end

보안 강화

# 1. etcd 암호화 활성화
# /etc/kubernetes/manifests/kube-apiserver.yaml
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml

# 2. RBAC으로 Secret 접근 제한
kubectl create role secret-reader --verb=get --resource=secrets

# 3. 외부 Secret 관리 (Vault)
# HashiCorp Vault, AWS Secrets Manager 등

📋 ConfigMap vs Secret 비교

특징ConfigMapSecret
용도비민감 설정민감 정보
저장Plain TextBase64
크기 제한1MB1MB
etcd 암호화선택적권장
환경변수 주입가능가능
볼륨 마운트가능가능

🔗 관련 노트

  • 01-04-Deployment-관리 — 워크로드 배포
  • 02-09-RBAC-설정 — 권한 관리
  • 02-04-NetworkPolicy — TLS, mTLS

마지막 업데이트: 2026-06-01