애플리케이션을 배포할 때 환경 변수, 설정 파일, 보안 정보(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에 주입 가능
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #10: Node & Namespace (클러스터 리소스) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #9: PersistentVolume & StorageClass (구성 및 스토리지 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #7: NetworkPolicy (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #6: Service & Ingress (서비스 및 네트워크 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #5: Job & CronJob (워크로드 리소스) (0) | 2025.03.05 |