介绍
Apache SkyWalking 是一个应用性能监控(APM)系统,用于分布式系统的监控、追踪和诊断。它提供了完整的可观测性解决方案,帮助开发者和运维人员快速定位和解决分布式系统中的性能问题。
组件说明
- OAP (Observability Analysis Platform): 核心分析平台,负责数据收集、分析和存储
- UI: Web 界面,用于可视化和查询监控数据
- BanyanDB: 高性能时序数据库,作为 SkyWalking 的存储后端
- etcd: 分布式键值存储,BanyanDB 使用它来存储元数据
功能特性
- 分布式追踪: 自动收集和关联分布式系统的调用链,支持跨服务追踪
- 服务拓扑: 可视化服务之间的依赖关系,实时展示服务调用图
- 性能指标: 收集服务的性能指标(延迟、吞吐量、错误率等)
- 日志关联: 将日志与追踪数据关联,通过 TraceID 快速定位问题
- 告警机制: 支持基于指标的告警规则配置
部署
前置要求
在开始部署之前,请确保满足以下要求:
- Kubernetes 集群: 版本 1.20+
- 命名空间: 已创建
logging命名空间(或根据实际情况修改) - 存储: 确保节点有足够的存储空间(建议至少 10Gi)
- 网络: 确保 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>
说明:
SKYWALKINGAppender 会将日志发送到 SkyWalking OAPTraceIdPatternLogbackLayout和TraceIdMDCPatternLogbackLayout会在日志中自动添加 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 AgentSW_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 中:
- 进入 Topology 页面查看服务拓扑
- 进入 Trace 页面查看追踪数据
- 进入 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_HOST和SW_GRPC_LOG_SERVER_PORT配置正确 - 查看 OAP 日志确认日志接收器是否正常
问题: TraceID 未出现在日志中
- 确认已添加
apm-toolkit-logback-1.x依赖 - 检查 Logback 配置中是否使用了
TraceIdPatternLogbackLayout
总结
本文介绍了如何在 Kubernetes 集群中部署 SkyWalking APM 监控系统,包括:
- ✅ 部署 BanyanDB 和 etcd 作为存储后端
- ✅ 部署 SkyWalking OAP Server 和 UI
- ✅ 配置 Java 应用集成 SkyWalking Agent
- ✅ 配置日志关联和 TraceID 追踪
通过以上配置,你可以获得完整的应用性能监控能力,包括分布式追踪、服务拓扑可视化和日志关联等功能。
提示: 生产环境建议:
- 根据实际负载调整资源限制
- 配置持久化存储以确保数据安全
- 设置合适的采样率以平衡性能和监控需求
- 配置告警规则以便及时发现问题












