
쿠버네티스에서 애플리케이션 설정을 다룰 때 자주 사용하는 리소스가 ConfigMap과 Secret이다.
둘 다 설정값을 저장하지만, 용도와 보안 수준이 다르다.
키–값 형태로 데이터를 저장
Pod에
애플리케이션 설정을 클러스터 레벨에서 관리하게 해주는 리소스
| 항목 | ConfigMap | Secret |
|---|---|---|
| 용도 | 비밀이 아닌 일반 설정값 | 비밀번호, 토큰, API 키 같은 민감 정보 |
| 저장 방식 | 평문 | Base64 인코딩된 값 |
| 접근 제어 | 기본적인 리소스 권한으로 제어 | RBAC 등으로 더 엄격하게 관리하는 것이 일반적 |
| 대표 예시 | DB URL, 타임아웃 값, 기능 플래그 | DB 계정/비밀번호, OAuth 토큰, 인증서 등 |
ConfigMap은 비밀이 아닌 설정 값을 저장하는 리소스다.
configmap.ymlapiVersion: v1
kind: ConfigMap
metadata:
name: db-config
data:
database_url: "jdbc:mariadb://localhost:3306/menudb"
timeout: "30"
db-config라는 이름의 ConfigMap 생성database_url, timeout 두 개의 설정 값 보관Secret은 민감한 정보를 저장하는 리소스다.
비밀번호, 계정 정보, API 키, 토큰 등
데이터는 Base64로 인코딩된 형태로 저장된다.
접근 권한을 최소화해서 관리해야 한다.
Secret의 data 필드는 Base64 인코딩된 문자열을 사용한다.
# Linux / macOS
echo -n 'swcamp' | base64
# Windows PowerShell
[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("swcamp"))
위 결과 (c3djYW1w)를 Secret에 넣는다.
secret.ymlapiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: c3djYW1w
password: c3djYW1w
db-secret Secret 생성username, password 값은 Base64 인코딩된 문자열Deployment에서 ConfigMap과 Secret을 환경 변수로 읽어오는 예시.
apiVersion: apps/v1
kind: Deployment
metadata:
name: boot005dep
spec:
replicas: 1
selector:
matchLabels:
app: boot005kube
template:
metadata:
labels:
app: boot005kube
spec:
containers:
- name: boot-container
image: limu810/k8s-boot-ing:latest
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: db-config
key: database_url
- name: TIMEOUT
valueFrom:
configMapKeyRef:
name: db-config
key: timeout
- name: USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
DATABASE_URL, TIMEOUTdb-config ConfigMap에서 값 가져옴USERNAME, PASSWORDdb-secret Secret에서 값 가져옴애플리케이션은 그냥 환경 변수만 읽으면 되고, 실제 값 관리는 Kubernetes 리소스에서 담당한다.
# 1) ConfigMap 생성
kubectl apply -f configmap.yml
# 2) Secret 생성
kubectl apply -f secret.yml
# 3) Deployment 생성
kubectl apply -f boot005dep.yml
Pod 상태 확인:
kubectl get pods
kubectl exec -it <pod-name> -- /bin/sh
echo $DATABASE_URL # ConfigMap 값
echo $TIMEOUT # ConfigMap 값
echo $USERNAME # Secret 값
echo $PASSWORD # Secret 값
# 또는
printenv DATABASE_URL
printenv TIMEOUT
printenv USERNAME
printenv PASSWORD
값이 의도한 대로 출력되면 ConfigMap과 Secret이 정상적으로 주입된 상태다.
ConfigMap
Secret
Deployment 활용
env.valueFrom.configMapKeyRef로 ConfigMap 읽기env.valueFrom.secretKeyRef로 Secret 읽기