Kubernetes의 ConfigMap 및 Secret 관리


1. ConfigMap과 Secret이란?

Kubernetes에서 애플리케이션을 배포할 때, 환경 변수, 설정 파일, 비밀번호, API 키 등의 정보를 소스 코드와 분리하여 관리하는 것이 중요하다.

이를 위해 Kubernetes에서는 ConfigMapSecret을 제공한다.

  • 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

비교 항목ConfigMapSecret
목적설정 정보 저장 (환경 변수, 설정 파일 등)비밀번호, API 키, 인증서 등 민감한 정보 저장
데이터 저장 방식일반 텍스트Base64 인코딩된 데이터
보안일반적인 설정 정보 (보안 중요도 낮음)보안 강화 필요 (RBAC, KMS, 암호화 적용 가능)
파일 마운트 지원OO
환경 변수로 사용 가능OO

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 암호화 등의 보안 설정을 적용하여 안전한 관리를 고려해야 함.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다