application 설명
프로젝트 구조

Controller

application.yml

application 실행
API 호출 결과

IntelliJ에서 환경변수 주입

Environment variables 부분에 추가 후 실행

API 호출 결과

java -jar -Dcustom.sleep.time=2000 -Dcustom.rate.limit=5 ConfigMapTest-0.0.1-SNAPSHOT.jar
실행 모습

API 호출 결과


FROM openjdk:11
VOLUME /tmp
ADD target/ConfigMapTest-0.0.1-SNAPSHOT.jar app.jar
ENV JAVA_OPTS="-Dfile.encoding=UTF-8"
ENV TZ=Asia/Seoul
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT exec java ${JAVA_OPTS} -jar app.jar
Docker build

생성된 Docker image 확인

docker run commad 실행

API 호출 결과

version: "3" #docker version 3 사용
services: #service들 정의
test-app: #service 이름
image: insanezindol/configmap-test:latest #불러올 image
container_name: configmap-test
environment: # 환경 설정
- CUSTOM_SLEEP_TIME=3000
- CUSTOM_RATE_LIMIT=6
ports: #port 지정
- 8080:8080
docker-compose commad 실행

API 호출 결과

docker login

docker push

docker hub에 image가 업로드 되었는지 확인

apiVersion: apps/v1
kind: Deployment
metadata:
name: configmap-test-web
labels:
app: configmap-test
spec:
replicas: 3
selector:
matchLabels:
app: configmap-test
template:
metadata:
labels:
app: configmap-test
spec:
containers:
- name: configmap-test
image: docker.io/insanezindol/configmap-test:latest
ports:
- containerPort: 8080
env:
- name: CUSTOM_SLEEP_TIME
value: "4000"
- name: CUSTOM_RATE_LIMIT
value: "7"
Deployment 배포

파드가 3개인 레플리카셋을 가진 디플로이먼트 배포 완료

서비스 연결 및 노출을 위한 kubectl 명령어 실행
kubectl expose deployment configmap-test-web --type=NodePort --port=8080

생성된 서비스 확인

로컬에서 minikube에 생성된 서비스에 접근하기 위해서 연결
minikube service configmap-test-web --url

화면에 보이는 url로 접근 (실행될때마다 포트가 랜덤하게 설정됨)
API 호출 결과

다음 테스트를 위해 디플로이먼트 삭제
kubectl delete -n default deployment configmap-test-web

apiVersion: v1
kind: ConfigMap
metadata:
name: springboot-app-env
data:
CUSTOM_SLEEP_TIME: "5000"
CUSTOM_RATE_LIMIT: "10"

컨피그맵 생성 확인

신규 디플로이먼트 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: configmap-test-web
labels:
app: configmap-test
spec:
replicas: 3
selector:
matchLabels:
app: configmap-test
template:
metadata:
labels:
app: configmap-test
spec:
containers:
- name: configmap-test
image: docker.io/insanezindol/configmap-test:latest
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: springboot-app-env

API 호출 결과

컨피그맵 수정

파드 재기동

기존 파드를 삭제하면 레플리카셋에 의해서 새로운 파드가 구동됨

API 호출 결과

간단하게 환경변수를 수정하여 배포하고 싶을때는 코드 수정을 통해 배포하는것보다 k8s에서 제공하고 있는 configmap을 활용하여 수정하고 container 재기동을 하는 방법이 간편하다.