콘텐츠로 이동

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 파일과 환경 변수를 주입하는 기능을 제공하며, 현재 Java, Python 및 JS를 지원합니다.

전제 조건

절차

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을 작성합니다. 여기서는 주로 JAVA_OPTS를 외부에 노출하여 외부에서 javaagent 패키지를 주입할 수 있도록 합니다.

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에 annotation을 추가합니다.

      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를 가져오고 애플리케이션의 API에 접근하여 트레이스 데이터를 생성합니다.

이미지.png

Guance」- 「APM」에 로그인하여 서버 java-demo-service를 기준으로 트레이스를 조회할 수 있습니다.

이미지.png

문서 평가

이 페이지가 도움이 되었나요?