간단 개념
이번에는 ConfigMap, Secret 이 두 가지 오브젝트를 다뤄보겠습니다.
개발을 하다보면 상황에 따라 IP 주소나 key 값과 같은 설정 값을 바꿔야 할 때가 있습니다. 여러가지 테스트를 하며 바꿀 수도 있고, 또 개발 환경과 배포 환경을 분리하기 위해 값을 바꿔줄 수도 있는데 각 상황에 맞게 이미지를 따로 두어 관리하기에는 용량의 부담도 있고 번거로우므로! ConfigMap과 Secret을 사용하여 상황에 맞게 환경 변수를 관리합니다.
💡 일반 상수를 담은 ConfigMap과, 키를 담은 Secret을 만들고 Pod 생성 시 이 두 오브젝트들을 연결하면 Container의 환경변수에 이 데이터가 반영됩니다.
마치 개발 시 사용하곤 했던 .env 파일과 비슷하죠?
실습
ConfigMap과 Secret을 사용해보겠습니다. 이미 동작하고 있는 DB 서버에 ConfigMap과 Secret을 사용해 접속하려고 합니다. DB 서버는 로컬 PC에서 동작 중이고, DB 서버에 접속하는 클라이언트는 쿠버네티스 Pod에서 동작합니다.
DB 접속을 위해 필요한 값은 다음과 같아요.
DB_HOST: 172.30.1.4
DB_NAME: menu
DB_PASSWORD: march318tuesday
DB_USER: root
(march318tuesday는 그냥 당시 임의로 만든 값입니다. 3월 18일 화요일이었어서요 호호)
여기서 DB_HOST, DB_NAME, DB_USER와 같은 일반 상수값은 ConfigMap으로, DB_PASSWORD와 같은 key값은 Secret으로 관리합니다.
ConfigMap 설정 : <db-config.yaml/>
apiVersion: v1
kind: ConfigMap
metadata:
name: db-config
data:
DB_HOST: "172.30.1.4"
DB_NAME: "menu"
DB_USER: "root"
Secret 설정 : <db-secret.yaml/>
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
DB_PASSWORD: bWFyY2gzMTh0dWVzZGF5
❗️여기서 DB_PASSWORD 값은 비밀번호인 'march318tuesday'를 base64로 인코딩한 값입니다. Kubernetes Secret은 base64로 인코딩된 값을 data로 가져요.
이 값들을 각각 apply 해줍니다.
$ kubectl apply -f db-config.yaml
$ kubectl apply -f db-secret.yaml
ConfigMap, Secret 오브젝트를 사용하는 Pod 생성
apiVersion: v1
kind: Pod
metadata:
name: get-menu-pod
spec:
containers:
- name: get-menu
image: nolzaheo/get-menu-app:latest
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: db-config
key: DB_HOST
- name: DB_NAME
valueFrom:
configMapKeyRef:
name: db-config
key: DB_NAME
- name: DB_USER
valueFrom:
configMapKeyRef:
name: db-config
key: DB_USER
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: DB_PASSWORD
command: ["python3", "get_menu.py"]
- Pod의 get-menu라는 이름의 컨테이너는 제가 미리 만들어 DockerHub에 올려두었던 이미지를 내려받아 사용합니다.
- (DB_HOST, DB_NAME, DB_USER) 환경변수는 db-config에서, (DB_PASSWORD) 환경변수는 db-secret에서 가져오고 있어요.
- 위의 환경변수 값들이 제대로 적용됐다면, python3 get_menu.py를 통해 DB 값을 읽어올 수 있을거예요.
$ kubectl apply -f get-menu-pod.yaml
이제 이렇게 하면 생성된 Pod를 확인할 수 있어요. 대시보드로 확인해볼게요.

각 환경변수 값이 잘 적용되어있죠?
아래와 같이 데이터베이스 값도 잘 읽어옵니다.

일단 ConfigMap과 Secret을 사용하는 부분만 보여드렸는데, pod에서 사용하는 이미지와, 이미지에 포함된 python 코드가 궁금하실 분들을 위해 아래 함께 정리해두었습니다.
Dockerfile (nolzaheo/get-menu-app:latest)
# 1. Python 이미지 기반으로 시작 (Alpine 사용)
FROM python:3.9-alpine
# 2. 작업 디렉토리 설정
WORKDIR /app
# 3. 로컬의 app.py 파일을 컨테이너의 /app 디렉토리로 복사
COPY get_menu.py /app/
# 4. MariaDB 클라이언트 및 MySQL Connector 설치
RUN apk update && apk add mariadb-client \
&& pip install mysql-connector-python
# 5. 실행할 명령어 설정
CMD ["python3", "get_menu.py"]
<get_menu.py/>
import time
import os
import mysql.connector
from mysql.connector import Error
db_host = os.getenv('DB_HOST')
db_name = os.getenv('DB_NAME')
db_user = os.getenv('DB_USER')
db_password = os.getenv('DB_PASSWORD')
while True:
try:
connection = mysql.connector.connect(
host=db_host,
user=db_user,
password=db_password,
database=db_name
)
if connection.is_connected():
print(f"Successfully connected to the database {db_name}")
cursor = connection.cursor()
cursor.execute("SELECT * FROM menu_items")
rows = cursor.fetchall()
for row in rows:
print(row)
cursor.close()
connection.close()
except Error as e:
print(f"Error: {e}")
print("Sleeping for 30 seconds before next query...")
time.sleep(30) # 30초 대기 후 다시 실행
$ docker build -t get-menu-app .
$ docker tag get-menu-app nolzaheo/get-menu-app:latest
$ docker push nolzaheo/get-menu-app:latest
위의 코드를 보시면 os.getenv()로 그냥 환경변수 부르듯 가져와서 쓰고 있어요!
ConfigMap과 Secret의 사용법을 익히시는데 도움이 됐길 바라며... ^_^
'Cloud > k8s' 카테고리의 다른 글
[k8s] Mac M1 UTM Ubuntu22.04 쿠버네티스 구축 (0) | 2025.04.29 |
---|---|
[k8s] Pod 생성 및 볼륨 설정 (1) | 2025.03.13 |