[k8s] ConfigMap / Secret 이해하기
ConfigMap과 Secret 이해하기
설정값을 코드에서 분리하는 방법
애플리케이션을 컨테이너로 실행하다 보면 환경마다 달라지는 값들이 생긴다. DB 주소, 포트, 비밀번호 같은 것들. 이걸 이미지 안에 하드코딩하면 값이 바뀔 때마다 이미지를 새로 빌드해야 한다.
쿠버네티스는 이 문제를 ConfigMap과 Secret으로 해결한다. 설정값을 별도 오브젝트에 저장하고, Pod가 시작될 때 환경변수로 주입하는 방식이다.
ConfigMap — 일반 설정값 보관함
ConfigMap은 평문으로 값을 저장한다. DB 호스트, 포트, 설정 경로 같이 민감하지 않은 정보에 쓴다.
만드는 방법은 두 가지다. 명령어로 직접 만들거나, yaml 파일로 선언하거나.
# 명령어로 생성
kubectl create configmap my-config \
--from-literal=DB_HOST=192.168.0.57 \
--from-literal=DB_PORT=5432
만들어진 ConfigMap 확인:
kubectl get configmap my-config -o yaml
apiVersion: v1
data:
DB_HOST: 192.168.0.57
DB_PORT: "5432"
kind: ConfigMap
metadata:
name: my-config
값이 평문으로 그대로 보인다.
Secret — 민감한 값 보관함
Secret은 비밀번호, API 키처럼 노출되면 안 되는 값에 쓴다. 구조는 ConfigMap과 동일하지만 값이 Base64로 인코딩되어 저장된다.
kubectl create secret generic my-secret \
--from-literal=DB_PASSWORD=mypassword
확인하면 값이 인코딩되어 있다:
kubectl get secret my-secret -o yaml
apiVersion: v1
data:
DB_PASSWORD: bXlwYXNzd29yZA== # Base64 인코딩
kind: Secret
type: Opaque
Base64는 암호화가 아니다. 디코딩하면 바로 원본이 나온다. 실수로 화면에 노출되는 것을 방지하는 수준이다.
echo "bXlwYXNzd29yZA==" | base64 -d
# mypassword
Pod에 주입하기
ConfigMap과 Secret 모두 Deployment yaml의 envFrom으로 주입한다.
spec:
containers:
- image: nginx:1.27
name: nginx
envFrom:
- configMapRef:
name: my-config # ConfigMap 주입
- secretRef:
name: my-secret # Secret 주입
Pod가 시작될 때 두 오브젝트의 값이 모두 환경변수로 들어온다.
주입된 환경변수 확인:
kubectl exec deploy/nginx-configmap -- env | grep -E "DB|PASSWORD"
DB_HOST=192.168.0.57
DB_PORT=5432
DB_PASSWORD=mypassword
[ 캡처 - kubectl exec 환경변수 확인 결과 ]
값 수정하는 방법
ConfigMap이나 Secret 값을 바꿀 때는 kubectl edit으로 수정하고, Deployment를 재시작해야 한다.
kubectl edit configmap my-config
kubectl rollout restart deployment nginx-configmap
ConfigMap과 Secret은 자체적으로 실행되는 프로세스가 없다. 값만 저장하는 보관함이기 때문에 재시작 개념이 없다. Pod(Deployment)가 재시작되어야 새 값을 읽어온다.
ConfigMap vs Secret 비교
| ConfigMap | Secret | |
|---|---|---|
| 용도 | 일반 설정값 | 비밀번호, API 키 |
| 저장 방식 | 평문 | Base64 인코딩 |
| 주입 방법 | configMapRef | secretRef |
| yaml 키워드 | kind: ConfigMap | kind: Secret |
다음 파트는 PV/PVC — 컨테이너가 재시작되어도 데이터가 사라지지 않게 하는 스토리지 연결 방법을 다룬다.