イメージ再ビルドなしで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 設定が必要です。