Kubernetes 클러스터 애플리케이션에서 SkyWalking을 사용한 분산 추적 데이터 수집¶
개요¶
Kubernetes 클러스터에서 애플리케이션은 모두 이미지 형태로 배포됩니다. SkyWalking을 사용하여 애플리케이션의 분산 추적 데이터를 수집할 때, 기존 방식처럼 SkyWalking Agent를 각 애플리케이션 이미지에 직접 포함시켜 배포하면 이미지가 너무 커지고, 이후 SkyWalking 버전을 업그레이드할 때도 불편합니다. 이 문서에서는 공식 SkyWalking 이미지를 사용하여 initContainers 방식으로 애플리케이션에 SkyWalking Agent를 제공하여 분산 추적 데이터를 수집하는 방법을 소개합니다.
전제 조건¶
DataKit 설치¶
- <DataKit 설치>
- DataKit 버전 >= 1.4.15
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 재시작¶
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: {}
애플리케이션 접근¶
Pod 포트를 확인합니다.
애플리케이션을 호출하여 분산 추적 데이터를 생성합니다.
애플리케이션 성능 모니터링(APM)¶
『Guance』에 로그인하여 'APM' 모듈로 이동한 후 skywalking-demo-master 애플리케이션을 확인합니다.

