쿠버네티스에서 컨피그맵(ConfigMap)시크릿(Secret)은 파드(Pod)나 컨테이너가 동작할 때 필요한 설정값이나 민감 정보를 코드와 분리하여 안전하고 유연하게 관리하기 위한 리소스입니다.


1. 컨피그맵(ConfigMap)

1.1 개념

  • 정의
    컨피그맵은 애플리케이션 설정 정보를 저장하기 위한 오브젝트입니다.
    예: 데이터베이스 접속 정보(호스트, 포트), 환경 변수(ENV), 설정 파일 내용 등
  • 특징
    • 민감하지 않은 일반 설정 정보를 저장합니다.
    • 파드에서 파일, 환경 변수, 커맨드 라인 인수 등 다양한 형태로 주입 가능
    • 컨테이너 이미지를 다시 빌드하지 않고, 설정 정보만 교체하여 재시작해도 반영이 가능

1.2 사용 예시

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-config
data:
  # 단순 키-값 형태
  APP_ENV: "production"
  # 파일 형태도 저장 가능
  config.json: |
    {
      "debug": false,
      "max_retry": 5
    }
  • data 섹션에 키-값 쌍 형태로 설정을 보관
  • JSON, properties, plain text 등 다양한 형식으로 설정 가능

1.3 파드에서 사용하는 방법

  1. 환경 변수로 주입하기

     env:
       - name: APP_ENV
         valueFrom:
           configMapKeyRef:
             name: example-config
             key: APP_ENV
    
  2. 볼륨(파일)로 마운트하기

     volumes:
       - name: config-volume
         configMap:
           name: example-config
     volumeMounts:
       - name: config-volume
         mountPath: "/etc/config"
    
  3. 커맨드 라인 인수로 전달하기 등


2. 시크릿(Secret)

2.1 개념

  • 정의
    시크릿은 민감 정보(패스워드, API 키, 인증서 등)를 안전하게 저장하고 파드에 전달하기 위한 오브젝트입니다.
  • 특징
    • 컨피그맵과 유사하지만, 정보가 base64 인코딩되어 저장
    • 예를 들어 GitHub 액세스 토큰, DB 비밀번호 등 외부에 노출되면 안 되는 정보
    • 일반 컨피그맵보다 접근 권한(RBAC, ACL 등)을 더욱 엄격하게 제어하는 것이 바람직

2.2 사용 예시

apiVersion: v1
kind: Secret
metadata:
  name: example-secret
type: Opaque
data:
  username: YWRtaW4=    # "admin"을 base64 인코딩
  password: cGFzc3dvcmQ= # "password"를 base64 인코딩
  • data 필드에 key-value 형태로 base64 인코딩된 데이터를 저장
  • typeOpaque가 일반적이며, TLS 인증서 시크릿의 경우 kubernetes.io/tls 등도 가능

2.3 파드에서 사용하는 방법

  1. 환경 변수로 사용

     env:
       - name: DB_USER
         valueFrom:
           secretKeyRef:
             name: example-secret
             key: username
       - name: DB_PASS
         valueFrom:
           secretKeyRef:
             name: example-secret
             key: password
    
  2. 파일로 마운트 (볼륨)

     volumes:
       - name: secret-volume
         secret:
           secretName: example-secret
     volumeMounts:
       - name: secret-volume
         mountPath: "/etc/secret"
         readOnly: true
    
  3. TLS 인증서로 사용 (Ingress, HTTPS 서버 등)


3. 컨피그맵(ConfigMap)과 시크릿(Secret) 비교

구분 컨피그맵(ConfigMap) 시크릿(Secret)
주요 목적 민감하지 않은 설정정보 저장 및 관리 민감 정보(패스워드, 인증서 등) 안전하게 관리
데이터 저장 형태 일반 텍스트 (base64 인코딩 없이 평문) base64로 인코딩하여 저장
대표 사용 예 일반 설정, 환경 변수, 설정 파일(JSON, properties, etc.) DB 비밀번호, API 토큰, TLS 인증서, SSH 키 등
암호화/권한 일반적으로 Secret보다 보안 요구 사항이 낮음 접근 권한(RBAC) 철저하게 관리, KMS/Encryption 사용 권장
파드 적용 방법 환경 변수, 볼륨, 커맨드 인수 등 환경 변수, 볼륨(읽기 전용), 인증서로도 사용 가능

