컨테이너 이미지를 생성하기 위한 소스코드에는 DB 나 API 연동을 위한 Hostname, Port 정보가 필요할 수 있으며 Username, Password, Token 등과 같은 보안에 민감한 정보가 있을 수 있습니다.이러한 정보는 보안을 위해 하드코딩 되거나 소스코드 저장소, 컨테이너 이미지 등에 포함되어서는 안됩니다.
보통 이렇게 실행 시에 값을 주입해야 하는 경우 환경 변수 (Environment Variable) 로 주입하거나, Config 파일을 별도로 분리해 작성 후 파일을 특정 디렉토리에 넣어 프로그램이 읽을수 있도록 합니다.
그러나 단순히 컨테이너를 실행하는 간단한 싱글 노드 환경에서는 수동으로 환경 변수나 파일을 주입 할 수 있겠지만, Kubernetes 와 같이 다수의 Node에서 다수의 Pod, 다수의 Container 가 동작하는 환경에서는 값을 주입하기 어려워 집니다.
이와 같은 문제를 Kubernetes 는 ConfigMap 이라는 리소스를 생성하여 사용하는 것으로 해결했습니다.
ConfigMap 은 Kubernetes 에서 생성 가능한 리소스로서, Key=Value 형태의 값을 입력하여 생성 한 후, 실행 될 Container 에 해당 ConfigMap 을 설정하여 ConfigMap 에 정의된 모든 변수, 혹은 일부 변수를 환경 변수로 사용하거나, ConfigMap 에 정의 된 변수를 파일로 접근할 수 있는 디스크 처럼 사용 할 수 있습니다.
# ConfigMap 정의
apiVersion: v1
kind: ConfigMap
metadata:
name: db-config
namespace: kimhae
data:
DB_URL: 172.30.1.70:27017
DB_USER: root
DB_PASS: mongodb
DB_DATABASE: kimhae
DB_COLLECTION: wifi
위 처럼 정의한 ConfigMap 은 아래 처럼 Container 의 Spec 에 정의하여 환경변수로 사용 할 수 있습니다.
# ConfigMap 전체를 환경 변수로 사용하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: dbserver
namespace: kimhae
spec:
replicas: 2
selector:
matchLabels:
app: dbserver
template:
metadata:
labels:
app: dbserver
spec:
containers:
- image: "172.30.1.70/kimhae/dbserver:0.1.1"
name: dbserver
ports:
- containerPort: 5000
# 여기에 정의
envFrom:
- configMapRef:
name: db-config
imagePullSecrets:
- name: harbor
이렇게 생성 된 Container 안에서 환경 변수를 조회하면 아래와 같이 모든 값이 잘 표시되는것을 확인 할 수 있습니다.

ConfigMap 의 일부 변수만 적용하고 싶다면 아래와 같이 지정합니다.
# ConfigMap 일부를 환경 변수로 사용하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: dbserver
namespace: kimhae
spec:
replicas: 2
selector:
matchLabels:
app: dbserver
template:
metadata:
labels:
app: dbserver
spec:
containers:
- image: "172.30.1.70/kimhae/dbserver:0.1.1"
name: dbserver
ports:
- containerPort: 5000
env:
# 컨테이너에서 사용 할 환경 변수 명
- name: DATABASE_NAME
valueFrom:
configMapKeyRef:
# ConfigMap 이름과 가져올 변수의 이름
name: db-config
key: DB_DATABASE
ConfigMap 을 볼륨처럼 사용하여 config 파일로 읽고 싶다면 아래와 같이 지정합니다.
# ConfigMap 을 볼륨처럼 사용하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: dbserver
namespace: kimhae
spec:
replicas: 2
selector:
matchLabels:
app: dbserver
template:
metadata:
labels:
app: dbserver
spec:
containers:
- image: "172.30.1.70/kimhae/dbserver:0.1.1"
name: dbserver
ports:
- containerPort: 5000
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: db-config
위와 같이 설정하면 /etc/config 디렉터리 아래 설정값이 아래와 같이 각각 별도의 파일로 저장됩니다.
