コンテンツにスキップ

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 をサポートしています。

前提条件

操作手順

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 にアノテーションを追加します。

      annotations:
        admission.datakit/java-lib.version: ""

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 アプリケーションのデプロイ

kubectl apply -f java-demo.yaml

3 トレースのアップロード

Pod の IP を取得し、アプリケーションのエンドポイントにアクセスしてトレースデータを生成します。

image.png

Guance にログインし、「アプリケーションパフォーマンスモニタリング(APM)」を選択します。サービス名 java-demo-service で検索すると、トレースを確認できます。

image.png

フィードバック

このページは役に立ちましたか?