본문 바로가기
kubernetes

jib 사용시 jvm 옵션을 동적으로 설정하는 방법

by tango0415 2021. 7. 27.

jib 이란?

springboot 어플리케이션을 컨테이너 환경에 빌드, 배포할때 jib plugin 을 사용하면 개발 프로세스를 보다 쉽게 개선할 수 있습니다.

jib 이란? https://tangoblog.tistory.com/10?category=911458

어플리케이션을 개발하다보면 환경별로 옵션을 다르게 배포해야하는 경우도 생기고, 디렉토리를 추가 생성하거나 하는 설정을 해야 할 수 있습니다.

jib 을 사용하면 편리할 수 있지만, 어떤 기능들이 제공되는지 알아야 다양한 상황에 대응할 수 있을 겁니다.

https://github.com/GoogleContainerTools/jib/tree/master/jib-gradle-plugin#extended-usage

문제 상황

jib 을 사용하는 상황에서 어플리케이션의 jvm 옵션을 설정하는 방법은 jvmFlags 옵션을 사용하는 방법이 있습니다.

고정된 값이 아니라 변수를 넣어주기 위해서는 환경변수로 설정된 값을 가져와서 동적으로 사용하는 방법이 있습니다.

jib {
   from {
       image = "jdk:11.0.9.x64"
       auth {
           username = System.getenv("IMAGE_REGISTRY_USERNAME")
           password = System.getenv("IMAGE_REGISTRY_PASSWORD")
      }
  }
   to {
       image = "springboot-demo"
       auth {
           username = System.getenv("IMAGE_REGISTRY_USERNAME")
           password = System.getenv("IMAGE_REGISTRY_PASSWORD")
      }
  }
   container {
       ports = listOf("8080")
       jvmFlags = listOf(
           "-XX:+UseContainerSupport",
           "-XX:MaxRAMPercentage=85.0",
           "-XX:MetaspaceSize=128m",
           "-XX:MaxMetaspaceSize=128m",
           "-XX:+UseG1GC",
           "-verbose:gc",
           "-XX:+PrintGCDetails".
           "-Dspring.profiles.active="+System.getenv("SPRING_PROFILES_ACTIVE")
      )
  }
}

 

문제는 pinpoint 를 적용하기 위해서 몇가지 jvm 옵션을 추가로 넣어주어야 하는데, 이 중에 PodName 을 값으로 사용해야 하는 요구사항에서 생겼습니다.

               -javaagent:${HOME}/pinpoint-agent/pinpoint-bootstrap-2.2.2.jar
               -Dpinpoint.container
               -Dpinpoint.applicationName=$(APPLICATION)-$(PROFILE)
               -Dpinpoint.agentId=$(POD_NAME)
               -Dpinpoint.profiler.profiles.active=$(PROFILE)

 

jib 을 사용하여 빌드하기 위해서는 빌드 순간에 jvmFlags 값을 모두 채워주어야 하는데 PodName 은 빌드 순간에는 알 수 없는 값입니다.

여기선 jib 을 사용할때 jvm 옵션을 배포하는 과정에서 동적으로 설정하는 방법을 알아보겠습니다.

 

해결 방법

jvm 프로세스의 경우 jvmFlags 에 선언되는 값 외에 다른 경로로 옵션을 넣어줄 수 있는 방법이 있습니다.

_JAVA_OPTIONS, JAVA_TOOL_OPTIONS 환경 변수를 선언시 java 커맨드로 실행되는 프로세스에 해당 옵션을 적용시킬 수 있습니다.

apiVersion: apps/v1
kind: Deployment
spec:
template:
  spec:
    containers:
      - name: springboot-demo
        image: '{{ .Values.app.image.name }}:{{ .Values.app.image.tag }}'
        imagePullPolicy: '{{ .Values.app.image.imagePullPolicy }}'
        env:
          - name: SPRING_PROFILES_ACTIVE
            value: "{{ .Values.profile }}"
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
           ########## PINPOINT ##########
          - name: PROFILE
            value: "{{ .Values.profile }}"
          - name: APPLICATION
            value: springboot-demo
          - name: JAVA_TOOL_OPTIONS
            value: >-
              -javaagent:${HOME}/pinpoint-agent/pinpoint-bootstrap-2.2.2.jar
              -Dpinpoint.container
              -Dpinpoint.applicationName=$(APPLICATION)-$(PROFILE)
              -Dpinpoint.agentId=$(POD_NAME)
              -Dpinpoint.profiler.profiles.active=$(PROFILE)

컨테이너 내부에서 java --version 커맨드를 수행해보면 JAVA_TOOL_OPTIONS에 적용된 옵션을 확인할 수 있습니다.

 

 

 

참고