
이번에는 백엔드(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@Value:MY_ACCOUNT와 MY_PASSWORD 환경 변수를 읽습니다.default를 사용합니다.@GetMapping("/") /)로 요청이 들어올 때 home()메서드가 호출됩니다.MY_ACCOUNT와 MY_PASSWORD 환경 변수는 Kubernetes, Docker 또는 로컬 환경에서 설정할 수 있습니다.
쿠버네티스에서 사용할 이미지를 만들기 위해 Dockerfile을 생성합니다.
FROM openjdk:17-jdk
COPY build/libs/*SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

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_ACCOUNT와 MY_PASSWORD가 애플리케이션에 전달됩니다.imagePullPolicy: 컨테이너 이미지를 가져오는 조건을 설정합니다. IfNotPresent는 로컬에 이미지가 없을 경우에 레지스트리에서 원격으로 이미지를 가져옵니다.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가 사용하는 포트입니다.$ ./gradlew clean build

$ docker build -t spring-server .

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

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



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

파드 내부로 접속해서 환경변수가 잘 적용됐는지 확인합니다.
$ kubectl get pods # 파드명 확인
$ kubectl exec -it [파드명] -- bash # 파드 내부로 접속
$ env # 환경변수 조회
