IT관련/Kubernetes

[Kubernetes] 도커허브와 쿠버네티스를 이용한 Spring Boot 애플리케이션 배포: ConfigMap, Deployment, Service 설정

ITtraveler 2024. 8. 21. 16:00

 

 

 

[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 프로젝트가 잘 실행된 화면이 보여집니다.