백엔드(Spring Boot) 서버에 환경변수 등록해 사용하기

artp·2025년 1월 13일

kubernetes

목록 보기
13/18
post-thumbnail

이번에는 백엔드(Spring Boot) 서버에 환경변수를 등록하여 사용해 보는 실습을 해보도록 하겠습니다.

1. Spring Boot 프로젝트 생성

Spring Initializr에서 새 스프링 부트 프로젝트를 생성합니다.

src - main - java - com.example.kube_spring 경로에 AppController(RestController) 파일을 생성합니다.

아래 코드는 환경변수를 활용하여 애플리케이션 설정 값을 로드하고 반환하는 예제입니다.

package com.example.kube_srping;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AppController {
    @Value("${MY_ACCOUNT:default}")
    private String myAccount;

    @Value("${MY_PASSWORD:default}")
    private String myPassword;

    @GetMapping("/")
    public String home() {
        return "myAccount: " + myAccount + ", myPassword: " + myPassword;
    }
}
  • @RestController
    • Spring MVC에서 Resetful 웹 서비스를 만드는 데 사용됩니다. 이 애너테이션을 사용하면 해당 클래스는 JSON이나 문자열을 직접 HTTP 응답으로 반환합니다.
  • @Value:
    • 스프링 프레임워크의 애너테이션으로, 환경 변수나 애플리케이션 프로퍼티에서 값을 가져와 필드에 주입합니다.
    • 이 코드에서는 MY_ACCOUNTMY_PASSWORD 환경 변수를 읽습니다.
    • 만약 해당 환경 변수가 설정되지 않았다면 기본값 default를 사용합니다.
  • @GetMapping("/")
    • HTTP GET 요청을 처리하는 메서드입니다.
    • 루트 경로(/)로 요청이 들어올 때 home()메서드가 호출됩니다.
  • MY_ACCOUNTMY_PASSWORD 환경 변수는 Kubernetes, Docker 또는 로컬 환경에서 설정할 수 있습니다.
  • 이렇게 설정함으로써 애플리케이션이 민감한 데이터를 외부에서 직접 주입받아 실행할 수 있습니다.

2. Dockerfile 생성

쿠버네티스에서 사용할 이미지를 만들기 위해 Dockerfile을 생성합니다.

FROM openjdk:17-jdk

COPY build/libs/*SNAPSHOT.jar app.jar

ENTRYPOINT ["java", "-jar", "/app.jar"]

3. Kubernetes 리소스 생성

3.1 Deployment 생성

spring-deployment.yaml 파일을 생성합니다.

디플로이먼트는 애플리케이션 컨테이너를 관리하고, 설정한 복제본 수만큼 Pod를 생성 및 유지합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-deployment
spec:
  replicas: 3  # 생성할 Pod의 개수를 지정합니다.
  selector:
    matchLabels:
      app: backend-app  # Pod를 선택하는 라벨입니다.
  template:
    metadata:
      labels:
        app: backend-app  # 생성되는 Pod에 추가될 라벨입니다.
    spec:
      containers:
        - name: spring-container
          image: spring-server  # 사용할 Docker 이미지 이름입니다.
          imagePullPolicy: IfNotPresent  # 이미지를 캐시에서 사용하거나 없을 경우 가져옵니다.
          ports:
            - containerPort: 8080  # 컨테이너 내부에서 열리는 포트입니다.
          env:
            - name: MY_ACCOUNT  # 환경 변수 MY_ACCOUNT를 설정합니다.
              value: artp
            - name: MY_PASSWORD  # 환경 변수 MY_PASSWORD를 설정합니다.
              value: pwd1234
  • replicas: Pod의 복제본 수를 설정합니다. 여기서는 3개의 Pod를 생성합니다.
  • env: Pod 내 컨테이너에서 사용할 환경 변수를 정의합니다.
    • MY_ACCOUNTMY_PASSWORD가 애플리케이션에 전달됩니다.
  • imagePullPolicy: 컨테이너 이미지를 가져오는 조건을 설정합니다. IfNotPresent는 로컬에 이미지가 없을 경우에 레지스트리에서 원격으로 이미지를 가져옵니다.

3.2 Service 생성

spring-service.yaml 파일을 생성합니다.

서비스는 Pod에 외부 트래픽을 라우팅하거나 Pod 간의 통신을 지원합니다.

apiVersion: v1
kind: Service
metadata:
  name: spring-service
spec:
  type: NodePort  # 외부 트래픽을 Node의 특정 포트를 통해 접근할 수 있도록 설정합니다.
  selector:
    app: backend-app  # 트래픽을 전달할 대상 Pod를 선택하는 라벨입니다.
  ports:
    - protocol: TCP  # 사용할 프로토콜을 지정합니다.
      nodePort: 30000  # 클러스터 외부에서 접근할 포트입니다.
      targetPort: 8080  # Pod 내부에서 서비스가 실행되는 포트입니다.
      port: 8080  # Service가 클러스터 내부에서 사용하는 포트입니다.
  • type: NodePort: 클러스터 외부에서 접근할 수 있도록 Node의 특정 포트를 열어줍니다.
  • selector: 라벨을 기준으로 트래픽을 전달할 Pod를 선택합니다.
  • ports:
    • nodePort: 클러스터 외부에서 사용할 포트 번호입니다.
    • targetPort: Pod의 컨테이너 내부에서 서비스가 실행되는 포트를 지정합니다.
    • port: 클러스터 내부에서 Service가 사용하는 포트입니다.

4. Spring Boot 프로젝트 빌드

$ ./gradlew clean build

5. Dockerfile을 바탕으로 이미지 빌드

$ docker build -t spring-server .

6. 매니페스트 파일 기반 실행

$ kubectl apply -f spring-deployment.yaml
$ kubectl apply -f spring-service.yaml

7. 쿠버네티스 리소스 생성 확인

$ kubectl get pods
$ kubectl get deployment
$ kubectl get service



8. 환경변수가 잘 적용됐는지 확인

주소창에 localhost:30000을 입력하여 환경변수가 잘 적용됐는지 확인합니다.

9. 파드 내부로 접속해서 확인

파드 내부로 접속해서 환경변수가 잘 적용됐는지 확인합니다.

$ kubectl get pods # 파드명 확인
$ kubectl exec -it [파드명] -- bash # 파드 내부로 접속

$ env # 환경변수 조회

profile
donggyun_ee

0개의 댓글