背景
本文介紹在 Kubernetes 集羣中,如何通過 Sidecar 模式為 Java 應用無侵入式部署 SkyWalking 探針,並利用 DataKit 內置的 SkyWalking 採集器,一站式收集鏈路數據(Trace)與應用日誌(Log),最終在觀測雲平台實現強大的鏈路與日誌聯動查詢,全面提升可觀測性能力。
部署 SkyWalking 探針
SkyWalking Agent Sidecar 容器
該容器負責提供 skywalking-agent.jar 及其配置文件。
- 環境變量: 配置應用名(
SW_AGENT_NAME) - Volume 掛載: 將 Agent 目錄掛載到共享 Volume
- Sidecar 容器鏡像 dockerfile:
FROM alpine:3.14
# 下載SkyWalking探針
RUN wget -O /tmp/skywalking-agent.tar.gz \
https://archive.apache.org/dist/skywalking/java-agent/8.8.0/apache-skywalking-java-agent-8.8.0.tgz \
&& tar -zxvf /tmp/skywalking-agent.tar.gz -C / \
&& mv /skywalking-agent /agent \
&& rm /tmp/skywalking-agent.tar.gz
# 複製啓動腳本
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
# 創建配置目錄
mkdir -p /agent/config
# 動態生成agent.config
cat <<EOF > /agent/config/agent.config
# 服務名由環境變量傳入
agent.service_name=\${SW_AGENT_NAME:demo}
# DataKit地址由環境變量傳入
collector.backend_service=\${SW_AGENT_COLLECTOR_BACKEND_SERVICES:datakit-service.datakit.svc.cluster.local:11800}
EOF
# 將探針複製到共享卷
cp -r /agent/* /sw-agent/
# 保持容器運行
tail -f /dev/null
業務容器
- 無需修改鏡像: 業務鏡像本身無需包含任何 SkyWalking 依賴。
- JVM 參數注入: 通過 JAVA_TOOL_OPTIONS 環境變量,指向共享 Volume 中的 skywalking-agent.jar。
- Volume 掛載: 同樣掛載共享 Volume,以訪問其中的 Agent 文件。
業務 yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: service-b
spec:
replicas: 1
selector:
matchLabels:
app: service-b
template:
metadata:
labels:
app: service-b
spec:
volumes:
- name: sw-agent
emptyDir: {}
containers:
# 主應用容器
- name: service-b-app
image: zhaoje/service-b:sw3.0
ports:
- containerPort: 8081
volumeMounts:
- name: sw-agent
mountPath: /sw-agent
env:
- name: JAVA_TOOL_OPTIONS
value: "-javaagent:/sw-agent/skywalking-agent.jar"
# SkyWalking邊車容器
- name: sw-agent-sidecar
image: xxx/sw-agent-sidecar:8.8.2
env:
- name: SW_AGENT_NAME
value: "service-b"
volumeMounts:
- name: sw-agent
mountPath: /sw-agent
---
apiVersion: v1
kind: Service
metadata:
name: service-b
spec:
#type: NodePort
selector:
app: service-b
ports:
- protocol: TCP
port: 8081
targetPort: 8080
應用日誌關聯 Trace
本最佳實踐以 log4j2 示例,將 toolkit 依賴包添加到 maven 或者 gradle 中:
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-log4j-2.x</artifactId>
<version>8.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.8.0</version>
</dependency>
apm-toolkit-log4j-2.x: 這是最關鍵的依賴。它為Log4j2這個日誌框架提供了擴展。具體來説,它提供了一個特殊的%tid模式轉換器(Pattern Layout Converter)。正是因為有了這個依賴,您才能在後面的log4j2.xml配置中使用[%tid]來輸出 Trace ID。apm-toolkit-trace: 這個依賴提供了一些有用的 API,例如TraceContext.traceId()用於在代碼中手動獲取當前鏈路的 Trace ID。雖然很多功能由探針自動完成,但如果您想在業務代碼中主動操作追蹤上下文,就需要它。
並在服務目錄下新增 log4j2.xml 定義輸出格式,在示例中的路徑是:/root/service-a/src/main/resources
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<!-- 控制枱輸出 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n"/>
</Console>
<!-- SkyWalking gRPC日誌輸出 -->
<GRPCLogClientAppender name="GrpcLog">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%tid] [%thread] %-5level %logger{36} - %msg%n"/>
</GRPCLogClientAppender>
</Appenders>
<Loggers>
<!-- 設置Spring框架日誌級別 -->
<Logger name="org.springframework" level="WARN" additivity="false">
<AppenderRef ref="Console"/>
<AppenderRef ref="GrpcLog"/>
</Logger>
<Root level="INFO">
<AppenderRef ref="Console"/>
<AppenderRef ref="GrpcLog"/>
</Root>
</Loggers>
</Configuration>
DataKit 開啓 SkyWalking 採集器
部署配置 DataKit
在觀測雲控制枱點擊「集成」-「DataKit」-「Kubernetes」,運行腳本下載。
wget https://static.guance.com/datakit/datakit.yaml
開啓 SkyWalking 採集器
在 volumeMounts 中添加
- mountPath: /usr/local/datakit/conf.d/skywalking/skywalking.conf
name: datakit-conf
subPath: skywalking.conf
readOnly: true
在 configmap 中增加 SkyWalking 配置
apiVersion: v1
kind: ConfigMap
metadata:
name: datakit-conf
namespace: datakit
data:
skywalking.conf: |-
[inputs.skywalking]
endpoints = ["/v3/trace", "/v3/metric", "/v3/logging", "/v3/profiling"]
address = "0.0.0.0:11800"
觀測雲
可以看到鏈路數據正常上報的觀測雲空間
鏈路和日誌也通過 trace_id 串聯起來
在日誌頁面也可以反向查詢鏈路數據
總結
通過本文介紹的 Sidecar 模式與 DataKit 相結合的方案,我們成功實現了:
- 輕量級集成: 以非侵入方式為集羣 Java 應用快速賦予了鏈路追蹤能力。
- 架構簡化: 利用 DataKit 替代了 SkyWalking OAP + Storage 的複雜組件,降低了運維成本。
- 數據融合: 最終在觀測雲平台上實現了鏈路追蹤數據與應用日誌數據的無縫關聯與聯動查詢,形成了完整的可觀測性閉環。