ConfigMap, Secret & Configuration
설정과 시크릿을 컨테이너 이미지에서 분리
1. ConfigMap
1.1 비민감 설정 데이터를 Pod에 주입
# literal로 생성
kubectl create configmap app-config \
--from-literal=DB_HOST=db-service \
--from-literal=LOG_LEVEL=info
# 파일로 생성
kubectl create configmap nginx-conf --from-file=nginx.conf
1.2 주입 방법
환경변수:
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: DB_HOST
# 또는 전체 주입
envFrom:
- configMapRef:
name: app-config
볼륨 마운트:
volumes:
- name: config
configMap:
name: nginx-conf
volumeMounts:
- name: config
mountPath: /etc/nginx/nginx.conf
subPath: nginx.conf
볼륨 마운트 시 ConfigMap이 업데이트되면 자동 반영 (환경변수는 Pod 재시작 필요).
2. Secret
2.1 민감한 데이터 관리
# 생성
kubectl create secret generic db-secret \
--from-literal=password=MyP@ssw0rd \
--from-literal=username=admin
# TLS Secret
kubectl create secret tls tls-secret \
--cert=tls.crt --key=tls.key
| 유형 | 용도 |
|---|---|
| Opaque (기본) | 일반 키-값 (비밀번호, API 키) |
| kubernetes.io/tls | TLS 인증서 |
| kubernetes.io/dockerconfigjson | Docker Registry 인증 |
| kubernetes.io/service-account-token | SA 토큰 |
2.2 보안 주의사항
⚠️ Secret은 기본적으로 Base64 인코딩일 뿐 암호화가 아님.
| 보안 레벨 | 방법 |
|---|---|
| 기본 | Base64 (누구나 디코딩 가능) |
| etcd 암호화 | EncryptionConfiguration으로 etcd에 저장 시 암호화 |
| Sealed Secrets | 클러스터 공개키로 암호화, Git에 커밋 가능 |
| External Secrets | AWS Secrets Manager, Vault 등에서 동적으로 가져옴 |
| Vault | HashiCorp Vault CSI Provider |
3. Resource Requests & Limits
3.1 리소스 관리
resources:
requests: # 최소 보장량 (스케줄러가 참고)
cpu: "250m" # 0.25 코어
memory: "256Mi"
limits: # 최대 사용량 (초과 시 제한/OOMKill)
cpu: "500m"
memory: "512Mi"
| requests | limits | |
|---|---|---|
| CPU 초과 | — | 스로틀링 (느려짐) |
| 메모리 초과 | — | OOMKill (강제 종료) |
| 스케줄링 | ✅ 기준 | — |
3.2 QoS (Quality of Service)
| QoS 클래스 | 조건 | 축출 우선순위 |
|---|---|---|
| Guaranteed | requests = limits (모든 컨테이너) | 마지막 (가장 안전) |
| Burstable | requests < limits (일부라도) | 중간 |
| BestEffort | requests/limits 없음 | 첫 번째 (가장 먼저 축출) |
3.3 LimitRange & ResourceQuota
| 오브젝트 | 범위 | 역할 |
|---|---|---|
| LimitRange | 네임스페이스 | Pod/Container 기본 requests/limits 설정, 최소/최대 제한 |
| ResourceQuota | 네임스페이스 | 전체 리소스 상한 (총 CPU, 메모리, Pod 수, PVC 수) |
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "4"
requests.memory: 8Gi
limits.cpu: "8"
limits.memory: 16Gi
pods: "20"
다음 글
→ #7 RBAC & Security