쿠버네티스에서 컨피그맵(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 파이프라인에서 설정 변경 최소화, 보안 강화 등을 달성할 수 있습니다.

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

태그:

카테고리:

업데이트:

댓글남기기