본문으로 건너뛰기

이미지재빌드없이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_HOMEexem-python-agent 의 HOME 경로고정값 : /exem/python
EXEM_PYTHON_AGENT_NAMEWAS Namepython-k8s-fastapi
EXEM_GROUP_IDWAS Group ID

python_fastapi
EXEM_RECEIVER_ADDRexem-python-agent와 연결할 receiver의 ip:port
ip:port 형식으로 입력
10.20.30.40:9010
EXEM_RUN_ON_CONTAINER
컨테이너 환경에서 동작하는지 여부 설정
해당 옵션을 true로 설정해야만 아래 컨테이너 연계를 위한 env 설정이 적용되어 컨테이너와 연결 가능


true
PYTHONPATHvolumes(pod 스토리지) 경로에 설치된 /exem/exem-python으로 꼭 설정 필요

기존 start_agent 명령어 없이 실행 가능
고정값

EXEMWID컨테이너 연계를 위한 KEY
EXEM_RUN_ON_CONTAINER=true
로 설정해야만

v3.0.19+ Deprecated
EXEM_PYTHON_LOG_MODE
LOG_PATH=console 로 대체
exem-python-agent 로그 생성 방법
POD 화면출력 = 1로 설정
로그 파일로 생성 = 2로 설정
1
  • 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 설정이 필요합니다.