Kubernetes — skywalking + banyanDB APM监控部署

Kubernetes — skywalking + banyanDB APM监控部署

介绍

Apache SkyWalking 是一个应用性能监控(APM)系统,用于分布式系统的监控、追踪和诊断。它提供了完整的可观测性解决方案,帮助开发者和运维人员快速定位和解决分布式系统中的性能问题。

组件说明

  • OAP (Observability Analysis Platform): 核心分析平台,负责数据收集、分析和存储
  • UI: Web 界面,用于可视化和查询监控数据
  • BanyanDB: 高性能时序数据库,作为 SkyWalking 的存储后端
  • etcd: 分布式键值存储,BanyanDB 使用它来存储元数据

功能特性

  • 分布式追踪: 自动收集和关联分布式系统的调用链,支持跨服务追踪
  • 服务拓扑: 可视化服务之间的依赖关系,实时展示服务调用图
  • 性能指标: 收集服务的性能指标(延迟、吞吐量、错误率等)
  • 日志关联: 将日志与追踪数据关联,通过 TraceID 快速定位问题
  • 告警机制: 支持基于指标的告警规则配置

部署

前置要求

在开始部署之前,请确保满足以下要求:

  1. Kubernetes 集群: 版本 1.20+
  2. 命名空间: 已创建 logging 命名空间(或根据实际情况修改)
  3. 存储: 确保节点有足够的存储空间(建议至少 10Gi)
  4. 网络: 确保 Pod 之间可以正常通信

提示: 本文档中的所有资源都部署在 logging 命名空间中,如需使用其他命名空间,请修改相应的 YAML 文件。

部署 BanyanDB

BanyanDB 是 SkyWalking 的存储后端,需要先部署 BanyanDB 和 etcd。

1. 部署 etcd

etcd 用于存储 BanyanDB 的元数据。

创建 etcd 持久化存储卷

创建文件 banyandb-etcd-pv.yaml:

 1apiVersion: v1
 2kind: PersistentVolume
 3metadata:
 4  name: banyandb-etcd-data-pv
 5spec:
 6  capacity:
 7    storage: 5Gi # 存储大小
 8  accessModes:
 9    - ReadWriteOnce
10  persistentVolumeReclaimPolicy: Retain
11  storageClassName: host-banyandb-etcd
12  hostPath:
13    path: /data/banyandb-etcd # 存储位置
14    type: DirectoryOrCreate
15  nodeAffinity:
16    required:
17      nodeSelectorTerms:
18        - matchExpressions:
19            - key: kubernetes.io/hostname
20              operator: In
21              values: 
22                - worker-1  # 修改为你要存储的节点名称

注意: 请根据实际情况修改 worker-1 为你的节点名称,并确保该节点存在 /data/banyandb-etcd 目录或具有创建权限。

创建 etcd 持久化存储声明

创建文件 banyandb-etcd-pvc.yaml:

 1apiVersion: v1
 2kind: PersistentVolumeClaim
 3metadata:
 4  name: banyandb-etcd-data
 5  namespace: logging
 6spec:
 7  accessModes:
 8    - ReadWriteOnce
 9  resources:
10    requests:
11      storage: 5Gi  #存储大小
12  storageClassName: host-banyandb-etcd

创建 etcd 服务

创建文件 banyandb-etcd-service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: banyandb-etcd
 5  namespace: logging
 6spec:
 7  clusterIP: None
 8  ports:
 9    - name: client
10      port: 2379
11      targetPort: 2379
12    - name: peer
13      port: 2380
14      targetPort: 2380
15  selector:
16    app: banyandb-etcd

创建 etcd StatefulSet

创建文件 banyandb-etcd-statefulset.yaml:

 1apiVersion: apps/v1
 2kind: StatefulSet
 3metadata:
 4  name: banyandb-etcd
 5  namespace: logging
 6spec:
 7  serviceName: banyandb-etcd
 8  replicas: 1
 9  selector:
