이미지재빌드없이init_Container를이용하는_방법
▣ Docker Container로 서비스되는 Applicaiton인 경우 다음의 설치 과정을 수행합니다.
▣ exem-python-agent v3.0.18.1 ~ 부터 적용 가능합니다. (이전 버전의 경우 (~v3.0.18) 이미지 재빌드 없이 init Container를 이용하는 방법 참고)
▶ [exem-python-agent] 설치 준비
❶ exem-python-agent 이미지 파일
- exem-python-agent의 패키지 이름은 다음과 같은 규칙으로 생성됩니다.
- exem-python-agent:inst_[exem-python-agent 패키지 버전]
예시) exem-python-agent:inst_3.0.19.1
▶ exem-python-agent 이미지에 포함된 내용
- python 버전에 맞게 pip로 exem-python-agent 패키지가 설치된 상태로 이미지가 제공됩니다.
/pkg/exem/python: exem-python-agent 기동에 필요한 설정, 로그 등이 포함되어 있습니다./pkg/exem/exem-python: exem-python-agent 기동에 필요한 패키지와 모듈들이 포함되어 있습니다. exem-python-agent 기동에 사용하는 스크립트도 여기에 포함되어 있습니다.
▶ [exem-python-agent] 설치
위험
◈ deploy yaml에 exem-python-agent를 설치하기 위한 설정 값 추가가 필요합니다.
◈ CURR_TRACE_TXN 옵션 기본 값이 *:3000 로 설정되어 있어 3초 미만 트랜잭션은 수집되지 않습니다.
모든 트랜잭션을 확인하고 싶은 경우 CURR_TRACE_TXN 옵션을 *:0 으로 설정해야 합니다.
yaml 파일 전체 예시
- 기존 고객의 yaml에 하이라이트된 부분을 추가하면 됩니다.
- 초록색 굵은 글씨는 주석입니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-python-agent-config
namespace: exemone-python
data:
local.advice: |
### 작성 형식
# [패키지명]
# 클래스명:메소드명
### 작성 방법
# 추가로 위빙할 메소드를 설정
# 클래스 메소드가 아닌 단순 함수 설정시 클래스명 대신 NONE 으로 작성
# * 을 통해 해당 클래스 또는 모듈의 모든 메소드 위빙 가능
### 작성 예시
# [redis]
# * : *
# [mysql]
# PyMySQL : *
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-k8s-init-fastapi
labels:
app: python-k8s-init-fastapi
namespace: exemone-python
spec:
replicas: 1
selector:
matchLabels:
app: python-k8s-init-fastapi
template:
metadata:
labels:
app: python-k8s-init-fastapi
spec:
volumes:
# exem-python-agent 설치 대상 볼륨
- name: exem-volume
emptyDir: { }
# exem-python-agent 설정 파일 볼륨
- name: config-volume-python-agent
configMap:
# 마운트하려는 ConfigMap의 이름을 입력
name: exem-python-agent-config
initContainers:
- name: install-exem-python-agent
image: exem/exem-python-agent:inst_3.0.19.1
imagePullPolicy: IfNotPresent
volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-python-agent
mountPath: "/exem-config"
readOnly: true
containers:
- name: python-k8s-init-fastapi
image: exem/exem-python-agent:fastapi_sample
imagePullPolicy: Always
volumeMounts:
- name: exem-volume
mountPath: /exem
env:
# 고객이 설정한 PYTHONPATH가 있을 경우 아래 경로 2개를 기존 경로 뒤에 꼭 추가로 설정이 필요
# (추가하지 않을 경우 고객의 이미지 파일 내부에 설정한 PYTHONPATH가 아래 설정한 2개 경로로 덮어씌워짐)
- name: PYTHONPATH
value: "/exem/exem-python:/exem/exem-python/pymon/bootstrap"
- name: EXEM_PYTHON_HOME
value: "/exem/python"
- name: EXEM_GROUP_ID
value: "python"
- name: EXEM_RUN_ON_CONTAINER
value: "true"
- name: EXEMWID
valueFrom:
fieldRef:
fieldPath: metadata.uid
- name: EXEM_PYTHON_AGENT_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: EXEM_RECEIVER_ADDR
value: "10.20.30.40:9010"
ports:
- containerPort: 8000
- 각 설정에 대한 자세한 설명은 아래를 참고합니다.
❶ [exem-python-agent]를 설치 할 volume 추가
- init Container와 기존 python 어플리케이선 컨테이너가 공유하여 사용 할 pod 스토리지를 생성합니다.
- exem-python-agent 이미지에 포함된 exem-python-agent 패키지가 pod 스토리지에 복사됩니다. 이 스토리지에 복사되어야만 기존 python 어플리케이션에 exem-python-agent를 적용하여 기동 할 수 있습니다.
- volumes 예시
volumes:
- name: exem-volume
emptyDir: { }
❷ [exem-python-agent]의 외부 설정을 주입하기 위한 ConfigMap volume 추가
- ConfigMap을 볼륨으로 별도로 마운트하여 Applicaiton 설정을 외부에서 주입할 수 있게 합니다.
- 콜트리 추가를 위한 local.advice 파일 수정이 이미지 수정하지 않고 설정 변경이 가능합니다.
- ConfigMap volumes 예시
volumes:
- name: config-volume-python-agent
configMap:
name: exem-python-agent-config
❸ [exem-python-agent]를 적용하기 위한 init Container 설정 추가
- exem-python-agent 이미지를 init Container로 띄운다.
예시) image: exem/exem-python-agent:inst_3.0.19.1
imagePullPolicy: IfNotPresent
- init Container는 ❶❷ [exem-python-agent]를 설치 할 volume과 설정 주입을 위한 ConfigMap volume에 각각 마운트 합니다.
- ConfigMap을 볼륨으로 마운트하면(config-volume-python-agent) ConfigMap의 각 key는 파일명으로, value는 해당 파일의 내용으로 매핑되어 지정된 경로(mountPath)에 파일 형태로 생성됩니다.
- Init Container 과정에서 기본 설치 패키지에 ConfigMap에 설정된 내용을 덮어씌운다.
예시) volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-python-agent
mountPath: "/exem-config"
readOnly: true
- init Container 예시
initContainers:
- name: init-exem-python-agent
image: exem/exem-python-agent:inst_3.0.19.1
imagePullPolicy: IfNotPresent
volumeMounts:
- name: exem-volume
mountPath: /exem
- name: config-volume-python-agent
mountPath: "/exem-config"
readOnly: true
❹ 기존 python 어플리케이션의 Containers 설정 수정
- 기존 python 어플리케이션 기동하던 Main Container에서 exem-python-agent가 설치된 volumes에 마운트 합니다.
예시) volumeMounts:
- name: exem-volume
mountPath: /exem
- Containers 설정 수정 예시
containers:
- name: python-k8s-fastapi
image: exem/exem-python-agent:fastapi_3.10
imagePullPolicy: Always
volumeMounts:
- name: exem-volume
mountPath: /exem
❺ [exem-python-agent] 적용에 필요한 env(환경 변수) 추가
- exem-python-agent 기동에 반드시 필요한 8개의 환경 변수를
env(환경 변수)로 deploy yaml에 추가해야 합니다.
- 환경 변수 설정
| 환경변수명 | 설명 | 예시 |
|---|---|---|
| EXEM_PYTHON_HOME | exem-python-agent 의 HOME 경로 | 고정값 : /exem/python |
| EXEM_PYTHON_AGENT_NAME | WAS Name | python-k8s-fastapi |
| EXEM_GROUP_ID | WAS Group ID | python_fastapi |
| EXEM_RECEIVER_ADDR | exem-python-agent와 연결할 receiver의 ip:portip:port 형식으로 입력 | 10.20.30.40:9010 |
| EXEM_RUN_ON_CONTAINER | 컨테이너 환경에서 동작하는지 여부 설정 해당 옵션을 true로 설정해야만 아래 컨테이너 연계를 위한 env 설정이 적용되어 컨테이너와 연결 가능 | true |
| PYTHONPATH | volumes(pod 스토리지) 경로에 설치된 /exem/exem-python으로 꼭 설정 필요 기존 start_agent 명령어 없이 실행 가능 | 고정값 |
| EXEMWID | 컨테이너 연계를 위한 KEY EXEM_RUN_ON_CONTAINER=true 로 설정해야만 | |
| v3.0.19+ Deprecated | LOG_PATH=console 로 대체 POD 화면출력 = 1로 설정 로그 파일로 생성 = 2로 설정 |
- env(환경변수) 예시
env:
- name: PYTHONPATH
value: "/exem/exem-python:/exem/exem-python/pymon/bootstrap"
- name: EXEM_PYTHON_HOME
value: "/exem/python"
- name: EXEM_PYTHON_AGENT_NAME
value: "python-k8s-fastapi"
- name: EXEM_GROUP_ID
value: "python_fastapi"
- name: EXEM_RECEIVER_ADDR
value: "10.20.30.40:9010"
- name: EXEM_RUN_ON_CONTAINER
value: "true"
- name: EXEMWID
valueFrom:
fieldRef:
fieldPath: metadata.uid
❻ [필요시에만 수정] 콜트리 추가가 필요한 경우 exem-python-agent-config ConfigMap 설정 수정 필요
동적 적용 불가 설정
yaml 파일 전체 예시의 초록색 굵은 글씨 local.advice 부분의 주석을 참고하여 수정하면 됩니다.
exem-python-agent-config ConfigMap 예시
apiVersion: v1
kind: ConfigMap
metadata:
name: exem-python-agent-config
namespace: exemone-python
data:
local.advice: |
### 작성 형식
# [패키지명]
# 클래스명:메소드명
### 작성 방법
# 추가로 위빙할 메소드를 설정
# 클래스 메소드가 아닌 단순 함수 설정시 클래스명 대신 NONE 으로 작성
# * 을 통해 해당 클래스 또는 모듈의 모든 메소드 위빙 가능
### 작성 예시
# [redis]
# * : *
# [mysql]
# PyMySQL : *
▶ [exem-python-agent] 설치 과정

