Kubernetes에 Spring Boot 배포와 ConfigMap 설정
Kubernetes 환경에서 Spring Boot 애플리케이션을 배포하고 ConfigMap으로 설정을 관리하는 단계별 예제와 Helm chart 예제
목차
소개
Spring Boot 애플리케이션을 Kubernetes에 배포할 때 설정 관리는 중요하다. ConfigMap을 이용하면 환경별 설정을 코드와 분리해 관리할 수 있다. 이 글은 처음 접하는 개발자도 이해할 수 있도록 Deployment와 ConfigMap 작성, 그리고 간단한 Helm chart 예제까지 순서대로 설명한다.
사전 준비
- Docker 이미지로 빌드된 Spring Boot 애플리케이션
- Kubernetes 클러스터 또는 Minikube
- kubectl과 Helm 설치
Spring Boot 도커라이즈
간단한 Dockerfile 예시다. 자바 애플리케이션을 빌드한 JAR을 컨테이너에 복사해 실행한다.
FROM eclipse-temurin:17-jdk-alpine
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
ConfigMap으로 설정 분리
ConfigMap을 사용하면 application.properties나 외부 설정을 주입할 수 있다. 아래 예제는 애플리케이션의 일부 설정을 ConfigMap으로 관리하는 방법이다.
apiVersion: v1
kind: ConfigMap
metadata:
name: spring-boot-config
data:
application.properties: |
spring.datasource.url=jdbc:mysql://db:3306/mydb
spring.datasource.username=myuser
spring.datasource.password=mypassword
logging.level.root=INFO
Deployment 작성
Deployment는 ConfigMap을 볼륨으로 마운트하거나 환경 변수로 주입할 수 있다. 아래 예시는 properties 파일을 /config/application.properties로 마운트하고, Spring Boot가 해당 위치를 읽도록 설정한 경우다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-deployment
spec:
replicas: 2
selector:
matchLabels:
app: spring-boot
template:
metadata:
labels:
app: spring-boot
spec:
containers:
- name: app
image: your-repo/spring-boot:latest
ports:
- containerPort: 8080
volumeMounts:
- name: config-volume
mountPath: /config
volumes:
- name: config-volume
configMap:
name: spring-boot-config
환경 변수로 설정 주입
특정 속성만 환경 변수로 주입하려면 아래처럼 설정한다.
env:
- name: SPRING_DATASOURCE_URL
valueFrom:
configMapKeyRef:
name: spring-boot-config
key: spring.datasource.url
Service로 노출
클러스터 내부 또는 외부에 애플리케이션을 노출할 Service 예시다.
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service
spec:
selector:
app: spring-boot
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
Helm chart 예제
Helm을 사용하면 재사용 가능한 템플릿으로 배포를 단순화한다. 간단한 values.yaml과 templates/deployment.yaml 스니펫을 확인한다.
values.yaml
replicaCount: 2
image:
repository: your-repo/spring-boot
tag: latest
service:
port: 80
config:
spring.datasource.url: jdbc:mysql://db:3306/mydb
spring.datasource.username: myuser
spring.datasource.password: mypassword
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-deployment
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ .Release.Name }}
spec:
containers:
- name: {{ .Release.Name }}
image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: {{ .Release.Name }}-config
Helm으로 ConfigMap 생성
Helm 템플릿으로 ConfigMap을 만들면 values.yaml의 설정을 자동으로 주입할 수 있다.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
{{- range $key, $value := .Values.config }}
{{ $key }}: "{{ $value }}"
{{- end }}
배포 절차 요약
- 이미지 빌드 및 레지스트리에 푸시
- ConfigMap 생성 또는 Helm values 설정
- Deployment와 Service 적용
- 로그와 이벤트 확인으로 문제 점검
문제 해결 팁
- 로그: kubectl logs로 컨테이너 로그 확인
- 설정 확인: kubectl describe configmap로 내용 검토
- 환경 변수: 컨테이너 내부에서 env 출력으로 주입 여부 확인
결론
ConfigMap으로 설정을 분리하고 Deployment에서 적절히 마운트하거나 env로 주입하면 환경별 관리가 쉬워진다. Helm을 도입하면 반복되는 배포가 단순해진다. 위 예제를 따라하면 spring boot kubernetes 배포와 kubernetes configmap spring boot 적용, spring boot helm chart 예제 사용에 도움이 된다.