1. ConfigMap과 Secret이란?
Kubernetes에서 애플리케이션을 배포할 때, 환경 변수, 설정 파일, 비밀번호, API 키 등의 정보를 소스 코드와 분리하여 관리하는 것이 중요하다.
이를 위해 Kubernetes에서는 ConfigMap과 Secret을 제공한다.
- ConfigMap: 환경 변수, 설정 파일, 명령줄 인자 등 일반적인 설정 정보를 저장
- Secret: 비밀번호, API 키, 인증서 등 민감한 정보를 저장
💡 ConfigMap과 Secret을 사용하면?
- 설정 변경 시 애플리케이션을 다시 배포하지 않아도 됨
- 여러 애플리케이션에서 공통 설정을 공유 가능
- 비밀번호, API 키 같은 민감한 정보를 안전하게 관리 가능
2. ConfigMap
1) ConfigMap 생성 방법
ConfigMap은 환경 변수, 설정 파일, 명령줄 인자 등을 관리하는 데 사용된다.
(1) YAML 파일로 생성
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
database_url: "mysql://db.example.com:3306"
log_level: "debug"
📌 설명:
database_url
,log_level
같은 설정 값을 저장할 수 있음data
필드 아래에 Key-Value 형식으로 설정
(2) kubectl 명령어로 생성
kubectl create configmap my-config \
--from-literal=database_url="mysql://db.example.com:3306" \
--from-literal=log_level="debug"
📌 --from-literal
옵션을 사용하여 직접 key-value 값을 설정할 수 있음.
2) ConfigMap 사용 방법
ConfigMap은 Pod에서 환경 변수, 볼륨 마운트, 명령줄 인자로 사용할 수 있다.
(1) 환경 변수로 주입
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app
envFrom:
- configMapRef:
name: my-config
📌 envFrom
을 사용하면 ConfigMap의 모든 값을 환경 변수로 주입할 수 있음.
(2) 특정 환경 변수로 주입
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app
env:
- name: DATABASE_URL
valueFrom:
configMapKeyRef:
name: my-config
key: database_url
📌 특정 Key(database_url
)만 선택하여 환경 변수로 사용 가능.
(3) 볼륨 마운트로 사용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
volumes:
- name: config-volume
configMap:
name: my-config
containers:
- name: my-container
image: my-app
volumeMounts:
- name: config-volume
mountPath: /config
📌 ConfigMap
을 파일로 마운트하여 애플리케이션이 설정 파일로 읽을 수 있도록 설정 가능.
3. Secret
1) Secret 생성 방법
Secret은 비밀번호, API 키, 인증서 등 민감한 정보를 저장하는 데 사용된다.
(1) YAML 파일로 생성
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: dXNlcm5hbWU= # "username"을 Base64 인코딩한 값
password: cGFzc3dvcmQ= # "password"를 Base64 인코딩한 값
📌 Secret의 data
필드는 Base64 인코딩된 값을 저장해야 한다.
(2) kubectl 명령어로 생성
kubectl create secret generic my-secret \
--from-literal=username="myuser" \
--from-literal=password="mypassword"
📌 --from-literal
을 사용하면 Base64 인코딩이 자동 적용됨.
2) Secret 사용 방법
Secret도 ConfigMap과 마찬가지로 환경 변수, 볼륨 마운트 등의 방식으로 사용할 수 있다.
(1) 환경 변수로 주입
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app
env:
- name: DB_USER
valueFrom:
secretKeyRef:
name: my-secret
key: username
📌 secretKeyRef
를 사용하여 특정 Key 값만 환경 변수로 설정 가능.
(2) 볼륨 마운트로 사용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
volumes:
- name: secret-volume
secret:
secretName: my-secret
containers:
- name: my-container
image: my-app
volumeMounts:
- name: secret-volume
mountPath: /secrets
📌 Secret을 파일 형태로 /secrets
디렉토리에 마운트 가능.
4. ConfigMap vs Secret
비교 항목 | ConfigMap | Secret |
---|---|---|
목적 | 설정 정보 저장 (환경 변수, 설정 파일 등) | 비밀번호, API 키, 인증서 등 민감한 정보 저장 |
데이터 저장 방식 | 일반 텍스트 | Base64 인코딩된 데이터 |
보안 | 일반적인 설정 정보 (보안 중요도 낮음) | 보안 강화 필요 (RBAC, KMS, 암호화 적용 가능) |
파일 마운트 지원 | O | O |
환경 변수로 사용 가능 | O | O |
5. ConfigMap 및 Secret 사용 시 고려 사항
1) Secret은 Base64로 인코딩되지만, 암호화된 것은 아님
- Secret 데이터는 기본적으로 Base64로 인코딩되어 있지만, 쉽게 디코딩할 수 있음
- 보안을 강화하려면 ETCD 데이터 암호화(KMS, AES-256) 적용 필요
2) RBAC을 활용한 접근 제어
- ConfigMap과 Secret을 보호하기 위해 **Role-Based Access Control (RBAC)**을 활용
kubectl get secret my-secret -o yaml
로 조회할 수 있으므로, 접근 권한을 제한해야 함
3) Secret을 환경 변수로 사용하면 Pod 로그에서 노출될 가능성 있음
kubectl describe pod
를 실행하면 환경 변수가 출력될 수 있음- 볼륨 마운트 방식이 보안적으로 더 안전할 수 있음
6. 결론
✅ ConfigMap과 Secret을 활용하면 애플리케이션 설정을 외부에서 관리할 수 있어 유연성이 높아짐.
✅ Secret은 보안이 중요한 데이터(API 키, 인증서 등)에 필수적으로 사용해야 함.
✅ RBAC, KMS 암호화 등의 보안 설정을 적용하여 안전한 관리를 고려해야 함.