티스토리 뷰
쿠버네티스 실습: ConfigMap과 Secret으로 환경 설정 관리하기
앞선 글에서는 YAML 매니페스트로 Deployment와 Service를 선언해 Nginx 웹 서버를 배포했습니다.
이번에는 쿠버네티스에서 환경 설정을 안전하고 유연하게 관리하는 방법인 ConfigMap과 Secret을 실습합니다.
1) 왜 ConfigMap과 Secret인가?
- ConfigMap: 애플리케이션이 사용하는 일반 설정값을 저장하는 객체.
(예: 환경 변수, 설정 파일 내용, 키-값 쌍) - Secret: 민감한 데이터(DB 비밀번호, API Key 등)를 저장하는 객체.
Base64로 인코딩되며, Pod 내부에 환경 변수나 파일로 안전하게 전달.
👉 핵심: 코드(이미지)와 설정을 분리해서 관리하면 배포/운영이 훨씬 유연해집니다.
2) ConfigMap 만들기 (환경 변수 예시)
nginx-configmap.yaml 작성:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
data:
WELCOME_MSG: "Hello from Kubernetes ConfigMap"
적용:
kubectl apply -f nginx-configmap.yaml
확인:
kubectl get configmap nginx-config -o yaml
3) Secret 만들기 (민감 정보 예시)
nginx-secret.yaml 작성:
apiVersion: v1
kind: Secret
metadata:
name: nginx-secret
type: Opaque
data:
PASSWORD: c3VwZXJzZWNyZXQ= # "supersecret" 문자열을 Base64 인코딩한 값
Base64 인코딩 확인법 (터미널에서):
echo -n "supersecret" | base64
적용:
kubectl apply -f nginx-secret.yaml
확인:
kubectl get secret nginx-secret -o yaml
4) Deployment에서 ConfigMap & Secret 사용하기
nginx-deployment-config.yaml 작성:
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-nginx
spec:
replicas: 1
selector:
matchLabels:
app: hello-nginx
template:
metadata:
labels:
app: hello-nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
env:
- name: WELCOME_MSG
valueFrom:
configMapKeyRef:
name: nginx-config
key: WELCOME_MSG
- name: PASSWORD
valueFrom:
secretKeyRef:
name: nginx-secret
key: PASSWORD
적용:
kubectl apply -f nginx-deployment-config.yaml
5) 파드 안에서 값 확인하기
Pod 이름 확인:
kubectl get pods
Pod 내부 진입:
kubectl exec -it <POD_NAME> -- /bin/bash
환경 변수 확인:
echo $WELCOME_MSG
echo $PASSWORD
출력 예시:
Hello from Kubernetes ConfigMap
supersecret
6) 구조 이해
- ConfigMap/Secret → etcd에 저장됨 → Pod 스펙의 env나 volumeMounts로 주입 가능
- Deployment가 새로 뜰 때마다 자동으로 해당 값을 컨테이너 환경에 전달
- 코드 수정 없이 설정만 바꾸면 Pod 재시작으로 반영 가능
7) 삭제/정리
kubectl delete -f nginx-deployment-config.yaml
kubectl delete -f nginx-configmap.yaml
kubectl delete -f nginx-secret.yaml
8) 정리
- ConfigMap: 일반 설정값 저장
- Secret: 민감 데이터 저장 (Base64 인코딩)
- Pod는 env 또는 파일 마운트 방식으로 해당 값을 사용할 수 있다.
- 운영에서는 DB URL, API 키, 토큰 등을 Secret으로 관리하는 것이 필수적이다.
다음 글에서는 PersistentVolume과 PersistentVolumeClaim을 활용해 데이터가 유지되는 스토리지를 연결하는 방법을 실습합니다. (예: PostgreSQL 데이터 저장소)
쿠버네티스,ConfigMap,Secret,환경변수관리,보안설정,Minikube,DevOps,K8s튜토리얼,쿠버네티스보안,Pod환경설정
1. Secret은 Base64 인코딩일 뿐, 암호화는 아님
- Base64는 단순한 인코딩 방식일 뿐이며, 실제로 데이터를 보호하지 않습니다. 누구든 Base64 디코딩만 하면 원본 데이터를 쉽게 확인할 수 있습니다.
(Stack Overflow) - 기본적인 쿠버네티스 클러스터는 Secrets도 etcd에 평문 형태로 저장됩니다. 즉, etcd에 접근할 수 있다면 누구든 Secret 데이터에 접근할 수 있으므로, 기본 설정 그대로는 보안상 취약할 수 있습니다.
(DevOps.dev) - 보안 강화 방법:
- etcd에 저장된 Secret 데이터를 암호화된 상태로 저장하도록 설정 (Encryption at rest).
- RBAC 정책을 최소 권한으로 구성.
- 외부 Secret 관리 시스템(예: HashiCorp Vault, AWS KMS) 연동을 고려.
(Kubernetes, spectrocloud.com)
2. ConfigMap도 보안 대책 없이 사용하면 위험할 수 있음
- ConfigMap은 비밀 데이터가 아니니 안전하다는 오해가 있습니다. 하지만 ConfigMap도 etcd에 평문으로 저장되며, 접근 권한이 있는 유저는 누구든 데이터를 열람할 수 있습니다.
(groundcover.com) - 따라서 민감하지 않은 설정만 ConfigMap에 저장하고, 보안이 필요한 데이터는 반드시 Secret으로 분리하는 것이 안전합니다.
3. 올바른 차별화와 활용 방식 정리
리소스 사용 목적 저장 방식 보안 수준
| ConfigMap | 비민감 설정 (환경 변수, 설정 파일 등) | 평문 key-value | 보안 없음 (etcd에 평문) |
| Secret | 민감 정보 (비밀번호, API 키 등) | base64 인코딩, 평문 저장 | 암호화 없음 (추가 설정 필요) |
Reddit 실제 사용자 인사이트
“Secrets are no more (or less) secure than ConfigMaps. The only difference being that secrets encode their values in base64.”
— Reddit 사용자
(spectrocloud.com, plural.sh, Kubernetes, DevOps.dev, getambassador.io, Reddit)
이 표현은 오해의 여지가 있지만, 실제로는 다음과 같은 이유에서 의미가 있습니다:
- 둘 다 etcd에 저장된다.
- Secret만 Base64 인코딩되어 있어 ‘위장’ 수준의 보호만 제공한다.
추가 제안: 실습 개선 팁
- Secret을 생성하거나 사용할 때, 단순히 base64로 인코딩하는 것 외에도 stringData 필드 사용으로 읽기 쉬운 문자열 그대로 입력 후 내부적으로 base64 처리할 수도 있습니다.
(DevOps.dev) - ConfigMap과 Secret을 파일로 마운트하는 방식도 함께 실습하면, 환경 변수 방식 vs 파일 방식의 차이점과 장단점을 명확히 보여줄 수 있어 유익합니다.
(plural.sh, Kubernetes) - 클러스터에서 실습할 경우, Secret 데이터 암호화를 활성화하는 방법이나 외부 Secret 연동 방법까지 미리 언급하면 더욱 전문적인 톤을 유지할 수 있습니다.
(Kubernetes, spectrocloud.com)
요약 정리
- Base64 ≠ 암호화: Secret은 암호화된 저장소가 아니므로 별도 보안 조치가 필요합니다.
- ConfigMap도 평문 저장: 오직 비민감 설정만, 보안 설정은 별도로 분리.
- 보안 강화 필요 시: Encryption at rest, External Secrets, RBAC 최소 권한 설정 등을 고려하세요.
'project > 맥미니로 시작하는 쿠버네티스' 카테고리의 다른 글
| 쿠버네티스 실습: Redis 배포와 NestJS 애플리케이션 연동 (0) | 2025.08.27 |
|---|---|
| 쿠버네티스 실습: StatefulSet으로 PostgreSQL 배포하기 (PVC 연동) (0) | 2025.08.26 |
| 쿠버네티스 실습: PersistentVolume과 PersistentVolumeClaim으로 데이터 저장하기 (0) | 2025.08.25 |
| 쿠버네티스 실습: YAML 매니페스트로 Nginx 배포하기 (0) | 2025.08.21 |
| 쿠버네티스 첫 걸음: 맥미니에서 로컬 클러스터 시작하기 (Minikube + kubectl 완전 실습) (0) | 2025.08.20 |
- Total
- Today
- Yesterday
- rag
- Redis
- nextJS
- 웹개발
- Docker
- DevOps
- kotlin
- flax
- node.js
- 백엔드개발
- llm
- 쿠버네티스
- fastapi
- Prisma
- Python
- ai철학
- Express
- JAX
- NestJS
- 개발블로그
- seo 최적화 10개
- JWT
- Next.js
- 딥러닝
- 생성형AI
- SEO최적화
- CI/CD
- PostgreSQL
- REACT
- LangChain
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |

