코드와 설정을 분리하여 성숙한 애플리케이션 만들기 (feat. ConfigMap & Secret)
지금까지 쿠버네티스가 어떻게 애플리케이션을 자동으로 배치, 통신, 배포, 복구하는지 알아보았습니다. 이 강력한 기능들 덕분에 우리의 애플리케이션은 이제 클러스터 위에서 견고하게 운영되고 있습니다.
하지만 성숙한 애플리케이션으로 나아가기 위해서는 반드시 해결해야 할 중요한 과제가 남아있습니다. 바로 ‘설정(Configuration)’과 ‘비밀번호(Secret)’를 어떻게 안전하고 유연하게 관리할 것인가의 문제입니다.
💬 개발자의 고민: “DB 비밀번호, 코드에 넣어도 괜찮을까요?”
애플리케이션은 혼자 동작하지 않습니다. 데이터베이스에 연결하고, 외부 API를 호출하며, 다양한 기능 플래그에 따라 다르게 동작합니다. 이때 다음과 같은 고민이 시작됩니다.
“애플리케이션 설정값(예: 데이터베이스 주소, 외부 API 키)이나 비밀번호 같은 민감 정보를 코드나 컨테이너 이미지에 직접 넣는 건 매우 위험하다고 들었어요.“
“개발, 스테이징, 운영 환경마다 다른 데이터베이스에 접속해야 하는데, 어떻게 하면 이 설정들을 안전하고 유연하게 관리할 수 있을까요?”
설정을 코드에 하드코딩하는 것은 보안 사고로 이어지는 지름길이며, 환경마다 이미지를 새로 빌드하는 것은 비효율의 극치입니다. 이는 유명한 ’12 요소 앱(Twelve-Factor App)’ 원칙 중 하나인 ‘코드에서 설정 분리’를 위배하는 것이기도 합니다.
🔧 쿠버네티스의 해결책: 설정 전용 보관함, ConfigMap
과 Secret
쿠버네티스는 이러한 문제를 해결하기 위해 두 가지 전용 오브젝트를 제공합니다. 마치 은행의 ‘일반 서류함’과 ‘비밀 금고’처럼 각자의 역할이 명확합니다.
1. 일반 설정 보관함: ConfigMap
ConfigMap
은 데이터베이스 주소, 기능 활성화 여부 등 민감하지 않은 일반 설정 데이터를 키-값(Key-Value) 형태로 저장하는 데 사용됩니다.
🧩 ConfigMap 예시:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
# 키(Key) : 값(Value)
DB_HOST: "db.production.internal"
FEATURE_X_ENABLED: "true"
2. 비밀 금고: Secret
Secret
은 이름 그대로 비밀번호, API 토큰, TLS 인증서 등 민감한 정보를 저장하기 위해 설계되었습니다. 데이터는 외부에 바로 노출되지 않도록 Base64로 인코딩되어 저장됩니다.
⚠️ 중요: Base64는 암호화가 아닌 단순 인코딩입니다. 누구나 쉽게 디코딩할 수 있으므로,
Secret
만으로 완벽한 보안이 보장되지는 않습니다. 실제 운영 환경에서는 RBAC(역할 기반 접근 제어), etcd 암호화, Vault 같은 외부 보안 솔루션과 함께 사용하는 것이 좋습니다.
🔐 Secret 예시:
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque # 일반적인 시크릿 타입
data:
# 'supersecret' 라는 문자열을 Base64로 인코딩한 값
DB_PASSWORD: c3VwZXJzZWNyZXQ=
📥 컨테이너에 설정 주입하기
이렇게 분리된 설정과 시크릿은 컨테이너에 직접 주입되어 사용됩니다. 가장 일반적인 방법은 환경 변수로 주입하는 것입니다.
# Pod 설정 파일의 일부
spec:
containers:
- name: my-app
image: my-app:v1.2
# app-config와 app-secret의 모든 키-값 쌍을 환경 변수로 가져옵니다.
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secret
이제 my-app
컨테이너 내부에서는 DB_HOST
, DB_PASSWORD
같은 환경 변수를 코드에서 읽어 사용할 수 있습니다.
🎁 개발자가 얻는 실질적인 혜택
ConfigMap
과 Secret
을 통해 개발팀과 인프라는 한 단계 더 성숙해집니다.
✅ 코드와 설정의 완벽한 분리: 애플리케이션 로직과 환경별 설정이 명확히 분리되어 코드의 재사용성과 가독성이 높아집니다.
✅ 강화된 보안: 비밀번호와 같은 민감 정보가 Git과 같은 코드 저장소에 노출될 위험이 사라져 보안 수준이 향상됩니다.
✅ 유연한 환경 구성: 단 하나의 컨테이너 이미지를 가지고, 각기 다른 ConfigMap
과 Secret
을 주입하여 개발/스테이징/운영 등 다양한 환경에 배포할 수 있습니다.
✅ 빠른 설정 변경: 설정을 바꾸기 위해 이미지를 다시 빌드하고 배포할 필요 없이, ConfigMap
이나 Secret
만 업데이트하고 Pod를 재시작하면 되므로 매우 효율적입니다.
결과적으로, 쿠버네티스는 애플리케이션의 실행뿐만 아니라 ‘관리’ 측면에서도 강력한 도구를 제공하여, 더욱 안전하고 유지보수성이 높은 인프라 구성을 가능하게 합니다.