Stories

Detail Return Return

雲原生架構下微服務接入 SkyWalking 最佳實踐 - Stories Detail

背景

本文介紹在 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 的複雜組件,降低了運維成本。
  • 數據融合: 最終在觀測雲平台上實現了鏈路追蹤數據與應用日誌數據的無縫關聯與聯動查詢,形成了完整的可觀測性閉環。
user avatar hppyvyv6 Avatar
Favorites 1 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.