이미지재빌드없이init_Container를이용하는_방법
▣ Docker Container로 서비스 되는 Java Applicaiton인 경우 다음의 설치 과정을 수행합니다.
▶ [exem-java-agent] 설치 준비
❶ exem-java-agent 설치 패키지
- 컨테이너 환경에 java agent를 설치하기 위한 패키지를 제공하며, 이름은 아래와 같은 규칙으로 생성됩니다.
exem-java-agent-inst_x.x.x.x.tgz
- 파일 구성
configmap.yml: java agent가 사용할 환경변수(exem-java-agent-env)와 설정파일(exem-java-agent-config)을 지정합니다.- exem-java-agent-env 파일 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-env
namespace: {{namespace 지정}}
data:
startup_opt: "-javaagent:/exem/java/lib/exem-java-agent.jar -Dexem.run.on.container=true"
- exem-java-agent-env 파일 예시
exem-java-agent-inst_x.x.x.x.tgz: init containers 로 등록할 Docker Image- exem-java-agent-config 파일 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-java-agent-config
namespace: {{namespace 지정}}
data:
java.conf: |
RECEIVER_ADDR={{수집서버 주소 지정}}
local.advice: |
### 작성방법
# 패키지 및 클래스 구분자는 slash(/)이며 클래스와 메소드는 dot(.)으로 구분합니다.
# 강제포함, 제외, 포함 순으로 높은 우선순위를 갖는다.
# 강제포함은 exclamation mark(!), 제외는 dash(-)를 접두사로 붙여 표기합니다.
# 와일드카드 문자(*)를 포함해 startWith, endWith 연산을 수행할 수 있습니다.
# 로드된 전체 클래스를 대상으로한 설정은 안정성 문제로 인해 동적 적용되지 않습니다.
### 작성예시
# com/inzent.*
# -com/inzent/igate.*
# !com/inzent/igate/util.*
!javax/servlet/http/HttpServlet.*
... (이하 생략)
- exem-java-agent-config 파일 예시
❷ exem-java-agent 이미지 파일
- exem-java-agent의 이미지 이름은 다음과 같은 규칙으로 생성됩니다.
exem-java-agent-inst:x.x.x.x
- 이미지 구성
- exem-java-agent 패키지가 설치된 상태로 이미지가 제공됩니다.
- /exem : exem-java-agent 기동에 필요한 바이너리 및 설정, 로그 디렉토리 등이 포함되어 있습니다.
▶ [exem-java-agent] 설치
◈ deploy yaml에 exem-java-agent를 설치하기 위한 설정 값 추가가 필요합니다.
▷ yaml 파일 예시
기존 고객의 yaml 파일에 하이라이트된 부분을 추가합니다.
spec:
template:
spec:
volumes:
... (생략)
# exem java agent 설치 대상 볼륨
- name: exem-volume
emptyDir: {}
# java agent 설정 파일 볼륨. java agent는 동적적용 불가 옵션 및 advice 설정을 위해 ConfigMap을 볼륨으로 마운트해야 한다.
- name: config-volume-java-agent
configMap:
# 마운트하려는 ConfigMap의 이름을 입력한다.
name: exem-java-agent-config
initContainers:
- name: install-exem-java-agent
image: exem-java-agent-inst:x.x.x
imagePullPolicy: IfNotPresent
volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-java-agent
mountPath: "/exem-config"
readOnly: true
containers:
- name: # application name
... (생략)
volumeMounts:
- name: exem-volume
mountPath: /exem
env:
- name: EXEM_GROUP_ID
value: "{{group id 지정}}"
- name: EXEM_RUN_ON_CONTAINER
value: "true"
- name: EXEMWID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: EXEM_JAVA_AGENT_NAME
value: "{{agent name 지정}}"
# 아래는 [exem-java-agent-env]를 사용하는 tomcat에만 해당
- name: AGENT_OPTS
valueFrom:
configMapKeyRef:
name: exem-java-agent-env
key: startup_opt
- name: CATALINA_OPTS
value: "$AGENT_OPTS -Dexem.agent.name=${EXEM_JAVA_AGENT_NAME}"
... (생략)
◈ 각 설정에 대한 자세한 설명은 아래를 참고합니다.
❶ [exem-java-agent]를 설치할 Pod 공유 볼륨 추가
- Init Container와 Java Application 컨테이너가 공통으로 사용하는 Pod 내 공유 스토리지를 생성합니다.
❷ ConfigMap 볼륨 마운트를 통한 외부 설정 분리

- ConfigMap을 볼륨으로 별도로 마운트하여 Applicaiton 설정을 외부에서 주입할 수 있게 합니다.
- 이미지를 수정하지 않고 설정을 변경이 가능합니다.
❸ [exem-java-agent]를 적용하기 위한 init Container 설정 추가
- exem-java-agent 이미지를 Init Container로 실행합니다.

