개발 창고/Server

Pod에 정보 전달하기: ConfigMap과 Secret 완벽 가이드

Royzero 2025. 7. 22. 22:00
반응형

들어가며: Pod에 환경 정보를 전달하려면?

쿠버네티스를 운영하다 보면 **애플리케이션 설정값(환경변수)**이나 비밀번호, API 키 같은 민감한 정보를 Pod에 전달해야 할 때가 많습니다.

이런 데이터를 Pod 이미지 안에 하드코딩하거나 YAML에 직접 넣는 것은 보안과 유지보수 측면에서 매우 위험합니다.
이 문제를 해결하는 Kubernetes의 솔루션이 바로 ConfigMapSecret입니다.

이번 글에서는 다음 내용을 다룹니다:

  • ConfigMap과 Secret의 차이점
  • 환경변수, 파일 마운트를 통한 정보 전달 방법
  • 보안 정보를 안전하게 관리하는 팁
  • 실습 가능한 YAML 예시

1. ConfigMap이란?

ConfigMap비민감한 설정 데이터를 Key-Value 형태로 관리하는 리소스입니다.

  • 애플리케이션의 설정값(예: DB_HOST, APP_MODE)을 Pod와 분리하여 관리 가능
  • 환경변수나 설정파일로 Pod에 전달 가능
  • 이미지 변경 없이 설정 변경 가능

ConfigMap 생성 예시

kubectl create configmap app-config \
  --from-literal=APP_MODE=production \
  --from-literal=DB_HOST=db-service

또는 YAML로 정의:

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  APP_MODE: "production"
  DB_HOST: "db-service"

2. Secret이란?

Secret은 **민감한 데이터(비밀번호, 토큰, 인증서 등)**를 저장하기 위한 리소스입니다.

  • ConfigMap과 사용법은 거의 같지만, 데이터는 Base64로 인코딩되어 저장됩니다.
  • Kubernetes 내에서 etcd를 통해 암호화 가능(보안성 강화).

Secret 생성 예시

kubectl create secret generic db-secret \
  --from-literal=DB_USER=admin \
  --from-literal=DB_PASS=securepass

또는 YAML로 정의:

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  DB_USER: YWRtaW4=         # base64 인코딩된 'admin'
  DB_PASS: c2VjdXJlcGFzcw== # base64 인코딩된 'securepass'

3. Pod에 ConfigMap/Secret 전달하기

1) 환경변수로 전달

apiVersion: v1
kind: Pod
metadata:
  name: env-pod
spec:
  containers:
    - name: app
      image: nginx
      env:
        - name: APP_MODE
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: APP_MODE
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: DB_USER

2) 파일로 마운트하기 (Volume 사용)

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

Pod 내부 /etc/config 디렉토리에 ConfigMap 데이터가 파일 형태로 저장됩니다.


4. ConfigMap vs Secret 비교

항목 ConfigMap Secret
데이터 종류 일반 설정 데이터 민감 데이터 (비번 등)
저장 형태 평문 Base64 인코딩
사용 방법 환경변수/파일 환경변수/파일
보안 수준 낮음 높음 (etcd 암호화 가능)

5. ConfigMap & Secret 관리 팁

  • 민감한 데이터는 무조건 Secret 사용
  • Git 저장소에 평문 비밀번호를 넣지 말고, kubectl 명령어 또는 Secret Manager를 활용
  • ConfigMap/Secret 변경 시 Rolling Update가 자동 적용되도록 Deployment와 함께 관리
  • Helm, Kustomize 등을 이용해 ConfigMap과 Secret을 환경별로 템플릿화하는 것을 추천

6. FAQ (Answer Engine Optimization)

Q1. ConfigMap과 Secret을 동시에 사용할 수 있나요?
A. 네, 일반 설정은 ConfigMap, 민감 정보는 Secret으로 분리해 Pod에 동시에 전달할 수 있습니다.

Q2. Secret 값은 안전한가요?
A. 기본적으로 Base64 인코딩이지만, etcd 암호화 및 RBAC(Role-Based Access Control)로 접근을 제한해 보안을 강화할 수 있습니다.

Q3. ConfigMap이나 Secret이 변경되면 Pod가 자동으로 갱신되나요?
A. 기본 Pod는 자동 갱신되지 않습니다. Deployment와 함께 Rolling Update 또는 재배포를 통해 반영하는 것이 일반적입니다.


7. 핵심 요약

개념 설명
ConfigMap 일반 설정 데이터 저장용
Secret 민감 정보 저장용
전달 방식 환경변수, 파일 마운트
보안 관리 RBAC, etcd 암호화 활용
운영 팁 Helm/Kustomize로 환경별 템플릿화

마무리

Pod에 정보를 전달하는 ConfigMap과 Secret은 Kubernetes 환경에서 유연하고 안전한 애플리케이션 배포의 핵심입니다.

반응형