10    matchLabels:
11      app: banyandb-etcd
12  template:
13    metadata:
14      labels:
15        app: banyandb-etcd
16    spec:
17      containers:
18        - name: etcd
19          image: quay.io/coreos/etcd:v3.5.9
20          ports:
21            - name: client
22              containerPort: 2379
23            - name: peer
24              containerPort: 2380
25          env:
26            - name: ETCD_NAME
27              value: "banyandb-etcd-0"
28            - name: ETCD_DATA_DIR
29              value: /etcd-data
30            - name: ETCD_LISTEN_CLIENT_URLS
31              value: "http://0.0.0.0:2379"
32            - name: ETCD_ADVERTISE_CLIENT_URLS
33              value: "http://banyandb-etcd-0.banyandb-etcd:2379"
34            - name: ETCD_LISTEN_PEER_URLS
35              value: "http://0.0.0.0:2380"
36            - name: ETCD_INITIAL_ADVERTISE_PEER_URLS
37              value: "http://banyandb-etcd-0.banyandb-etcd:2380"
38            - name: ETCD_INITIAL_CLUSTER
39              value: "banyandb-etcd-0=http://banyandb-etcd-0.banyandb-etcd:2380"
40            - name: ETCD_INITIAL_CLUSTER_TOKEN
41              value: "banyandb-etcd-cluster"
42            - name: ETCD_INITIAL_CLUSTER_STATE
43              value: "new"
44          volumeMounts:
45            - name: data
46              mountPath: /etcd-data
47          livenessProbe:
48            httpGet:
49              path: /health
50              port: 2379
51            initialDelaySeconds: 30
52            periodSeconds: 30
53            timeoutSeconds: 5
54            failureThreshold: 3
55          readinessProbe:
56            httpGet:
57              path: /health
58              port: 2379
59            initialDelaySeconds: 10
60            periodSeconds: 10
61            timeoutSeconds: 5
62            failureThreshold: 3
63          resources:
64            requests:
65              memory: "256Mi"
66              cpu: "100m"
67            limits:
68              memory: "512Mi"
69              cpu: "500m"
70      volumes:
71        - name: data
72          persistentVolumeClaim:
73            claimName: banyandb-etcd-data

2. 部署 BanyanDB

创建 BanyanDB 持久化存储卷

创建文件 banyandb-pv.yaml:

 1apiVersion: v1
 2kind: PersistentVolume
 3metadata:
 4  name: banyandb-data-pv
 5spec:
 6  capacity:
 7    storage: 5Gi #存储大小
 8  accessModes:
 9    - ReadWriteOnce
10  persistentVolumeReclaimPolicy: Retain
11  storageClassName: host-banyandb
12  hostPath:
13    path: /data/banyandb #存储位置
14    type: DirectoryOrCreate
15  nodeAffinity:
16    required:
17      nodeSelectorTerms:
18        - matchExpressions:
19            - key: kubernetes.io/hostname
20              operator: In
21              values:
22                - worker-1  # 修改为你要存储的节点名称

注意: 请根据实际情况修改 worker-1 为你的节点名称,并确保该节点存在 /data/banyandb 目录或具有创建权限。

创建 BanyanDB 持久化存储声明

创建文件 banyandb-pvc.yaml:

 1apiVersion: v1
 2kind: PersistentVolumeClaim
 3metadata:
 4  name: banyandb-data
 5  namespace: logging
 6spec:
 7  accessModes:
 8    - ReadWriteOnce
 9  resources:
10    requests:
11      storage: 5Gi #存储大小
12  storageClassName: host-banyandb

创建 BanyanDB 服务

创建文件 banyandb-service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: banyandb
 5  namespace: logging
 6spec:
 7  ports:
 8    - name: grpc
 9      port: 17912
10      targetPort: 17912
11    - name: http
12      port: 17913
13      targetPort: 17913
14  selector:
15    app: banyandb

创建 BanyanDB StatefulSet

