콘텐츠로 이동

Kubernetes 클러스터 애플리케이션에서 SkyWalking을 사용한 분산 추적 데이터 수집


개요

Kubernetes 클러스터에서 애플리케이션은 모두 이미지 형태로 배포됩니다. SkyWalking을 사용하여 애플리케이션의 분산 추적 데이터를 수집할 때, 기존 방식처럼 SkyWalking Agent를 각 애플리케이션 이미지에 직접 포함시켜 배포하면 이미지가 너무 커지고, 이후 SkyWalking 버전을 업그레이드할 때도 불편합니다. 이 문서에서는 공식 SkyWalking 이미지를 사용하여 initContainers 방식으로 애플리케이션에 SkyWalking Agent를 제공하여 분산 추적 데이터를 수집하는 방법을 소개합니다.

전제 조건

DataKit 설치

Input 활성화

SkyWalking 수집기를 활성화하려면 DataKit이 설치된 서버에 /usr/local/datakit/conf.d/skywalking/skywalking.conf 파일을 추가해야 합니다. DaemonSet 방식으로 배포할 때는 먼저 ConfigMap을 정의한 후 파일을 DataKit 컨테이너에 마운트해야 합니다. 이를 위해 DataKit 배포 시 사용한 datakit.yaml 파일이 필요합니다.

skywalking.conf 정의

datakit.yaml 파일의 ConfigMap 리소스에 skywalking.conf 정의를 추가합니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: datakit-conf
  namespace: datakit
data:  
    ## 아래는 새로 추가된 내용입니다
    skywalking.conf: |- 
        [[inputs.skywalking]]
          ## skywalking grpc server listening on address
          address = "0.0.0.0:11800"

skywalking.conf 마운트

datakit.yaml 파일의 volumeMounts 아래에 다음 내용을 추가합니다.

        - mountPath: /usr/local/datakit/conf.d/skywalking/skywalking.conf
          name: datakit-conf
          subPath: skywalking.conf

DataKit 재시작

kubectl delete -f datakit.yaml
kubectl apply -f datakit.yaml

Java 분산 추적 데이터 수집

테스트 애플리케이션 작성

예제에서는 datakit-springboot-demo를 사용하며, 다운로드 후 jar 파일(service-demo-1.0-SNAPSHOT.jar)로 빌드합니다.

이미지 생성

Dockerfile을 작성합니다.

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} "]

이미지를 빌드하고 이미지 레지스트리에 업로드합니다.

docker build -t 172.16.0.246/df-demo/service-demo:v1  .
docker push 172.16.0.246/df-demo/service-demo:v1

애플리케이션 배포

애플리케이션 배포를 위한 skywalking-demo.yaml 파일에서 initContainers를 사용하여 apache/skywalking-java-agent:8.7.0-alpine 이미지를 초기화합니다. 동일한 Pod의 애플리케이션은 skywalking-agent.jar에 접근할 수 있습니다. 그런 다음 JAVA_OPTS에서 jar의 시작 명령을 정의합니다. 여기서 -Dskywalking.agent.service_name=skywalking-demo-master는 애플리케이션의 별칭을 skywalking-demo-master로 정의합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: skywalking-demo-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalking-demo-pod
  template:
    metadata:
      labels:
        app: skywalking-demo-pod
      annotations:
    spec:
      containers:
      - name: skywalking-demo-demo-container
        image: 172.16.0.246/df-demo/service-demo:v1
        env:
        - name: HOST_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.hostIP
        - name: HOST_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName      
        - name: JAVA_OPTS
          value: |-
                -javaagent:/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=skywalking-demo-master  -Dskywalking.collector.backend_service=$(HOST_IP):11800           
        ports:
        - containerPort: 8090
          protocol: TCP
        volumeMounts:
        - mountPath: /skywalking
          name: skywalking-agent
      initContainers:
        - name: agent-container
          image: apache/skywalking-java-agent:8.7.0-alpine
          volumeMounts:
            - name: skywalking-agent   
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]  
      restartPolicy: Always
      volumes:
        - name: skywalking-agent
          emptyDir: {}
kubectl apply -f skywalking-demo.yaml 

애플리케이션 접근

Pod 포트를 확인합니다.

image

애플리케이션을 호출하여 분산 추적 데이터를 생성합니다.

curl 10.244.36.98:8090/ping

애플리케이션 성능 모니터링(APM)

Guance』에 로그인하여 'APM' 모듈로 이동한 후 skywalking-demo-master 애플리케이션을 확인합니다.

image

문서 평가

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