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를 지원합니다.
전제 조건¶
- 먼저 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을 작성합니다. 여기서는 주로 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을 추가합니다.
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를 가져오고 애플리케이션의 API에 접근하여 트레이스 데이터를 생성합니다.
「Guance」- 「APM」에 로그인하여 서버 java-demo-service를 기준으로 트레이스를 조회할 수 있습니다.