创建文件 banyandb-statefulset.yaml:

 1apiVersion: apps/v1
 2kind: StatefulSet
 3metadata:
 4  name: banyandb
 5  namespace: logging
 6spec:
 7  serviceName: banyandb
 8  replicas: 1
 9  selector:
10    matchLabels:
11      app: banyandb
12  template:
13    metadata:
14      labels:
15        app: banyandb
16    spec:
17      initContainers:
18        - name: wait-for-etcd
19          image: busybox:1.35
20          command: ['sh', '-c']
21          args:
22            - |
23              until nc -z banyandb-etcd 2379; do
24                echo "Waiting for etcd to be ready..."
25                sleep 2
26              done
27              echo "etcd is ready!"              
28      containers:
29        - name: banyandb
30          image: apache/skywalking-banyandb:0.9.0
31          args: ["standalone"]
32          ports:
33            - name: grpc
34              containerPort: 17912
35            - name: http
36              containerPort: 17913
37          env:
38            - name: BANYANDB_STANDALONE
39              value: "true"
40            - name: BANYANDB_ETCD_ENDPOINTS
41              value: "http://banyandb-etcd:2379"
42            - name: BANYANDB_GRPC_HOST
43              value: "0.0.0.0"
44            - name: BANYANDB_GRPC_PORT
45              value: "17912"
46            - name: BANYANDB_HTTP_HOST
47              value: "0.0.0.0"
48            - name: BANYANDB_HTTP_PORT
49              value: "17913"
50            - name: BANYANDB_DATA_DIR
51              value: "/data"
52          livenessProbe:
53            tcpSocket:
54              port: 17913
55            initialDelaySeconds: 60
56            periodSeconds: 30
57            timeoutSeconds: 5
58            failureThreshold: 3
59          readinessProbe:
60            tcpSocket:
61              port: 17913
62            initialDelaySeconds: 30
63            periodSeconds: 10
64            timeoutSeconds: 5
65            failureThreshold: 3
66          resources:
67            requests:
68              memory: "512Mi"
69              cpu: "250m"
70            limits:
71              memory: "2Gi"
72              cpu: "1000m"
73          volumeMounts:
74            - name: data
75              mountPath: /data
76      volumes:
77        - name: data
78          persistentVolumeClaim:
79            claimName: banyandb-data

3. 部署 BanyanDB 组件

在包含所有 BanyanDB YAML 文件的目录下执行:

1kubectl apply -f .

验证部署状态:

1# 检查 etcd 状态
2kubectl get pods -n logging | grep banyandb-etcd
3
4# 检查 BanyanDB 状态
5kubectl get pods -n logging | grep banyandb
6
7# 查看 BanyanDB 日志
8kubectl logs -n logging -l app=banyandb --tail=50

提示: 确保 etcd 和 BanyanDB 都处于 Running 状态后再继续部署 SkyWalking。


部署 SkyWalking

1. 部署 OAP Server

OAP (Observability Analysis Platform) 是 SkyWalking 的核心组件,负责数据收集、分析和存储。

创建 OAP Deployment

创建文件 oap-deployment.yaml:

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: skywalking-oap
 5  namespace: logging
 6spec:
 7  replicas: 1
 8  selector:
 9    matchLabels:
