Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #8: ConfigMap & Secret (구성 및 스토리지 리소스)

ygtoken 2025. 3. 5. 00:20
728x90

애플리케이션을 배포할 때 환경 변수, 설정 파일, 보안 정보(API 키, 비밀번호 등)를 관리하는 방법이 필요합니다.
Kubernetes에서는 이를 위해 ConfigMap과 Secret 리소스를 제공합니다.

이번 글에서는 ConfigMap과 Secret의 개념, 차이점, 그리고 실전 활용법을 정리하겠습니다.


🔹 ConfigMap이란?

ConfigMap환경 변수 또는 설정 파일을 Kubernetes 리소스로 저장하는 방법입니다.
✔️ 애플리케이션의 설정 값을 Pod와 분리하여 관리
✔️ 파일, 키-값(Key-Value) 형식으로 저장 가능
✔️ Pod가 실행될 때 ConfigMap 값을 환경 변수로 주입 가능

💡 ConfigMap에는 민감한 정보를 저장하면 안 되며, 보안 정보는 Secret을 사용해야 합니다.


🔹 ConfigMap YAML 예제 (Key-Value 형식)

아래 ConfigMap은 database_url과 log_level을 환경 변수로 저장합니다.

apiVersion: v1  # ConfigMap 리소스의 API 버전
kind: ConfigMap  # ConfigMap 리소스 선언
metadata:
  name: my-config  # ConfigMap의 이름
data:
  database_url: "postgres://db:5432/mydb"  # 데이터베이스 URL 설정
  log_level: "DEBUG"  # 로깅 레벨 설정

💡 이 ConfigMap을 사용하면 database_url과 log_level 값을 Pod에서 활용할 수 있습니다.


🔹 ConfigMap을 환경 변수로 Pod에 주입

아래 Pod는 ConfigMap에서 값을 가져와 환경 변수로 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: busybox
      command: ["sh", "-c", "echo Database URL: $DATABASE_URL && sleep 3600"]
      env:
        - name: DATABASE_URL  # 환경 변수 이름
          valueFrom:
            configMapKeyRef:
              name: my-config  # 사용할 ConfigMap 이름
              key: database_url  # 가져올 Key 값

💡 이 Pod를 실행하면 Database URL: postgres://db:5432/mydb가 출력됩니다.


🔹 ConfigMap을 파일 형태로 마운트

ConfigMap을 파일 형태로 컨테이너에 마운트할 수도 있습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  config.json: |
    {
      "database_url": "postgres://db:5432/mydb",
      "log_level": "DEBUG"
    }
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  volumes:
    - name: config-volume
      configMap:
        name: my-config  # ConfigMap을 볼륨으로 사용
  containers:
    - name: my-container
      image: busybox
      volumeMounts:
        - mountPath: "/etc/config"  # 컨테이너 내부 마운트 경로
          name: config-volume

💡 이 설정을 적용하면 /etc/config/config.json 파일이 생성되며, ConfigMap의 내용이 그대로 저장됩니다.


🔹 Secret이란?

Secret비밀번호, API 키, 인증서 등의 민감한 정보를 안전하게 저장하는 Kubernetes 리소스입니다.
✔️ ConfigMap과 유사하지만 Base64 인코딩으로 저장됨
✔️ 환경 변수 또는 파일로 Pod에 주입 가능
✔️ RBAC(Role-Based Access Control)로 접근 권한 설정 가능

💡 Secret은 Base64로 인코딩되지만 암호화되지 않으므로, 추가적인 보안 조치(예: 암호화된 etcd 저장소)가 필요합니다.


🔹 Secret YAML 예제 (Base64 인코딩)

아래 Secret은 username과 password를 저장합니다.

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque  # 기본적인 키-값 형태의 Secret
data:
  username: dXNlcm5hbWU=  # "username" (Base64 인코딩)
  password: cGFzc3dvcmQ=  # "password" (Base64 인코딩)

💡 Base64 인코딩된 값을 디코딩하려면 다음 명령을 사용합니다.

echo "dXNlcm5hbWU=" | base64 --decode

💡 반대로 값을 인코딩하려면 다음 명령을 사용합니다.

echo -n "password" | base64

🔹 Secret을 환경 변수로 Pod에 주입

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: busybox
      command: ["sh", "-c", "echo Username: $DB_USER && sleep 3600"]
      env:
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: my-secret  # 사용할 Secret 이름
              key: username  # 가져올 Key 값

💡 이 Pod를 실행하면 Username: username이 출력됩니다.


🔹 Secret을 파일로 마운트

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  volumes:
    - name: secret-volume
      secret:
        secretName: my-secret  # Secret을 볼륨으로 사용
  containers:
    - name: my-container
      image: busybox
      volumeMounts:
        - mountPath: "/etc/secret"  # 컨테이너 내부 마운트 경로
          name: secret-volume

💡 이 설정을 적용하면 /etc/secret/username, /etc/secret/password 파일이 생성됩니다.


🚀 마무리

✔️ ConfigMap은 환경 변수 및 설정 파일을 관리하는 용도
✔️ Secret은 비밀번호, API 키 등 민감한 정보를 관리하는 용도
✔️ 둘 다 환경 변수 또는 파일 형태로 Pod에 주입 가능

 

728x90