- exem-java-agent 설치 및 설정 주입을 위한 볼륨 마운트 구성
- Init Container와 Application 컨테이너가 함께 사용하는 공유 볼륨과 ConfigMap 기반 설정 볼륨을 각각 마운트합니다.
- ConfigMap을 볼륨으로 마운트하면(config-volume-java-agent) ConfigMap의 각 key는 파일명으로, value는 해당 파일의 내용으로 매핑되어 지정된 경로(mountPath)에 파일 형태로 생성됩니다.
- Init Container 과정에서 기본 설치 패키지에 ConfigMap에 설정된 내용을 덮어씌운다.
- ConfigMap을 볼륨으로 마운트하면(config-volume-java-agent) ConfigMap의 각 key는 파일명으로, value는 해당 파일의 내용으로 매핑되어 지정된 경로(mountPath)에 파일 형태로 생성됩니다.
❹ Init Container와 기존 Application Container 간 볼륨 공유
- Init Container에서 준비한 데이터를 Main Container에서 사용하기 위해 동일한 exem-volume 볼륨을 마운트합니다.
❺ [exem-java-agent] 적용에 필요한 env(환경변수) 추가

| 환경변수 이름 | 설명 | 비고 |
|---|---|---|
| EXEM_GROUP_ID | WAS Group ID | 설정하지 않으면 "default" 로 설정됨 |
| EXEM_RUN_ON_CONTAINER | 컨테이너 환경에서 동작하는지 여부 설정 해당 옵션을 true로 설정해야만 아래 컨테이너 연계를 위한 env(EXEMWID) 설정이 적용되어 컨테이너와 연결 가능 | 컨테이너 환경에서 동작시 true 설정 On-premise 환경에서 동작시 false 설정(기본값) |
| EXEMWID | 컨테이너 연계를 위한 key | EXEM_RUN_ON_CONTAINER=true로 설정해야만 EXEMWID 설정이 적용되어 컨테이너와 연결 가능 |
| EXEM_JAVA_AGENT_NAME | WAS name | v3.0.24.16 부터 환경변수/config 파일 입력 지원 |
| EXEM_RECEIVER_ADDR | 수집서버(receiver) 주소. ip:port 형식으로 입력합니다. | v3.0.24.16 부터 환경변수 입력 지원 |
- EXEM_GROUP_ID
- jvm 옵션, config 파일로도 설정이 가능합니다.
- 우선순위 : jvm 옵션(-Dexem.groupid=) > 환경변수(EXEM_GROUP_ID) > config 파일(EXEM_GROUP_ID)
- 기본값 : "default"
- EXEM_RUN_ON_CONTAINER
- jvm 옵션, config 파일로도 설정이 가능합니다.
- 우선순위 : jvm 옵션(-Dexem.run.on.container=) > 환경변수(EXEM_RUN_ON_CONTAINER) > config 파일(EXEM_RUN_ON_CONTAINER)
- 기본값 : false
- EXEM_JAVA_AGENT_NAME
- jvm 옵션, config 파일로도 설정이 가능합니다.
- 우선순위 : jvm 옵션(-Dexem.agent.name=) > 환경변수(EXEM_JAVA_AGENT_NAME) > config 파일(EXEM_AGENT_NAME)
- 기본값 : "exem-java-agent"
- EXEM_RECEIVER_ADDR
- jvm 옵션, config 파일로도 설정이 가능합니다.
- 우선순위 : jvm 옵션(-Dexem.receiver.addr=) > 환경변수(EXEM_RECEIVER_ADDR) > config 파일(RECEIVER_ADDR)
- 기본값 X
❻ (Optional) Tomcat 사용 시

- 제공된 exem-java-agent-env 파일을 이용하여 CATALINA_OPTS에 java agent 옵션을 적용합니다.
★ agent name은 환경변수 단독 적용을 지원하지 않는 버전 사용 시, 직접 설정 또는 yaml 설정을 통하여 jvm 옵션에 적용해야 합니다.
-Dexem.agent.name={{agent name 지정}}
★ 수집서버(receiver) 주소는 환경변수 단독 적용을 지원하지 않는 버전 사용 시, 직접 설정 또는 yaml 설정을 통하여 jvm 옵션 또는 config 파일(ConfigMap)에 적용해야 합니다.
- 우선순위 : jvm 옵션(-Dexem.receiver.addr=) > config 파일(RECEIVER_ADDR)
▶ [exem-java-agent] 설치 과정

▶ init-container 수행 작업
❶ exem-java-agent 패키지
- 이미지 내의 /instd-agent 경로에 exem-java-agent 기동에 필요한 바이너리 및 설정 파일 등이 포함되어 있습니다.
❷ 공유 볼륨(exem-volume)으로 패키지 복사
- 설치된 패키지를 실행 컨테이너와 공유되는 EmptyDir 볼륨(/exem)으로 복사합니다.
❸ ConfigMap 설정 치환
- ConfigMap 볼륨(/exem-config)에 정의된 사용자 설정을 기반으로 공유 볼륨(/exem) 내의 기존 파일 내용을 업데이트합니다.
- java.conf의 경우, 파일 전체를 덮어쓰지 않고 ConfigMap 설정에 명시된 옵션에 대해서만 sed 명령어를 사용하여 치환합니다.