10      app: skywalking-oap
11  template:
12    metadata:
13      labels:
14        app: skywalking-oap
15    spec:
16      initContainers:
17        - name: wait-for-banyandb
18          image: busybox:1.35
19          command: ['sh', '-c']
20          args:
21            - |
22              echo "Waiting for BanyanDB to be ready..."
23              # 等待 BanyanDB 服务可用
24              until nc -z banyandb.logging.svc.cluster.local 17912; do
25                echo "Waiting for BanyanDB gRPC port..."
26                sleep 3
27              done
28              # 额外等待几秒,确保 gRPC 服务完全启动
29              sleep 5
30              echo "BanyanDB is ready!"              
31      containers:
32        - name: oap
33          image: apache/skywalking-oap-server:10.3.0
34          ports:
35            - containerPort: 11800
36            - containerPort: 12800
37          env:
38            - name: SW_STORAGE
39              value: banyandb
40            - name: SW_STORAGE_BANYANDB_TARGETS
41              value: banyandb:17912
42            - name: SW_STORAGE_BANYANDB_GRPC_TLS_ENABLED
43              value: "false"
44            - name: JAVA_OPTS
45              value: "-Xms1g -Xmx1g"
46            # 启用 Log Receiver 模块 - 接收来自应用的日志
47            - name: SW_RECEIVER_LOGGING
48              value: default
49            # 启用 Log Analyzer 模块 - 分析日志数据
50            - name: SW_LOG_ANALYZER
51              value: default
52            # LAL 文件配置
53            - name: SW_LOG_LAL_FILES
54              value: default
55            # 日志接收器 gRPC 处理器配置(与 agent 9.5.0 的 GRPCLogClientAppender 兼容)
56            - name: SW_RECEIVER_LOGGING_DEFAULT_HANDLERS
57              value: grpc
58            # 日志接收器 gRPC 服务配置
59            - name: SW_RECEIVER_LOGGING_DEFAULT_GRPC_HOST
60              value: 0.0.0.0
61            - name: SW_RECEIVER_LOGGING_DEFAULT_GRPC_PORT
62              value: "11800"
63            # 日志接收器 gRPC 最大消息大小(支持大日志)
64            - name: SW_RECEIVER_LOGGING_DEFAULT_GRPC_MAX_MESSAGE_SIZE
65              value: "10485760"
66            # 日志接收器 gRPC 最大连接数
67            - name: SW_RECEIVER_LOGGING_DEFAULT_GRPC_MAX_CONCURRENT_STREAMS
68              value: "100"
69          livenessProbe:
70            httpGet:
71              path: /healthcheck
72              port: 12800
73            initialDelaySeconds: 60
74            periodSeconds: 30
75            timeoutSeconds: 5
76            failureThreshold: 3
77          readinessProbe:
78            httpGet:
79              path: /healthcheck
80              port: 12800
81            initialDelaySeconds: 30
82            periodSeconds: 10
83            timeoutSeconds: 5
84            failureThreshold: 3

说明:

  • SW_STORAGE=banyandb: 使用 BanyanDB 作为存储后端
  • SW_RECEIVER_LOGGING: 启用日志接收功能
  • SW_LOG_ANALYZER: 启用日志分析功能
  • JAVA_OPTS: 设置 JVM 内存参数,根据实际需求调整

创建 OAP Service

创建文件 oap-service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: skywalking-oap
 5  namespace: logging
 6spec:
 7  ports:
 8    - name: grpc
 9      port: 11800
10    - name: http
11      port: 12800
12  selector:
13    app: skywalking-oap

2. 部署 SkyWalking UI

创建 UI Deployment

创建文件 ui-deployment.yaml:

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: skywalking-ui
 5  namespace: logging
 6spec:
 7  replicas: 1
 8  selector:
 9    matchLabels:
10      app: skywalking-ui
11  template:
12    metadata:
13      labels:
14        app: skywalking-ui
15    spec:
16      containers:
17        - name: ui
18          image: apache/skywalking-ui:10.3.0
19          ports:
20            - containerPort: 8080
21          env:
22            - name: SW_OAP_ADDRESS
23              value: http://skywalking-oap.logging.svc.cluster.local:12800

创建 UI Service

创建文件 ui-service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: skywalking-ui
 5  namespace: logging
 6spec:
 7  type: ClusterIP
 8  selector:
 9    app: skywalking-ui
10  ports:
11    - port: 8080
12      targetPort: 8080
13      protocol: TCP
14      name: http

创建 Ingress(可选)

