[Kubernetes] 도커허브와 쿠버네티스를 이용한 Spring Boot 애플리케이션 배포: ConfigMap, Deployment, Service 설정
[Kubernetes] 쿠버네티스
도커허브와 쿠버네티스를 이용한 Spring Boot 애플리케이션 배포
1. Spring Boot 프로젝트 생성
Spring Boot로 아주간단한 샘플 프로젝트를 하나 만들어 주겠습니다.
Clean - bootJar를 해서 Jar파일을 제작해 줍니다.
application.yml
spring:
application:
name: api
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: org.mariadb.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
logging:
level:
root: info
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
Dockerfile
# 베이스 이미지
FROM openjdk:17-jdk-alpine
# 컨테이너 내 작업 디렉토리 설정
WORKDIR /app
# JAR 파일을 컨테이너의 /app 디렉토리에 복사
COPY ./build/libs/kubernetes01-0.0.1-SNAPSHOT.jar .
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "kubernetes01-0.0.1-SNAPSHOT.jar"]
# 포트 노출
EXPOSE 8080
docker-compose.yml
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
image: cloudmist/sample:latest
container_name: spring-app-container
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=dev
restart: no
image: 도커아이디/이미지이름:태그버전
2. 도커허브 이미지 업로드
docker login
docker-compose build
docker push cloudmist/sample:latest
도커허브에 image를 push 해줍니다.
도커허브에 이미지가 올라간것을 확인할 수 있습니다.
3. LoadBalancer 설치
https://mlops-for-all.github.io/docs/appendix/metallb/
2. Bare Metal 클러스터용 load balancer metallb 설치 | MLOps for ALL
MetalLB란?
mlops-for-all.github.io
해당글을 참고하여 설치하였습니다.
쿠버네티스가 설치되어있는 Ubuntu에 설치합니다.
1) MetalLB 설치
kubectl get configmap kube-proxy -n kube-system -o yaml | \
grep strictARP
strictARP: false로 출력시 하단 명령어 실행
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system
2) MetalLB 를 설치
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml
정상 설치 확인
kubectl get pod -n metallb-system
4. 쿠버네티스 설정
https://joygotohome.tistory.com/104
[Kubernetes] Pod, LoadBalancer를 사용한 MariaDB 외부 접근 연결 설정
[Kubernetes] 쿠버네티스MariaDB Pod 배포 및 LoadBalancer를 통한 외부 접근 방법 MariaDB Pod 배포 및 LoadBalancer를 통한 외부 접근 방법 1. DB 컨피그맵 생성apiVersion: v1kind: ConfigMapmetadata: name: db-
joygotohome.tistory.com
db관련 설정은 위 글을 확인해 주세요.
1) ConfigMap 생성 : db접속 정보
apiVersion: v1
kind: ConfigMap
metadata:
name: backend-cm # ConfigMap의 이름을 정의합니다. Deployment와 Service에서 이 이름을 참조합니다.
data:
DB_URL: jdbc:mariadb://10.10.10.170:3306/web
DB_USERNAME: root
DB_PASSWORD: qwer1234
SPRING_PROFILES_ACTIVE: dev
DB_URL은 첨부한 링크 글에 있는 DB서비스의 외부 엔드포인트에 있는 주소입니다.
2) Deployment 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-deployment # Deployment의 이름을 정의합니다.
spec:
replicas: 1
selector:
matchLabels:
app: backend # Pod와 연결되는 레이블을 정의합니다. Service에서 이 레이블을 사용하여 Pod를 선택합니다.
template:
metadata:
labels:
app: backend # Pod의 레이블을 정의합니다. 이 레이블은 Service의 selector와 일치해야 합니다.
spec:
containers:
- name: backend-app
image: cloudmist/sample:latest
ports:
- containerPort: 8080
env:
- name: DB_URL
valueFrom:
configMapKeyRef:
name: backend-cm # ConfigMap의 이름을 참조합니다.
key: DB_URL # ConfigMap에서 DB_URL 키의 값을 가져옵니다.
- name: DB_USERNAME
valueFrom:
configMapKeyRef:
name: backend-cm
key: DB_USERNAME
- name: DB_PASSWORD
valueFrom:
configMapKeyRef:
name: backend-cm
key: DB_PASSWORD
- name: SPRING_PROFILES_ACTIVE
valueFrom:
configMapKeyRef:
name: backend-cm
key: SPRING_PROFILES_ACTIVE
3) Service 생성
apiVersion: v1
kind: Service
metadata:
name: backend-service # Service의 이름. 클러스터 외부나 내부에서 애플리케이션에 접근 가능
spec:
selector:
app: backend # Deployment에서 정의한 레이블과 일치해야 함. 이 레이블을 사용하여 Service가 Pod를 선택.
ports:
- protocol: TCP
port: 8080 # 클러스터 내에서 Service가 노출하는 포트입니다.
targetPort: 8080 # Pod의 컨테이너가 사용하는 포트입니다.
type: LoadBalancer # 외부에서 접근할 수 있도록 LoadBalancer 타입을 사용합니다.
쿠버네티스 대시보드를 다시 들어가보면 backend-deployment가 실행중입니다.
파드 - backend 로그를 보면 spring boot 프로젝트가 잘 올라온것을 확인할 수 있습니다.
서비스에 가서 backend-service에 외부 엔드포인트가 생성되어 있습니다.
외부 엔드포인트 주소로 접속 시 Backend 프로젝트가 잘 실행된 화면이 보여집니다.