DevOps/k8s

쿠버네티스 ConfigMap과 Secret 완벽 정리

딩코딩 2025. 2. 5. 01:33

쿠버네티스에서 애플리케이션의 설정을 분리하여 관리하는 두 가지 주요 리소스가 ConfigMapSecret입니다. 이 두 가지는 환경 설정 값을 Pod에 주입하는 데 사용되지만, 중요한 차이점이 있습니다. 이번 포스팅에서는 ConfigMap과 Secret의 차이점, 사용 방법, 주의할 점 등을 정리해 보겠습니다.

 

 

🔹 1. ConfigMap이란?

ConfigMap은 애플리케이션에서 사용하는 설정 데이터를 저장하는 쿠버네티스 리소스입니다. 일반적으로 환경 변수, 설정 파일, 커맨드라인 인자 등을 저장하는 용도로 사용됩니다.

✅ 특징

  • 비밀 데이터가 아닌 일반적인 설정 값을 저장함 (예: 데이터베이스 URL, 서비스 포트)
  • Key-Value 형태로 데이터를 저장
  • Pod 내에서 환경 변수, 파일, 커맨드라인 인자로 주입 가능

📌 ConfigMap 생성 방법

1️⃣ YAML 파일을 이용한 생성

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  APP_ENV: "production"
  DATABASE_URL: "mysql://user:password@db:3306/mydb"
 

📌 ConfigMap을 Pod에 적용하는 방법

1️⃣ 환경 변수로 주입

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: APP_ENV
      valueFrom:
        configMapKeyRef:
          name: my-config
          key: APP_ENV

🔹 2. Secret이란?

Secret은 민감한 데이터를 저장하는 쿠버네티스 리소스입니다. ConfigMap과 유사하지만, 비밀번호, API 키, 인증 토큰 등 보안이 필요한 데이터를 저장하는 용도로 사용됩니다.

✅ 특징

  • ConfigMap과 유사하지만, Base64 인코딩을 사용하여 데이터를 저장함
  • 민감한 정보를 보호하기 위해 Pod에 주입될 때 특정한 보안 메커니즘이 적용됨
  • Pod 내에서 환경 변수, 파일, 커맨드라인 인자로 주입 가능
  • kubectl get secret을 사용하면 값이 ***로 표시되어 직접 볼 수 없음

📌 Secret 생성 방법

1️⃣ YAML 파일을 이용한 생성

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  DB_PASSWORD: bXlwYXNzd29yZA==  # "mypassword"를 Base64 인코딩한 값
  API_KEY: dG9wLXNlY3JldC1rZXk=

 

 

📌 Secret을 Pod에 적용하는 방법

1️⃣ 환경 변수로 주입

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: nginx
    env:
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: my-secret
          key: DB_PASSWORD

 

🔹 3. ConfigMap과 Secret의 차이점 비교

 

비교 항목 ConfigMap Secret
목적 환경 설정값 저장 비밀번호, API 키 등 보안 정보 저장
데이터 저장 방식 일반 텍스트 Base64 인코딩
데이터 보안 보안 없음 보안 강화 (Base64 인코딩 + RBAC 적용)
사용 방법 환경 변수, 볼륨 마운트 환경 변수, 볼륨 마운트
kubectl get 출력 평문 표시 값이 ***로 숨겨짐

🔹 4. ConfigMap과 Secret 사용 시 주의할 점

ConfigMap

  • 어플리케이션 설정을 코드에서 분리하여 관리할 수 있음.
  • 보안이 필요한 정보는 ConfigMap이 아닌 Secret을 사용할 것.
  • Pod가 실행 중일 때 ConfigMap이 변경되면, 즉시 반영되지 않을 수도 있음.

Secret

  • Base64는 암호화가 아님! Base64 인코딩된 값은 쉽게 디코딩할 수 있음. (echo "bXlwYXNzd29yZA==" | base64 --decode)
  • 보안이 필요한 경우 Kubernetes RBAC(Role-Based Access Control)를 활용하여 접근을 제한할 것.
  • 파일 시스템 볼륨 마운트를 이용하면 Secret이 자동으로 업데이트됨 (환경 변수 주입 방식은 Pod 재시작 필요).

 

🔥 결론

  • ConfigMap은 일반적인 설정 정보, Secret은 보안이 필요한 정보를 저장하는 용도!
  • ConfigMap과 Secret을 활용하면 코드와 설정을 분리하여 관리할 수 있음.
  • Secret은 Base64로 인코딩되지만, 보안 강화를 위해 RBAC 및 암호화 솔루션(KMS 등)과 함께 사용하는 것이 중요!