jib 이란?
springboot 어플리케이션을 컨테이너 환경에 빌드, 배포할때 jib plugin 을 사용하면 개발 프로세스를 보다 쉽게 개선할 수 있습니다.
어플리케이션을 개발하다보면 환경별로 옵션을 다르게 배포해야하는 경우도 생기고, 디렉토리를 추가 생성하거나 하는 설정을 해야 할 수 있습니다.
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에 적용된 옵션을 확인할 수 있습니다.
참고