Spring Boot에서는 설정값을 application.yml으로 분리해서 관리한다. Nest.js에서도 설정값을 .env으로 분리해서 관리한다. 별도의 파일로 분리를 해서 관리함으로써 유지보수가 편리해지고 개발, 테스트, 프로덕션과 같은 환경 분리가 편해진다.
쿠버네티스에서는 파드(Pod), 디플로이먼트(Deployment), 서비스(Service)가 각각의 역할을 가지고 있는 것처럼 환경 변수를 관리하는 역할을 가진 오브젝트가 따로 존재한다. 그게 바로 컨피그맵(ConfigMap)이다.
✅ 디플로이먼트(Deployment)에 환경 변수의 정보를 같이 작성했을 때의 단점
spring-deployment.yaml
apiVersion: apps/v1
kind: Deployment
# Deployment 기본 정보
metadata:
name: spring-deployment # Deployment 이름
# Deployment 세부 정보
spec:
replicas: 3 # 생성할 파드의 복제본 개수
selector:
matchLabels:
app: backend-app # 아래에서 정의한 Pod 중 'app: backend-app'이라는 값을 가진 파드를 선택
# 배포할 Pod 정의
template:
metadata:
labels: # 레이블 (= 카테고리)
app: backend-app
spec:
containers:
- name: spring-container # 컨테이너 이름
image: spring-server # 컨테이너를 생성할 때 사용할 이미지
imagePullPolicy: IfNotPresent # 로컬에서 이미지를 먼저 가져온다. 없으면 레지스트리에서 가져온다.
ports:
- containerPort: 8080 # 컨테이너에서 사용하는 포트를 명시적으로 표현
env: # 환경변수 등록
- name: MY_ACCOUNT # Key 값
value: jaeseong # Value 값
- name: MY_PASSWORD
value: pwd1234
위 매니페스트 파일을 보면 디플로이먼트(Deployment)에 대한 내용과 환경 변수에 관련된 내용을 같이 작성했다. 이렇게 환경 변수를 디플로이먼트(Deployment) 내부에 작성하면 다른 환경(개발, 테스트, 프로덕션 등)에서 서버를 실행할 때 유연하게 설정 값을 변경하기 어려워진다.
✅ 컨피그맵(ConfigMap)을 활용해 환경변수 분리하기
ConfigMap 매니페스트 파일 생성하기
spring-config.yaml
apiVersion: v1
kind: ConfigMap
# ConfigMap 기본 정보
metadata:
name: spring-config # ConfigMap 이름
# Key, Value 형식으로 설정값 저장
data:
my-account: jscode
my-password: password123
참고) 컨피그맵이 잘 적용됐는 지 확인하기 위해 my-account, my-password 값 변경
Deployment 매니페스트 파일 수정하기
apiVersion: apps/v1
kind: Deployment
# Deployment 기본 정보
metadata:
name: spring-deployment # Deployment 이름
# Deployment 세부 정보
spec:
replicas: 5 # 생성할 파드의 복제본 개수
selector:
matchLabels:
app: backend-app # 아래에서 정의한 Pod 중 'app: backend-app'이라는 값을 가진 파드를 선택
# 배포할 Pod 정의
template:
metadata:
labels: # 레이블 (= 카테고리)
app: backend-app
spec:
containers:
- name: spring-container # 컨테이너 이름
image: spring-server # 컨테이너를 생성할 때 사용할 이미지
imagePullPolicy: IfNotPresent # 로컬에서 이미지를 먼저 가져온다. 없으면 레지스트리에서 가져온다.
ports:
- containerPort: 8080 # 컨테이너에서 사용하는 포트를 명시적으로 표현
env:
- name: MY_ACCOUNT
valueFrom:
configMapKeyRef:
name: spring-config # ConfigMap의 이름
key: my-account # ConfigMap에 설정되어 있는 Key값
- name: MY_PASSWORD
valueFrom:
configMapKeyRef:
name: spring-config
key: my-password