4. 보안 및 운영 팁

  1. RBAC(롤/롤바인딩) 활용
    • 시크릿이나 컨피그맵에 대한 접근 권한을 최소화(Least Privilege)
    • 시크릿은 특히 민감 정보이므로 접근 가능한 대상(사용자, 서비스 계정 등)을 엄격히 제한
  2. Encryption at Rest
    • 쿠버네티스 1.7+ 버전에서는 etcd에 저장되는 Secret 데이터를 암호화할 수 있음
    • 클러스터에서 암호화 기능을 켜서 시크릿이 평문으로 노출되지 않도록 함
  3. GitOps 환경에서의 관리
    • 시크릿은 민감 정보를 담고 있으므로 코드 저장소에 평문(plain text)으로 보관하지 않도록 주의
    • Sealed Secrets(주키퍼, HashiCorp Vault 등) 같은 솔루션을 사용해 암호화된 형태로 저장 가능
  4. 주기적인 로테이션(Rotation)
    • 비밀번호, 토큰 등은 주기적으로 갱신하여 보안을 강화
    • 자동 로테이션 방법: 외부 비밀 관리 시스템(Vault) 연동

5. 요약

  • 컨피그맵(ConfigMap):

    • 일반 설정을 애플리케이션 로직과 분리
    • 컨테이너 이미지를 재빌드하지 않고도 설정 변경 가능
    • 주로 환경 변수, 설정 파일 등을 담음
  • 시크릿(Secret):

    • 민감 정보를 안전하게 보관하고 파드에 주입
    • base64로 인코딩해 저장하므로 GitHub 등에서 평문 노출을 방지
    • 주로 비밀번호, 인증 토큰, TLS 인증서 등을 담음

두 리소스 모두 파드와 독립적으로 변경 가능한 동적 설정이라는 점이 핵심이며, 이를 통해 CI/CD 파이프라인에서 설정 변경 최소화, 보안 강화 등을 달성할 수 있습니다.

이처럼 컨피그맵과 시크릿은 쿠버네티스가 애플리케이션 설정·비밀 관리를 유연하고 안전하게 처리하도록 해주는 중요한 도구입니다.


6. Immutable ConfigMap / Secret

쿠버네티스 1.21부터 Immutable(불변) ConfigMap/Secret 기능이 GA(정식 출시)되었습니다. immutable: true로 설정하면 데이터를 수정할 수 없으며, 이를 통해 실수로 인한 설정 변경 방지API Server 부하 감소 효과를 얻을 수 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-v1
  namespace: production
immutable: true          # 이 줄 추가만으로 불변 설정
data:
  database_host: "postgres.prod.svc.cluster.local"
  max_connections: "100"
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials-v1
  namespace: production
immutable: true
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=   # base64 인코딩

Immutable 리소스 업데이트 방법: 직접 수정이 불가하므로 새 버전(v2, v3…)을 생성 후 파드 참조를 변경합니다.

# 기존 Immutable ConfigMap 삭제 후 재생성
kubectl delete configmap app-config-v1
kubectl apply -f app-config-v2.yaml

7. ExternalSecrets Operator

ExternalSecrets Operator(ESO)는 AWS Secrets Manager, HashiCorp Vault, GCP Secret Manager 등 외부 비밀 관리 시스템의 값을 Kubernetes Secret으로 자동 동기화합니다.

설치

helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets external-secrets/external-secrets \
  -n external-secrets-system \
  --create-namespace

AWS Secrets Manager 연동 예시

# 1. SecretStore — AWS 연결 설정
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secretsmanager
  namespace: production
spec:
  provider:
    aws:
      service: SecretsManager
      region: ap-northeast-2
      auth:
        secretRef:
          accessKeyIDSecretRef:
            name: aws-credentials
            key: access-key-id
          secretAccessKeySecretRef:
            name: aws-credentials
            key: secret-access-key
# 2. ExternalSecret — 동기화할 시크릿 정의
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-secret
  namespace: production
spec:
  refreshInterval: 1h           # 1시간마다 동기화
  secretStoreRef:
    name: aws-secretsmanager
    kind: SecretStore
  target:
    name: db-credentials        # 생성될 Kubernetes Secret 이름
    creationPolicy: Owner
  data:
  - secretKey: password         # Kubernetes Secret의 키
    remoteRef:
      key: prod/db/password     # AWS Secrets Manager의 경로
비교 항목 Kubernetes Secret ExternalSecrets Operator
저장 위치 etcd (클러스터 내부) 외부 시스템 (Vault, AWS SM)
로테이션 수동 자동 (refreshInterval)
GitOps 친화성 평문 저장 불가 ExternalSecret 매니페스트만 저장
감사 로그 제한적 외부 시스템 감사 로그 활용

참고 자료

댓글남기기