メインコンテンツまでスキップ

イメージ再ビルドなしで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-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イメージファイル​

  • 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設定追加​

  1. exem-java-agentイメージをInit Containerとして実行します。

  1. exem-java-agentのインストール及び設定注入のためのボリュームマウント構成

  • Init ContainerとApplicationコンテナが共に使用する共有ボリュームとConfigMapベースの設定ボリュームをそれぞれマウントします。
    • ConfigMapをボリュームとしてマウントすると(config-volume-java-agent)、ConfigMapの各keyはファイル名として、valueは該当ファイルの内容としてマッピングされ、指定されたパス(mountPath)にファイル形態で生成されます。
      • Init Containerの過程で基本インストールパッケージにConfigMapに設定された内容を上書きします。

❹ Init Containerと既存Application Container間のボリューム共有​

  • Init Containerで準備したデータをMain Containerで使用するために同一のexem-volumeボリュームをマウントします。

❺ [exem-java-agent]適用に必要なenv(環境変数)追加​

環境変数名説明備考
EXEM_GROUP_IDWAS Group ID設定しない場合は"default"に設定される
EXEM_RUN_ON_CONTAINERコンテナ環境で動作するかどうかの設定
このオプションをtrueに設定してこそ、以下のコンテナ連携のためのenv(EXEMWID)設定が適用され、コンテナと接続可能
コンテナ環境で動作時はtrue設定
On-premise環境で動作時はfalse設定(デフォルト値)
EXEMWIDコンテナ連携のためのkeyEXEM_RUN_ON_CONTAINER=trueに設定してこそEXEMWID設定が適用され、コンテナと接続可能
EXEM_JAVA_AGENT_NAMEWAS namev3.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コマンドを使用して置換します。