❶ ConfigMap에 설정한 내용으로 local.advice 파일을 ConfigMap 볼륨에 생성합니다.
콜트리 추가가 필요한 경우ConfigMap에 local.advice를 설정하여 ConfigMap을 볼륨으로 마운트하면(config-volume-python-agent) ConfigMap의 각 key는 파일명으로, value는 해당 파일의 내용으로 매핑되어 지정된 경로(mountPath)에 파일 형태로 생성됩니다.
- ConfigMap 볼륨에 생성된 local.advice 파일은 아래 ❸번 과정에서 initContainer가 exem-volume(pod 스토리지)로 복사합니다.
❷ exem-python-agent 이미지를 initContainer로 기동합니다.
- /pkg/exem 폴더 아래에 exem-python-agent 기동에 필요한 설정 파일, 패키지, 모듈 등이 있습니다.
❸ /pkg/exem 폴더 및 ConfigMap으로 생성한 local.advice 파일을 exem-volume로 복사합니다.
- python 어플리케이션 컨테이너가 exem-python-agent를 적용하여 기동 할 수 있도록 하기 위해 exem-volume(pod 스토리지)에 복사합니다.
- exem-python-agent 이미지 내에서 ENTRYPOINT로 exem-volume(pod 스토리지)에 복사합니다.
❹ Container가 exem-volume에 마운트 하여 exem-python-agent에 접근 할 수 있도록 설정 합니다.
- python 어플리케이션 컨테이너가 exem-python-agent를 적용하여 기동 할 수 있도록 exem-volume(pod 스토리지)에 마운트 합니다.
❺ Container가 python 어플리케이션을 실행합니다.
- Container가 exem-volume(pod 스토리지)에 위치한 /exem/exem-python/pymon이 자동 적용되어 python 어플리케이션을 실행합니다.
- /exem/exem-python/pymon이 자동 적용되기 위해서는 꼭 PYTHONPATH 설정이 필요합니다.