102. 컨피그맵(ConfigMap) / 시크릿(Secret)과 12-Factor App 분리
⚠️ 이 문서는 개발자가 소스코드(앱) 안에 데이터베이스 IP 주소나 비밀번호를 무식하게 타이핑(하드코딩)해서 도커 이미지로 구워버리면, 나중에 개발 서버용 이미지와 운영 서버용 이미지를 따로따로 100번씩 구워야 하는 최악의 노가다 참사를 막기 위해, **앱 덩어리(도커 이미지)는 딱 1개만 무결점으로 구워내고, 껍데기(설정값과 암호)는 밖으로 뜯어내어 파드가 실행되는 찰나의 순간에 외부에서 배꼽에 푹 주사기(주입)로 찔러 넣어주는 클라우드 네이티브의 абсолют 헌법(12-Factor) 객체인 'ConfigMap'과 'Secret'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 쿠버네티스의 '설정 파일 외주화' 객체다. 앱 컨테이너 바깥 허공에 포스트잇(설정값 모음)을 붙여놓고, 컨테이너가 뜰 때 그 포스트잇의 글씨를 환경 변수(ENV)나 파일로 쏙 읽어(Mount) 가게 만든다.
- 가치: "코드는 1번만 빌드하라(Build Once, Run Anywhere)." 동일한
myapp:v1이미지 덩어리 하나를 가지고, 개발 서버에 던질 때는 '개발 DB 주소' 포스트잇을 꽂아주고, 운영 서버에 던질 때는 '운영 DB 주소' 포스트잇을 갈아 끼우는 것만으로 서버 환경을 0.1초 만에 스위칭할 수 있는 불변성(Immutability)을 확보한다.- 기술 체계: 평범한 설정 텍스트(DB IP 주소, 테마 색상 등)를 쌩얼로 담는 일반 포스트잇이 **
ConfigMap(컨피그맵)**이며, 탈리면 멸망하는 DB 비밀번호, API 인증 키, TLS 인증서를 Base64로 살짝 꼬아서 담아두는 자물쇠 포스트잇이 **Secret(시크릿)**이다.
Ⅰ. 하드코딩의 원죄와 12-Factor App의 헌법 3조
코드와 설정값을 같이 비벼서 굽는 자는 클라우드 시대의 이단아다.
- 하드코딩(Hard-coding)의 재앙:
- 초보 개발자 A가 자바(Java) 소스코드 10번 줄에
db_url = "192.168.1.5 (개발용 DB)"라고 키보드로 치고, 이걸 꽝꽝 얼려서앱_개발용.jar(도커 이미지)로 구워버렸다. - 일주일 뒤 이 앱을 진짜 실제 손님이 쓰는 운영 서버로 배포해야 한다.
- 운영 DB 주소는
10.0.0.99다. 초보자 A는 눈물을 흘리며 소스코드를 다시 열어 숫자를 지우고 고친 뒤,앱_운영용.jar라는 이미지를 또 30분 동안 새로 컴파일해서 구워내야 한다. 서버가 100개면 이미지를 100개 찍어내는 개노가다 붕괴 상태에 빠진다.
- 초보 개발자 A가 자바(Java) 소스코드 10번 줄에
- 12-Factor App (클라우드 네이티브 헌법):
- 넷플릭스 등 클라우드 신들이 정한 12가지 철칙 중 3번째 원칙. "설정(Config)은 무조건 코드(Code)에서 완벽히 뜯어내어 외부 환경 변수(Environment Variables)로 철저하게 분리하라!"
- 개발자는 코드에
db_url = System.getenv("DB_HOST")(허공에서 주소 가져오기) 라고만 뚫어둔 채 깨끗한 깡통 도커 이미지 단 1개만 영구적으로 구워낸다. 이게 진짜 불변(Immutable)의 황금 아티팩트다.
📢 섹션 요약 비유: 초보자는 붕어빵(도커 이미지) 반죽 안에 아예 '개발팀용 단팥'을 비벼 넣어서 구워버립니다. 나중에 '운영팀용 슈크림' 맛을 팔려면 반죽부터 새로 사서 30분간 빵을 다시 구워야 합니다(재빌드 참사). 클라우드 전문가(12-Factor)는 속이 텅 빈 완벽한 깡통 붕어빵(코드) 딱 1개만 대량으로 공장에서 찍어 구워냅니다. 그리고 손님에게 빵을 내어주는 그 1초의 순간에, 주사기를 빵 배꼽에 찔러 팥(ConfigMap)을 넣을지 슈크림(Secret)을 찔러 넣을지 결정하여(주입) 1초 만에 메뉴를 무한대로 바꿔치는 기적의 베이커리 시스템입니다.
Ⅱ. 포스트잇의 2가지 변주: ConfigMap과 Secret
보여도 되는 글씨는 일반 종이에, 털리면 안 되는 글씨는 금고에.
- ConfigMap (컨피그맵 - 평범한 설정값):
- 쿠버네티스 허공에 떠 있는 커다란 텍스트 박스 객체다.
- 여기에
DB_HOST=10.0.0.99,UI_THEME=DARK,MAX_USER=1000같은 평범한 일반 텍스트 정보들을 Key-Value 형태로 주르륵 적어둔다. - Nginx 파드가 뜰 때
envFrom옵션을 주면, 파드가 숨을 쉬면서 허공의 ConfigMap 포스트잇을 읽어들여 자기 뱃속의 환경 변수로 촥 세팅하고 기분 좋게 켜진다.
- Secret (시크릿 - 털리면 죽는 암호들):
DB_PASSWORD=1234!@#$,AWS_API_KEY=ABCDEFG같은 치명적 암호를 ConfigMap에 생얼(Plain-text)로 적어두면, 깃허브(Git)에 코드가 올라가는 순간 전 세계 해커들이 환호성을 지르며 회사를 털어간다.- 그래서 쿠버네티스는 이 무서운 글씨들을 위해 **
Secret**이라는 특수 자물쇠 상자를 따로 만들었다. - 시크릿 객체는 텍스트를
Base64라는 방식으로 한 번 암호화(인코딩)해서 꼬아놓고 숨겨버린다. - 게다가 시크릿은 노드(물리 서버)의 하드디스크에 저장되지 않고, 오직 휘발성 램(RAM, tmpfs) 위에만 살짝 떠 있다가 파드에게 주입되므로, 해커가 노드 서버 하드를 뽑아 도망가도 암호를 털 수 없는 극강의 방어 체계를 자랑한다.
📢 섹션 요약 비유: 빵에 찔러 넣을 재료(설정) 중 2가지 용기가 있습니다. ConfigMap은 투명한 플라스틱 통입니다. 누구나 밖에서 "아, 이건 식용 색소(UI 테마)랑 설탕(IP 주소)이네" 하고 구경할 수 있는 덜 위험한 재료입니다. 반면 Secret은 속이 안 보이는 검은색 특수 티타늄 금고입니다. 이 안에는 독약(털리면 끝장나는 DB 비밀번호, API 키)이 들어있어 아무나 볼 수 없고, 오직 권한이 있는 파드(로봇)만이 금고에 주사기를 꽂아 자기 뱃속으로 몰래 내용물을 빨아들일 수 있는 특급 보안 용기입니다.
Ⅲ. 주사기 꽂는 방법 2가지: ENV 주입 vs 볼륨 마운트
단어를 하나씩 꽂을 것인가, A4 용지 100장을 통째로 파일로 쑤셔 넣을 것인가.
- 환경 변수 (Environment Variables, ENV) 주입:
DB_HOST,PORT같이 짧은 단어 1~2개짜리 설정일 때 주로 쓴다.- 파드가 부팅될 때 마치 공기가 주입되듯 파드의 리눅스 OS 전역 환경 변수(env) 리스트에 이 단어들이 쓱 스며든다.
- 치명적 단점: 파드가 켜진 상태에서 관리자가 몰래 ConfigMap의
DB_HOST주소를 101번에서 102번으로 수정(Update)했다 치자. 환경 변수는 부팅할 때 단 1번만 공기를 들이마시기 때문에, 주소가 바뀐 줄 모르고 영원히 옛날 101번 주소로 통신하다 터진다. (파드를 껐다 켜야만 새 주소를 빨아들임)
- 볼륨 마운트 (Volume Mount - 파일로 꽂아 넣기):
- 이번엔 짧은 단어가 아니라, 100줄짜리 뚱뚱한
nginx.conf나application.yml설정 파일 텍스트 덩어리를 통째로 파드에 쑤셔 넣어야 할 때 쓴다. - ConfigMap을 '가상의 하드디스크(Volume)'처럼 취급하여, 파드의
/etc/config폴더에 물리적인 파일(.txt) 형태로 찰칵 연결해 준다. - 궁극의 장점 (Hot Reload): 관리자가 밖에서 ConfigMap의 글씨를 수정하면? 쿠버네티스가 약 1분 뒤에 파드 안의
.txt파일을 몰래 스윽 새 글씨로 덮어치기(Sync) 해버린다. 앱이 눈치가 빠르면 **파드를 재부팅(Downtime) 시키지 않고도 런타임에 바뀐 설정값을 실시간으로 반영(Hot Reload)**할 수 있는 엄청난 유연성을 뿜어낸다.
- 이번엔 짧은 단어가 아니라, 100줄짜리 뚱뚱한
📢 섹션 요약 비유: 파드(신입사원) 뇌 속에 회사의 규칙(설정)을 넣어주는 두 가지 주입술입니다. 환경 변수(ENV) 방식은 출근 첫날 신입사원 이마에 도장을 꽝 찍어 각인시키는 것입니다. 한 번 찍히면 퇴사(재부팅) 전까지 지워지지 않아 중간에 규정이 바뀌어도 바보처럼 옛날 룰만 고집합니다. 볼륨 마운트(Volume Mount) 방식은 신입사원 책상 위에 '회사 메뉴얼 바인더 책(파일)'을 올려두는 것입니다. 본사에서 규정이 바뀌면 직원이 밤에 잘 때 비서(K8s)가 들어와 바인더 속지를 최신 버전으로 몰래 스윽 갈아 끼워 둡니다. 신입사원은 다음 날 아침 재부팅(퇴사) 없이도 자연스럽게 새로운 룰을 읽고 똑똑하게 일을 처리할 수 있는 실시간 핫 리로드(Hot Reload)의 마법입니다.