Infra 환경별 Environment 주입 방법

INSANEZINDOL·2024년 2월 14일

seminar

목록 보기
8/9

사전준비

springboot application 생성

  • application 설명

    • yml파일에서 환경변수값을 읽어서 application을 구동합니다.
    • API 호출 시 읽은 환경변수 값을 return 합니다.
  • 프로젝트 구조

  • Controller

  • application.yml

  • application 실행

  • API 호출 결과

    • empty_value_1 / empty_value_2 / 1000 / 4

Local 환경

IntelliJ

  • IntelliJ에서 환경변수 주입

  • Environment variables 부분에 추가 후 실행

    • CUSTOM_SLEEP_TIME=2000;CUSTOM_RATE_LIMIT=5
  • API 호출 결과

    • empty_value_1 / empty_value_2 / 2000 / 5

command

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

  • API 호출 결과

    • empty_value_1 / empty_value_2 / 2000 / 5

Docker 환경

  • Dockerfile 작성
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 commad를 통한 container 실행

  • docker run commad 실행

  • API 호출 결과

    • empty_value_1 / empty_value_2 / 3000 / 6

Docker compose를 통한 container 실행

  • docker-compose.yml 파일 작성
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 호출 결과

    • empty_value_1 / empty_value_2 / 3000 / 6

kubernetes 환경

사전작업

  • docker login

  • docker push

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

minikube 활용

Deployment에서 직접 env 선언

  • Deployment 작성 후 배포
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 호출 결과

    • empty_value_1 / empty_value_2 / 4000 / 7
  • 다음 테스트를 위해 디플로이먼트 삭제

kubectl delete -n default deployment configmap-test-web

ConfigMap 사용한 env 활용

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 호출 결과

    • empty_value_1 / empty_value_2 / 5000 / 10
  • 컨피그맵 수정

    • CUSTOM_SLEEP_TIME : 5000 → 6000
    • CUSTOM_RATE_LIMIT : 10 → 15
  • 파드 재기동

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

  • API 호출 결과

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

0개의 댓글