datakit-operator を使用した dd-java-agent の注入¶
はじめに¶
Kubernetes 環境で Java アプリケーションに APM を導入する際には、dd-java-agent.jar パッケージが必要です。アプリケーションのイメージを改変しないために、一般的な方法としては、デプロイ用の YAML で initContainers を利用し、同じ Pod 内のコンテナ間でストレージを共有して dd-java-agent.jar を使用します。この方法では、すべてのデプロイファイルに同じ initContainers 部分が含まれることになります。
では、これらの共通部分を抽出して、作業量をさらに削減することはできるでしょうか?答えは「はい」です。これには、Guance がオープンソース化した Admission Controller(アドミッションコントローラー) を利用します。datakit-operator は、特定の Pod に対して dd-lib ファイルと environment の注入機能を提供し、現在は Java、Python、JavaScript をサポートしています。
前提条件¶
- Guance のアカウントを作成していること。
- Kubernetes クラスターが利用可能であること。
- DaemonSet 方式で DataKit をデプロイしており、ddtrace コレクターが有効になっていること。
操作手順¶
Warning
本記事の例で使用するバージョン情報は、DataKit 1.5.2、Kubernetes 1.24 です。
1 datakit-operator のデプロイ¶
datakit-operator.yaml をダウンロードし、Kubernetes クラスターにデプロイします。
wget https://static.guance.com/datakit-operator/datakit-operator.yaml
kubectl apply -f datakit-operator.yaml
2 アプリケーションのデプロイ¶
2.1 Dockerfile の作成¶
アプリケーションの Dockerfile を作成します。ここでは、外部から javaagent パッケージを注入しやすくするために、JAVA_OPTS を公開しています。
FROM openjdk:8u292
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
ENV jar service-demo-1.0-SNAPSHOT.jar
ENV workdir /data/app/
RUN mkdir -p ${workdir}
COPY ${jar} ${workdir}
WORKDIR ${workdir}
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${jar} ${PARAMS} "]
作成後、イメージをレジストリにプッシュします。ここでは 172.16.0.246/df-demo/service-log-demo:v1 を直接使用してイメージをプルします。
2.2 アプリケーション YAML の修正¶
アプリケーションの YAML にアノテーションを追加します。
2.3 アプリケーション YAML の修正¶
JAVA_OPTS 環境変数を宣言します。アプリケーションは自動的に注入された /datadog-lib/dd-java-agent.jar パッケージにアクセスできるようになります。起動パラメータについては javaagent パラメータ を参照してください。ここではサービス名を java-demo-service に設定しています。
- name: JAVA_OPTS
value: |-
-javaagent:/datadog-lib/dd-java-agent.jar -Ddd.service.name=java-demo-service -Ddd.tags=container_host:$(POD_NAME) -Ddd.env=dev -Ddd.agent.port=9529
サンプル完全版 java-demo.yaml
apiVersion: v1
apiVersion: apps/v1
kind: Deployment
metadata:
name: guance-deployment
spec:
replicas: 1
selector:
matchLabels:
app: guance-pod
template:
metadata:
labels:
app: guance-pod
annotations:
admission.datakit/java-lib.version: ""
spec:
containers:
- name: guance-demo-container
image: 172.16.0.246/df-demo/service-log-demo:v1
env:
- name: HOST_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
- name: HOST_NAME
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
#- name: DD_AGENT_HOST
# valueFrom:
# fieldRef:
# apiVersion: v1
# fieldPath: status.hostIP
- name: JAVA_OPTS
value: |-
-javaagent:/datadog-lib/dd-java-agent.jar -Ddd.service.name=java-demo-service -Ddd.tags=container_host:$(POD_NAME) -Ddd.env=dev -Ddd.agent.port=9529
ports:
- containerPort: 8090
protocol: TCP
volumeMounts:
- mountPath: /data/app/logs
name: varlog
restartPolicy: Always
volumes:
- name: varlog
emptyDir: {}
2.4 アプリケーションのデプロイ¶
3 トレースのアップロード¶
Pod の IP を取得し、アプリケーションのエンドポイントにアクセスしてトレースデータを生成します。
Guance にログインし、「アプリケーションパフォーマンスモニタリング(APM)」を選択します。サービス名 java-demo-service で検索すると、トレースを確認できます。

