日期: August 18, 2023
Skywalking组件如下
- skywalking-oap-server:后端服务,负责接收 Agent 发送的 Tracing 数据信息,然后进行分析(Analysis Core) ,存储到外部存储器( Storage ),最终提供查询( Query )功能
- skywalking-ui:UI前端
- skywalking-es-init:初始化es集群数据使用,首次启动时,SkyWalking OAP需要创建 Elasticsearch的索引
- Storage:目前支持 ES、MySQL、Sharding Sphere、TiDB、H2多种存储器,官方采用的es
- agent:收集链路指标传递给oap,支持SkyWalking、Zikpin、Jaeger等提供的Tracing数据信息,而我们目前采用的是,SkyWalking Agent收集SkyWalking Tracing数据
- 数据传输:数据通过kafka、Grpc、HTTP传输到Skywalking Reveiver
关于数据传输(以kafka为例)
agent和oap配置指定kafka地址,agent会把消息发送到kafka,然后oap消费,agent不再直接配置oap的地址,topic则是默认创建,不能指定
注:agent需要将optional-reporter-plugins目录下kafka-reporter-plugin-8.8.0.jar移动到plugins下
三个概念
- 服务(Service) :表示对请求提供相同行为的一系列或一组工作负载,即’SW_AGENT_NAME’变量的值,使用 Agent或SDK时可以定义服务的名字,,如果不定义的话,SkyWalking 将会使用你在平台(例如说 Istio)上定义的名字
- 服务实例(Service Instance) :上述一组工作负载中每一个工作负载称为一个实例,就像Kubernetes 中的pods一样, 服务实例未必就是操作系统上的一个进程,但当你在使用 Agent 的时候, 一个服务实例实际就是操作系统上的一个真实进程,Spring Boot应用默认为 {agent_name}-pid:{pid}@{hostname},由Agent自动生成
- 端点(Endpoint) :对于特定服务所接收的请求路径, 如HTTP的URI路径和gRPC服务的类名+方法签名,一般为API接口如’/demo/post1’
Agent配置
- Export SW_AGENT_NAME=demo-application # 配置Agent名字,一般直接使用Spring Boot项目的 ‘spring.application.name’
- Export SW_AGENT_COLLECTOR_BACKEND_SERVICES=127.0.0.1:11800 # 配置Collector地址
- Export SW_AGENT_SPAN_LIMIT=2000 # 配置链路的最大Span数量,一般不需要配置,默认为300
- Export JAVA_AGENT=-javaagent:/opt/skywalking/agent/skywalking-agent.jar # SkyWalking Agent jar 地址
更多变量可在agent.config文件查看
生产环境实现
oap:pod多副本部署,无需介绍
agent:容器内部署
业务容器引用skywalking示例:
#初始化容器拷贝agent至共享目录
initContainers:
- args:
- -c
- cp -R /skywalking/agent /agent/
command:
- /bin/sh
image: xxx.xxx.com/skywalking/skywalking-java-agent:8.11.0
imagePullPolicy: IfNotPresent
name: skywalking-java-agent
volumeMounts:
- mountPath: /agent
name: skywalking-agent
#业务容器指定skywalking的相关变量和javaagent
containers:
- env:
- name: SKYWALKING_AGENT
value: -javaagent:/opt/agents/skywalking/agent/skywalking-agent.jar
-Dskywalking_config=/opt/agents/skywalking/agent/config/agent.config
-Dskywalking.agent.service_name=$(APP_NAME)
#一般这里还需要把SW_AGENT_COLLECTOR_BACKEND_SERVICES即oap的ip地址传进去,但由于实际配置了kafka传输方式,则不需要再配置oap地址
volumeMounts:
#agent挂载进容器
- mountPath: /opt/agents/skywalking
name: skywalking-agent
#配置文件挂载进容器
- mountPath: /opt/agents/skywalking/agent/config/agent.config
name: skywalking-config
readOnly: true
subPath: agent.config
#初始化容器和业务容器共享目录
volumes:
- emptyDir: {}
name: skywalking-agent
#skywalking配置挂载
- configMap:
defaultMode: 420
name: agent-config
items:
- key: skywalking.config
path: agent.config
name: skywalking-config
Tips:这里挂载的是agent-config这个configmap的skywalking.config(key指定)文件,且挂载进容器后文件名为agent.config(path指定),因为agent-config单个configmap里定义了多个config文件,不单只有skywalking的
skywalking-config configmap配置
apiVersion: v1
kind: ConfigMap
data:
skywalking.config: |
...#大部分可直接用默认配置
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
plugin.kafka.bootstrap_servers=${SW_KAFKA_BOOTSTRAP_SERVERS:kafka1:9092,kafka2:9092,kafka3:9092}
...
metadata:
name: agent-config
namespace: skywalking
Skywalking-oap
集群模式
- Zookeeper
- K8s
- Consul
- Etcd
在 application.yml 中, 在 cluster 部分有上述协调器的默认配置
你可以通过 selector 属性启用他们中的任意一个
动态配置
动态配置服务是一个 gRPC 服务, 需要上游系统进行实现. 在你按照如下方式配置开启此功能之后, SkyWalking OAP 就可以从该服务的实现获取配置信息
动态配置示例
动态从apollo获取配置
configuration:
apollo:
apolloMeta: <your apollo meta address>
apolloCluster: default
# apolloEnv: # 默认为null
appId: skywalking
period: 5
动态nacos获取配置
configuration:
nacos:
# Nacos 服务器主机
serverAddr: 127.0.0.1
# Nacos 服务器端口
port: 8848
# Nacos 配置分组
group: 'skywalking'
# 单位秒,同步周期。默认每60秒提取一次
period : 60
# 当前群集的名称,如果想要上游系统的名称,请设置
clusterName: "default"
SkyWalking-OAP部署
kind: Deployment
apiVersion: apps/v1
metadata:
name: skywalking-skywalking-oap
namespace: skywalking
labels:
app: skywalking
chart: skywalking-4.2.0
component: skywalking-oap
spec:
replicas: 10
selector:
matchLabels:
app: skywalking
component: skywalking-oap
release: skywalking
template:
metadata:
labels:
app: skywalking
component: skywalking-oap
release: skywalking
spec:
volumes:
- name: trace-sampling-policy-settings
configMap:
name: trace-sampling-policy-settings
defaultMode: 420
initContainers:
- name: wait-for-elasticsearch
image: busybox:1.30
command:
- sh
- '-c'
- for i in $(seq 1 60); do nc -z -w3 172.25.32.15 9200 && exit 0 || sleep 5; done; exit 1
imagePullPolicy: IfNotPresent
containers:
- name: skywalking-oap
image: skywalking.docker.scarf.sh/apache/skywalking-oap-server:9.1.0
ports:
- name: grpc
containerPort: 11800
protocol: TCP
- name: rest
containerPort: 12800
protocol: TCP
env:
#初始化模式OAP会执行初始化后退出,可以初始化存储如es索引或者mysql表,非初始化模式则是直接启动
- name: JAVA_OPTS
value: '-Dmode=no-init -Xmx6g -Xms6g'
#集群模式
- name: SW_CLUSTER
value: kubernetes
- name: SW_CLUSTER_K8S_NAMESPACE
value: monitor
- name: SW_CONFIGURATION
value: k8s-configmap
- name: SW_CONFIG_CONFIGMAP_PERIOD
value: '60'
- name: SW_CLUSTER_K8S_LABEL
value: app=skywalking,release=skywalking,component=skywalking-oap
#存储类型
- name: SW_STORAGE
value: elasticsearch
#存储地址
- name: SW_STORAGE_ES_CLUSTER_NODES
value: ip:9200,ip:9200,ip:9200
#es用户密码
- name: SW_ES_USER
value: user
- name: SW_ES_PASSWORD
value: passwd
- name: SW_STORAGE_ES_INDEX_SHARDS_NUMBER
value: '1'
- name: SW_STORAGE_ES_SUPER_DATASET_INDEX_SHARDS_FACTOR
value: '12'
...
#使用kafka传输数据
- name: SW_KAFKA_FETCHER
value: default
- name: SW_KAFKA_FETCHER_CONSUMERS
value: '55'
- name: SW_KAFKA_FETCHER_PARTITIONS
value: '55'
#分片数
- name: SW_KAFKA_FETCHER_PARTITIONS_FACTOR
value: '2'
#kafka地址
- name: SW_KAFKA_FETCHER_SERVERS
value: ip:9092,ip:9092,ip:9092
- name: SW_RECEIVER_GRPC_POOL_QUEUE_SIZE
value: '20000'
- name: SW_RECEIVER_GRPC_THREAD_POOL_SIZE
value: '30'
volumeMounts:
- name: trace-sampling-policy-settings
readOnly: true
mountPath: /skywalking/config/trace-sampling-policy-settings.yml
subPath: trace-sampling-policy-settings.yml
livenessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
timeoutSeconds: 1
periodSeconds: 20
successThreshold: 1
failureThreshold: 3
readinessProbe:
tcpSocket:
port: 12800
initialDelaySeconds: 15
timeoutSeconds: 1
periodSeconds: 20
successThreshold: 1
failureThreshold: 3
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: skywalking
serviceAccount: skywalking
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
---
apiVersion: v1
kind: Service
metadata:
name: skywalking-skywalking-oap
namespace: monitor
labels:
app: skywalking
chart: skywalking-4.2.0
component: skywalking-oap
release: skywalking
spec:
ports:
- name: grpc
protocol: TCP
port: 11800
targetPort: 11800
nodePort: 30118
- name: rest
protocol: TCP
port: 12800
targetPort: 12800
nodePort: 30128
selector:
app: skywalking
component: skywalking-oap
release: skywalking
type: LoadBalancer
sessionAffinity: None
loadBalancerIP: ip
externalTrafficPolicy: Cluster
关于sample rate采样率
默认指定trace-sampling-policy-settings.yml文件位置
agent-analyzer:
default:
...
traceSamplingPolicySettingsFile: ${SW_TRACE_SAMPLING_POLICY_SETTINGS_FILE:trace-sampling-policy-settings.yml}
forceSampleErrorSegment: ${SW_FORCE_SAMPLE_ERROR_SEGMENT:true}
默认文件trace-sampling-policy-settings.yml
default:
rate: 10000
duration: -1duration.rate:10000 表示默认为 100% 样本
default.duration:-1 允许您在激活采样机制时保存所有慢速跟踪段。在延迟上设置此阈值(以毫秒为单位)将导致慢速跟踪段在占用更多时间时进行采样,即使激活了采样机制也是如此,默认值为 -1 ,这意味着不会对慢速跟踪进行采样