Kubernetes ‐ ConfigMap, Secret - thought-corner/Backend-PlayGround GitHub Wiki

ConfigMap vs Secret 핵심 개념 비교

항목 ConfigMap (컨피그맵) Secret (시크릿)
주요 목적 민감하지 않은 일반 설정 데이터 관리 패스워드, API 키, SSH 키, TLS 인증서 등 민감 정보 보호
데이터 형태 Plain Text (평문 Key-Value 또는 파일 전체) Base64 인코딩된 스트링 (Key-Value)
보안 수준 누구나 조회 가능 (설정 분리 목적) RBAC을 통한 접근 제어, 메모리(tmpfs) 기반 저장으로 보안 강화
용량 제한 오브젝트당 최대 1MB 오브젝트당 최대 1MB

Pod에 데이터를 주입하는 2가지 방식 및 동적 반영(Hot-Reload)의 비밀

  • ConfigMap과 Secret 데이터를 파드 내부의 컨테이너로 가져오는 방법은 크게 환경 변수(Environment Variables) 방식과 볼륨 마운트(Volume Mount) 방식으로 나뉜다.
  • 이 방식의 선택에 따라 설정 변경 시 앱에 즉시 반영되는지 여부(Hot-Reload)가 결정된다.

환경 변수 주입 방식(env, envFrom)

  • 메커니즘 : 파드가 생성(시작)될 때 컨테이너의 OS 환경 변수로 값을 주입한다.
  • 장점 : 소스코드에서 System.getenv() 등으로 가져다 쓰기 매우 직관적이고 편리하다.
  • 동적 반영 불가능(중요) : 컨피그맵이나 시크릿의 값이 변경되어도, 이미 실행 중인 파드 내의 환경 변수 값은 절대 변하지 않는다. 프로세스가 뜰 때 딱 한 번만 로드되기 때문이다. 값을 변경하려면 파드를 재시작(Rolling Update 등)해야만 한다.

볼륨 마운트 방식(volumes, volumeMounts)

  • 메커니즘 : 컨피그맵/시크릿 내용을 가상 파일 시스템으로 만들어 컨테이너 내부의 특정 디렉터리에 파일 형태로 마운트한다.
  • 장점 : 대용량 설정 파일(application.yml, nginx.conf 등)을 통째로 주입할 때 유리하다.
  • 동적 반영 가능(Kubelet 주기적 동기화): 컨피그맵이나 시크릿의 데이터가 변경되면, kubelet이 이를 감지하여 파드 내부에 마운트된 파일의 내용을 실시간(대략 수십 초 내)으로 업데이트해 준다.
  • 단, 애플리케이션의 지원 필요 : 파일 자체는 실시간으로 변하지만, 애플리케이션(예: Spring Boot, Go 등)이 그 파일의 변경을 감지하고 재로드(Watch 메커니즘)하는 로직이 구현되어 있어야 진정한 의미의 Hot-Reload가 작동한다.

애플리케이션 배포 및 주입

apiVersion: apps/v1
kind: Deployment
metadata:
  name: finance-service
spec:
  replicas: 2
  selector:
    matchLabels:
      app: finance-service
  template:
    metadata:
      labels:
        app: finance-service
    spec:
      containers:
      - name: main-app
        image: financial-platform/api:v2.0.0
        
        # [방식 1] 환경 변수 주입 (Secret 적용 - 재시작 필요)
        env:
        - name: DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secret
              key: DB_PASSWORD
        - name: APP_LOG_LEVEL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: LOG_LEVEL

        # [방식 2] 볼륨 마운트 주입 (ConfigMap 적용 - 실시간 동기화 지원)
        volumeMounts:
        - name: config-volume
          mountPath: /app/config  # 컨테이너 내부에 /app/config/application.yml 파일이 생성됨
          readOnly: true

      volumes:
      - name: config-volume
        configMap:
          name: app-config
          items:
          - key: application.yml
            path: application.yml