如果需要通过域名访问 SkyWalking UI,创建文件 ingress.yaml:

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: skywalking-ingress
 5  namespace: logging
 6  annotations:
 7    traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
 8    traefik.ingress.kubernetes.io/router.tls: "true"
 9spec:
10  tls:
11    - hosts:
12        - skywalking-dev.jobcher.com        #改为你自己的域名
13      secretName: jobcher-com-tls           #改为你自己的证书
14  rules:
15    - host: skywalking-dev.jobcher.com      #改为你自己的域名
16      http:
17        paths:
18          - path: /
19            pathType: Prefix
20            backend:
21              service:
22                name: skywalking-ui
23                port:
24                  number: 8080

注意:

  • 请将 skywalking-dev.jobcher.com 替换为你的实际域名
  • 请将 jobcher-com-tls 替换为你的 TLS 证书 Secret 名称
  • 如果使用其他 Ingress Controller(如 Nginx),请相应修改 annotations

3. 部署 SkyWalking 组件

在包含所有 SkyWalking YAML 文件的目录下执行:

1kubectl apply -f .

验证部署状态:

1# 检查 OAP 状态
2kubectl get pods -n logging | grep skywalking-oap
3
4# 检查 UI 状态
5kubectl get pods -n logging | grep skywalking-ui
6
7# 查看 OAP 日志
8kubectl logs -n logging -l app=skywalking-oap --tail=50

提示: 如果使用 Ingress,部署完成后可以通过配置的域名访问 SkyWalking UI。也可以通过 kubectl port-forward 临时访问:

1kubectl port-forward -n logging svc/skywalking-ui 8080:8080

然后访问 http://localhost:8080


配置 SkyWalking Agent

要在 Java 应用中集成 SkyWalking,需要配置 SkyWalking Agent。本节以 Spring Boot 应用为例。

1. 添加 Maven 依赖

在项目的 pom.xml 文件中添加以下依赖:

 1    <!-- Logback 1.2.3 for SkyWalking compatibility -->
 2    <dependency>
 3      <groupId>ch.qos.logback</groupId>
 4      <artifactId>logback-classic</artifactId>
 5      <version>1.2.3</version>
 6    </dependency>
 7    <dependency>
 8      <groupId>ch.qos.logback</groupId>
 9      <artifactId>logback-core</artifactId>
10      <version>1.2.3</version>
11    </dependency>
12
13    <!-- SkyWalking Logback Toolkit for trace ID -->
14    <dependency>
15      <groupId>org.apache.skywalking</groupId>
16      <artifactId>apm-toolkit-logback-1.x</artifactId>
17      <version>9.5.0</version>
18    </dependency>

说明:

  • Logback 1.2.3 版本与 SkyWalking Agent 9.5.0 兼容
  • apm-toolkit-logback-1.x 用于在日志中自动添加 TraceID

2. 配置 Logback

修改 logback-spring.xml 文件,添加 SkyWalking 日志 Appender 和 TraceID 支持:

 1<!-- SkyWalking Log Appender -->
 2	<appender name="SKYWALKING" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
 3		<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
 4			<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
 5				<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
 6			</layout>
 7		</encoder>
 8	</appender>
 9
10    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
11        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
12        <level>Info</level>
13        </filter>
14        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
15        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
16            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} :%line [%tid] - %msg%n</pattern>
17        </layout>
18        </encoder>
19    </appender>
20
21    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
22        <file>${log.path}</file>
23        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
24        <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zip</fileNamePattern>
25        </rollingPolicy>
26        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
27        <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
28            <pattern>%date %level [%thread] %logger{36} [%file : %line] [%tid] %msg%n</pattern>
29        </layout>
30        </encoder>
31    </appender>
32
33<!-- 其他配置内容 ... -->
34
35  <root level="info">
36    <appender-ref ref="SKYWALKING"/>  <!-- 添加 SkyWalking 日志 Appender -->
37    <appender-ref ref="console"/>
38    <appender-ref ref="file"/>
39  </root>

