springboot+ kubernates 배포 & 트러블 슈팅

Coodori·2024년 4월 5일

Back-end

목록 보기
4/4

스프링부트를 프로젝트를 쿠버네티스 학습한 내용과 함께 적용해보자

https://coodori.notion.site/Kubernetes-2f15740a21a64575b40c0214c574281c?pvs=74

스프링부트 프로젝트 빌드 에러

Could not initialize class org.codehaus.groovy.runtime.InvokerHelper

해당 에러를 검색해보니 자바버전이 맞지 않아서 발생하는 에러라고 한다.

해결하기 위해 맥에 깔려있는 자바버전을 확인해준다.

/usr/libexec/java_home -V
를 통해 확인을 하였으면 이제 깔려있는 버전으로 바꾸어 보자

export JAVA_HOME=$(/usr/libexec/java_home -v 11)

그 후 프로젝트를 빌드하면
BUILD SUCCESSFUL in 37s 성공

Dockerfile 생성

FROM openjdk:11
ARG JAR_FILE=./jpashop2/build/libs/jpashop-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

작성 후
docker build -t [docker 닉네임]/sample .
작성하여 이미지로 빌드

또한 빌드완료한다음 docker hub에 해당 만들어진 이미지를 올려주어야한다.
docker push [docker닉네임]/sample

만약 도커 로그인이 필요하다면 로그인을 해주자

근데 이 과정이 굉장히 오래걸린다.
타 블로그를 참고하여 최적화를 진행해보자

Jib 사용

Jib은 Docker 사용 없이 Java 어플리케이션 컨테이너를 빌드할 수 있게 해주는 Google의 오픈 소스 Java 컨테이너라이저이다.

Dockerfile을 작성하거나 도커를 설치할 필요가 없으며 Maven 및 Gradle의 플러그인으로 동작하며, 플러그인을 설치한 다음 타깃 이미지에 대한 설정과 빌드에 대한 정의만 하면 Java 애플리케이션을 즉시 컨테이너화 할 수 있다.

확실히 두 개의 설정을 보고 이미지로 만드는 과정을 바로 Project에서 몇가지 세팅을 통해서 간소화해주니 빠를 수 밖에 없는 구조다.

그래서 해당으로도 한번 이미지를 배포해보겠습니다

플러그인에 id 'com.google.cloud.tools.jib' version '3.2.0' 추가

아래 설정파일 참고

plugins {
	id 'org.springframework.boot' version '2.4.1'
	id 'io.spring.dependency-management' version '1.0.10.RELEASE'
	id 'com.google.cloud.tools.jib' version '3.2.0'
	id 'java'
}

jib {
	from {
		image = "eclipse-temurin:11-jre"
	}
	to {
		image = "coodori/springK8s"
		tags = ["latest"]
	}
	container {
		jvmFlags = ["-Xms128m", "-Xmx128m"]
	}
}
  1. 플러그인 추가
  2. from 에서 사용되는건 image는 java 버전에 맞는 11
  3. to image는 내가 원하는 이미지 명과 태그

다시 빌드
./gradlew jib

주의사항 to 다음 프로젝트명을 명시할 때 대문자 쓰면 안됩니다.

* What went wrong:
Execution failed for task ':jib'.
> com.google.cloud.tools.jib.plugins.common.BuildStepsExecutionException: Build image failed, perhaps you should make sure your credentials for 'registry-1.docker.io/library/eclipse-temurin'

에러 발견

Task가 가장 기본 task지만 Docker Image를 등록할 Repository에 인증 설정이 되어 있지 않아서 발생

해결방법

https://github.com/GoogleContainerTools/jib/blob/master/docs/faq.md#what-should-i-do-when-the-registry-responds-with-unauthorized

여기에 명시되어있는대로 실행하여 인증하는 4가지 방법중 하나 수행 혹은

./gradlew jibDockerBuild
Jib은 Docker 데몬에 직접 이미지를 빌드할 수도 있습니다.

수행속도는 기존 97초에서 40로 줄어들었다.

사이즈도 기존 상단에 비해 새로 빌드해서 배포한것이 절반 가량 가볍다.

자 이제 쿠버네티스 공부한 걸 활용해보자

Deployment와 Service생성

Pod를 Deployment를 통해 배포하고
외부에서 연결할 수 있도록 Service 만들어주자

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jpashop-k8s
spec:
  selector:
    matchLabels:
      app: jpashop
  replicas: 1

  template:
    metadata:
      labels:
        app: jpashop
    spec:
      containers:
        - name: core
          image: daoh98/sample:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 8080
              protocol: TCP
          resources:
            requests:
              cpu: 500m
              memory: 1000Mi
---
apiVersion: v1
kind: Service
metadata:
  name: jpashop-service
spec:
  type: NodePort 
  ports:
    - port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: jpashop

다 작성한 후 이제 yml을 적용시켜주나

kubctl apply -f deployment.yml

실행되는거 확인 k get all

정상적으로 실행되는 것을 확인할 수 있었고

이제 한번 접속을 해보자

docker 사용하기 때문에

minikube service jpashop-service

를 통해

접속하고

정상적으로 접속이 가능해졌다.

스프링부트랑 쿠버네티스랑 연관시키고 싶은 마음에 해놨던 프로젝트를 찾아보았다.

이번엔 김영한팀장님의 스프링 부트 +jpa 실습하면서 작성한 스프링 부트 코드를 기반으로 서비스를 올려보았다.

다음엔 내가 만든 서비스를 도커 허브에 올려서 쿠버네티스 환경을 구축해보고싶다.

생각보다 많은 에러들을 만나서 많은 검색을 했지만
오히려 이런 경험이 쌓이는거지

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640

0개의 댓글