日期: 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

集群模式

  1. Zookeeper
  2. K8s
  3. Consul
  4. 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: -1

duration.rate:10000 表示默认为 100% 样本

default.duration:-1 允许您在激活采样机制时保存所有慢速跟踪段。在延迟上设置此阈值(以毫秒为单位)将导致慢速跟踪段在占用更多时间时进行采样,即使激活了采样机制也是如此,默认值为 -1 ,这意味着不会对慢速跟踪进行采样