说明:

  • SKYWALKING Appender 会将日志发送到 SkyWalking OAP
  • TraceIdPatternLogbackLayoutTraceIdMDCPatternLogbackLayout 会在日志中自动添加 TraceID
  • 日志格式中的 [%tid][%X{tid}] 会显示追踪 ID

3. Kubernetes 部署配置

创建应用 Deployment

创建文件 deployment.yaml:

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: java-skywalking-test
 5  namespace: logging
 6spec:
 7  replicas: 1
 8  selector:
 9    matchLabels:
10      app: java-skywalking-test
11  template:
12    metadata:
13      labels:
14        app: java-skywalking-test
15    spec:
16      initContainers:
17        - name: skywalking-agent
18          image: apache/skywalking-java-agent:9.5.0-java8
19          command: ['sh', '-c']
20          args:
21            - |
22              cp -r /skywalking/agent /shared/              
23          volumeMounts:
24            - name: skywalking-agent
25              mountPath: /shared
26      containers:
27        - name: java-skywalking-test
28          image: dev/java-skywalking-test:latest  # 修改为你的应用镜像地址
29          imagePullPolicy: Always
30          ports:
31            - containerPort: 9080
32              name: http
33          env:
34            # SkyWalking Agent 配置(通过 JAVA_TOOL_OPTIONS)
35            - name: JAVA_TOOL_OPTIONS
36              value: >-
37                -javaagent:/skywalking/agent/skywalking-agent.jar
38                -DSW_AGENT_NAME=java-skywalking-test
39                -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking-oap.logging.svc.cluster.local:11800
40                -DSW_LOGGING_LEVEL=INFO
41                -DSW_AGENT_AUTHENTICATION=
42                -DSW_LOGGING_ENABLED=true
43                -DSW_LOGGING_FILE_NAME=skywalking-api.log
44                -DSW_LOGGING_DIR=/tmp/logs
45                -DSW_AGENT_SAMPLE_N_PER_3_SECS=-1
46                -DSW_AGENT_FORCE_RECONNECTION_PERIOD=10
47                -DSW_AGENT_IS_OPEN_DEBUGGING_CLASS=true
48                -DSW_AGENT_SPAN_LIMIT_PER_SEGMENT=500
49                -DSW_AGENT_IGNORE_SUFFIX=.jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg
50                -DSW_GRPC_LOG_SERVER_HOST=skywalking-oap.logging.svc.cluster.local
51                -DSW_GRPC_LOG_SERVER_PORT=11800                
52            # SkyWalking Agent 环境变量配置(备用方式)
53            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
54              value: skywalking-oap.logging.svc.cluster.local:11800
55            - name: SW_AGENT_NAME
56              value: java-skywalking-test
57            - name: SW_LOGGING_LEVEL
58              value: INFO
59            - name: SW_LOGGING_ENABLED
60              value: "true"
61            - name: SW_AGENT_SAMPLE_N_PER_3_SECS
62              value: "-1"
63            # 增加每个 segment 的 span 限制,避免 "More than 300 spans" 警告
64            - name: SW_AGENT_SPAN_LIMIT_PER_SEGMENT
65              value: "500"
66            # 忽略静态资源的追踪
67            - name: SW_AGENT_IGNORE_SUFFIX
68              value: ".jpg,.jpeg,.js,.css,.png,.bmp,.gif,.ico,.mp3,.mp4,.html,.svg"
69            # GRPCLogClientAppender 配置 - 日志发送到 OAP
70            - name: SW_GRPC_LOG_SERVER_HOST
71              value: skywalking-oap.logging.svc.cluster.local
72            - name: SW_GRPC_LOG_SERVER_PORT
73              value: "11800"
74          volumeMounts:
75            - name: skywalking-agent
76              mountPath: /skywalking
77          # 根据实际需求配置资源限制
78          # resources:
79          #   requests:
80          #     memory: "512Mi"
81          #     cpu: "250m"
82          #   limits:
83          #     memory: "1Gi"
84          #     cpu: "500m"
85      volumes:
86        - name: skywalking-agent
87          emptyDir: {}

