쿠버네티스 (Kubernetes) 주요 개념 컨피그맵(ConfigMap)과 시크릿(Secret)
쿠버네티스에서 컨피그맵(ConfigMap)과 시크릿(Secret)은 파드(Pod)나 컨테이너가 동작할 때 필요한 설정값이나 민감 정보를 코드와 분리하여 안전하고 유연하게 관리하기 위한 리소스입니다.
1. 컨피그맵(ConfigMap)
1.1 개념
- 정의
컨피그맵은 애플리케이션 설정 정보를 저장하기 위한 오브젝트입니다.
예: 데이터베이스 접속 정보(호스트, 포트), 환경 변수(ENV), 설정 파일 내용 등 - 특징
- 민감하지 않은 일반 설정 정보를 저장합니다.
- 파드에서 파일, 환경 변수, 커맨드 라인 인수 등 다양한 형태로 주입 가능
- 컨테이너 이미지를 다시 빌드하지 않고, 설정 정보만 교체하여 재시작해도 반영이 가능
1.2 사용 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: example-config
data:
# 단순 키-값 형태
APP_ENV: "production"
# 파일 형태도 저장 가능
config.json: |
{
"debug": false,
"max_retry": 5
}
- data 섹션에 키-값 쌍 형태로 설정을 보관
- JSON, properties, plain text 등 다양한 형식으로 설정 가능
1.3 파드에서 사용하는 방법
-
환경 변수로 주입하기
env: - name: APP_ENV valueFrom: configMapKeyRef: name: example-config key: APP_ENV
-
볼륨(파일)로 마운트하기
volumes: - name: config-volume configMap: name: example-config volumeMounts: - name: config-volume mountPath: "/etc/config"
-
커맨드 라인 인수로 전달하기 등
2. 시크릿(Secret)
2.1 개념
- 정의
시크릿은 민감 정보(패스워드, API 키, 인증서 등)를 안전하게 저장하고 파드에 전달하기 위한 오브젝트입니다. - 특징
- 컨피그맵과 유사하지만, 정보가 base64 인코딩되어 저장
- 예를 들어 GitHub 액세스 토큰, DB 비밀번호 등 외부에 노출되면 안 되는 정보
- 일반 컨피그맵보다 접근 권한(RBAC, ACL 등)을 더욱 엄격하게 제어하는 것이 바람직
2.2 사용 예시
apiVersion: v1
kind: Secret
metadata:
name: example-secret
type: Opaque
data:
username: YWRtaW4= # "admin"을 base64 인코딩
password: cGFzc3dvcmQ= # "password"를 base64 인코딩
- data 필드에 key-value 형태로 base64 인코딩된 데이터를 저장
- type은
Opaque
가 일반적이며, TLS 인증서 시크릿의 경우kubernetes.io/tls
등도 가능
2.3 파드에서 사용하는 방법
-
환경 변수로 사용
env: - name: DB_USER valueFrom: secretKeyRef: name: example-secret key: username - name: DB_PASS valueFrom: secretKeyRef: name: example-secret key: password
-
파일로 마운트 (볼륨)
volumes: - name: secret-volume secret: secretName: example-secret volumeMounts: - name: secret-volume mountPath: "/etc/secret" readOnly: true
-
TLS 인증서로 사용 (Ingress, HTTPS 서버 등)
3. 컨피그맵(ConfigMap)과 시크릿(Secret) 비교
구분 | 컨피그맵(ConfigMap) | 시크릿(Secret) |
---|---|---|
주요 목적 | 민감하지 않은 설정정보 저장 및 관리 | 민감 정보(패스워드, 인증서 등) 안전하게 관리 |
데이터 저장 형태 | 일반 텍스트 (base64 인코딩 없이 평문) | base64로 인코딩하여 저장 |
대표 사용 예 | 일반 설정, 환경 변수, 설정 파일(JSON, properties, etc.) | DB 비밀번호, API 토큰, TLS 인증서, SSH 키 등 |
암호화/권한 | 일반적으로 Secret보다 보안 요구 사항이 낮음 | 접근 권한(RBAC) 철저하게 관리, KMS/Encryption 사용 권장 |
파드 적용 방법 | 환경 변수, 볼륨, 커맨드 인수 등 | 환경 변수, 볼륨(읽기 전용), 인증서로도 사용 가능 |
4. 보안 및 운영 팁
- RBAC(롤/롤바인딩) 활용
- 시크릿이나 컨피그맵에 대한 접근 권한을 최소화(Least Privilege)
- 시크릿은 특히 민감 정보이므로 접근 가능한 대상(사용자, 서비스 계정 등)을 엄격히 제한
- Encryption at Rest
- 쿠버네티스 1.7+ 버전에서는 etcd에 저장되는 Secret 데이터를 암호화할 수 있음
- 클러스터에서 암호화 기능을 켜서 시크릿이 평문으로 노출되지 않도록 함
- GitOps 환경에서의 관리
- 시크릿은 민감 정보를 담고 있으므로 코드 저장소에 평문(plain text)으로 보관하지 않도록 주의
- Sealed Secrets(주키퍼, HashiCorp Vault 등) 같은 솔루션을 사용해 암호화된 형태로 저장 가능
- 주기적인 로테이션(Rotation)
- 비밀번호, 토큰 등은 주기적으로 갱신하여 보안을 강화
- 자동 로테이션 방법: 외부 비밀 관리 시스템(Vault) 연동
5. 요약
-
컨피그맵(ConfigMap):
- 일반 설정을 애플리케이션 로직과 분리
- 컨테이너 이미지를 재빌드하지 않고도 설정 변경 가능
- 주로 환경 변수, 설정 파일 등을 담음
-
시크릿(Secret):
- 민감 정보를 안전하게 보관하고 파드에 주입
- base64로 인코딩해 저장하므로 GitHub 등에서 평문 노출을 방지
- 주로 비밀번호, 인증 토큰, TLS 인증서 등을 담음
두 리소스 모두 파드와 독립적으로 변경 가능한 동적 설정이라는 점이 핵심이며, 이를 통해 CI/CD 파이프라인에서 설정 변경 최소화, 보안 강화 등을 달성할 수 있습니다.
이처럼 컨피그맵과 시크릿은 쿠버네티스가 애플리케이션 설정·비밀 관리를 유연하고 안전하게 처리하도록 해주는 중요한 도구입니다.
댓글남기기