关键配置说明:

  • initContainers: 使用 init 容器将 SkyWalking Agent 复制到共享卷
  • JAVA_TOOL_OPTIONS: 通过 JVM 参数启动 SkyWalking Agent
  • SW_AGENT_NAME: 服务名称,在 SkyWalking UI 中显示
  • SW_AGENT_COLLECTOR_BACKEND_SERVICES: OAP 服务地址
  • SW_AGENT_SAMPLE_N_PER_3_SECS=-1: 采样率,-1 表示采样所有请求
  • SW_AGENT_SPAN_LIMIT_PER_SEGMENT=500: 每个 segment 的 span 限制,避免警告
  • SW_GRPC_LOG_SERVER_HOST/PORT: 日志发送到 OAP 的地址

创建应用 Service

创建文件 service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: java-skywalking-test
 5  namespace: logging
 6spec:
 7  type: NodePort
 8  selector:
 9    app: java-skywalking-test
10  ports:
11    - port: 9080
12      targetPort: 9080
13      protocol: TCP
14      name: http
15      nodePort: 30980

部署应用

在包含应用 YAML 文件的目录下执行:

1kubectl apply -f .

验证部署状态:

1# 检查 Pod 状态
2kubectl get pods -n logging | grep java-skywalking-test
3
4# 查看应用日志
5kubectl logs -n logging -l app=java-skywalking-test --tail=50
6
7# 查看 SkyWalking Agent 日志
8kubectl exec -n logging -it <pod-name> -- cat /tmp/logs/skywalking-api.log

验证和测试

1. 访问 SkyWalking UI

通过 Ingress 或 port-forward 访问 SkyWalking UI,你应该能看到:

  • 服务列表: 显示已注册的服务(如 java-skywalking-test
  • 服务拓扑: 可视化服务之间的调用关系
  • 追踪数据: 查看详细的调用链信息
  • 日志关联: 通过 TraceID 关联日志和追踪数据

2. 测试应用追踪

访问你的应用并执行一些操作,然后在 SkyWalking UI 中:

  1. 进入 Topology 页面查看服务拓扑
  2. 进入 Trace 页面查看追踪数据
  3. 进入 Log 页面查看关联的日志

3. 常见问题排查

问题: 应用未出现在 SkyWalking UI 中

  • 检查 Pod 是否正常运行
  • 检查 SkyWalking Agent 日志:kubectl logs -n logging <pod-name>
  • 确认 SW_AGENT_COLLECTOR_BACKEND_SERVICES 配置正确
  • 确认 OAP 服务可访问:kubectl get svc -n logging skywalking-oap

问题: 日志未发送到 SkyWalking

  • 检查 Logback 配置是否正确
  • 确认 SW_GRPC_LOG_SERVER_HOSTSW_GRPC_LOG_SERVER_PORT 配置正确
  • 查看 OAP 日志确认日志接收器是否正常

问题: TraceID 未出现在日志中

  • 确认已添加 apm-toolkit-logback-1.x 依赖
  • 检查 Logback 配置中是否使用了 TraceIdPatternLogbackLayout

总结

本文介绍了如何在 Kubernetes 集群中部署 SkyWalking APM 监控系统,包括:

  1. ✅ 部署 BanyanDB 和 etcd 作为存储后端
  2. ✅ 部署 SkyWalking OAP Server 和 UI
  3. ✅ 配置 Java 应用集成 SkyWalking Agent
  4. ✅ 配置日志关联和 TraceID 追踪

通过以上配置,你可以获得完整的应用性能监控能力,包括分布式追踪、服务拓扑可视化和日志关联等功能。

提示: 生产环境建议:

  • 根据实际负载调整资源限制
  • 配置持久化存储以确保数据安全
  • 设置合适的采样率以平衡性能和监控需求
  • 配置告警规则以便及时发现问题