Skip to content

skywalking链路追踪部署

参考文档:https://skywalking.apache.org/docs/

一、介绍

SkyWalking 是观察性分析平台和应用性能管理系统。 提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。 Skywalking 从以大数据平台为主的分析模式, 进化为轻量化、低延迟的分析模式,同时支持分布式追踪和非侵入式的语言探针这两种模式,是能够提供一致性解决方案的开源项目。

详情可看官方文档:https://skywalking.apache.org/docs/

安装部署文档参考:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/

二、部署前提

  • 一台服务器(装有docker环境)

  • 已经存在es的环境,如果不存在则自行安装。

注意es版本对应关系(主要为大版本):https://archive.apache.org/dist/skywalking

点开上面的地址,选择版本,一般都有es的版本包在里面,如果没有在里面。使用es7,亲测skywalking v10.0.1的可以使用es8

三、docker部署

注意:docker部署需要在实际应用当中去加载agent包

3.1 安装skywalking-oap

skywalking的服务端,用于接收和存储数据。这里使用elasticsearch做数据存储。

配置参考:https://skywalking.apache.org/zh/2020-04-19-skywalking-quick-start/#23-skywalking-oap-搭建

docker run -d --name skywalking-oap --restart always -p 11800:11800 -p 12800:12800 --privileged=true -e TZ=Asia/Shanghai -e SW_CORE_METRICS_DATA_TTL=14 -e SW_CORE_RECORD_DATA_TTL=14 -e SW_ES_USER=elastic -e SW_ES_PASSWORD=elastic -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=elasticsearch:9200 apache/skywalking-oap-server:10.0.1

3.2 安装skywalking-ui

skywalking可视化ui页面

docker run -d --name skywalking-ui --restart always -p 8080:8080 --privileged=true --link skywalking-oap:skywalking-oap -e TZ=Asia/Shanghai -e SW_OAP_ADDRESS=skywalking-oap:12800 apache/skywalking-ui:10.0.1

3.3 应用容器接入

springboot应用启动的时候需要添加agent(注意版本,10.0.1使用的agent为9.3.0),agent的下载地址为:https://skywalking.apache.org/docs/skywalking-java/latest/readme/

java -javaagent:/usr/skywalking/agent/skywalking-agent.jar  -Dskywalking.agent.service_name=your-service-name -Dskywalking.collector.backend_service=127.0.0.1:11800

四、基于K8S部署

k8s部署只列出配置和关键的点,具体命令需要自行搜索

4.1 安装skywalking-oap

configMap的yaml配置

apiVersion: v1
data:
  SW_CORE_METRICS_DATA_TTL: '14'
  SW_CORE_RECORD_DATA_TTL: '14'
  SW_ES_PASSWORD: hcms123
  SW_ES_USER: elastic
  SW_STORAGE: elasticsearch
  SW_STORAGE_ES_CLUSTER_NODES: 'elasticsearch:9200'
kind: ConfigMap
metadata:
  name: skywalking-oap-server
  namespace: test

deploment应用的yaml配置

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s.name: skywalking-oap-server
  name: skywalking-oap-server
  namespace: test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      k8s.name: skywalking-oap-server
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s.name: skywalking-oap-server
    spec:
      containers:
        - envFrom:
            - configMapRef:
                name: skywalking-oap-server
          image: 'apache/skywalking-oap-server:10.0.1'
          imagePullPolicy: IfNotPresent
          name: skywalking-oap-server
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
  observedGeneration: 6
  readyReplicas: 1
  replicas: 1
  updatedReplicas: 1

service服务yaml配置

---
apiVersion: v1
kind: Service
metadata:
  annotations: {}
  labels:
    k8s.name: skywalking-oap-server
  name: skywalking-oap-server
  namespace: test
spec:
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: wxs5fn
      port: 11800
      protocol: TCP
      targetPort: 11800
    - name: mtphhc
      port: 12800
      protocol: TCP
      targetPort: 12800
  selector:
    k8s.name: skywalking-oap-server
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

4.2 安装skywalking-ui

configMap的yaml配置

---
apiVersion: v1
data:
  SW_OAP_ADDRESS: 'http://skywalking-oap-server:12800'
kind: ConfigMap
metadata:
  annotations: {}
  labels: {}
  name: skywalking-ui
  namespace: test

deploment应用的yaml配置

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations: {}
  labels:
    k8s.name: skywalking-ui
  name: skywalking-ui
  namespace: test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s.name: skywalking-ui
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s.name: skywalking-ui
    spec:
      containers:
        - envFrom:
            - configMapRef:
                name: skywalking-ui
          image: 'apache/skywalking-ui:10.0.1'
          imagePullPolicy: IfNotPresent
          name: skywalking-ui
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30

service服务

由于这个可视化服务端口需要发布出去浏览,采用nodeport发布

---
apiVersion: v1
kind: Service
metadata:
  name: skywalking-ui-node
  namespace: test
spec:
  externalTrafficPolicy: Cluster
  internalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  ports:
    - name: 8pnrff
      nodePort: 30000
      port: 8080
      protocol: TCP
      targetPort: 8080
  selector:
    k8s.name: skywalking-ui
  sessionAffinity: None
  type: NodePort
status:
  loadBalancer: {}

4.3 应用容器接入

k8s的应用接入可以不需要手动去添加agent,只需要在应用的yaml增加以下初始化容器的内容即可:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    k8s.displayName: test
  labels:
    k8s.name: test
  name: test
  namespace: test
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  selector:
    matchLabels:
      k8s.name: test
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        k8s.name: test
    spec:
      containers:
          image: '应用镜像名称'
          imagePullPolicy: IfNotPresent
          name: test
          volumeMounts:
            - mountPath: /skywalking
              name: skywalking-agent
      dnsPolicy: ClusterFirst
      initContainers:
        - args:
            - '-c'
            - cp -R /skywalking/agent /agent/
          command:
            - /bin/sh
          image: 'apache/skywalking-java-agent:9.3.0-java17'
          imagePullPolicy: IfNotPresent
          name: skywalking-java-agent
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /agent
              name: skywalking-agent
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
        - emptyDir: {}
          name: skywalking-agent

五、springboot应用接入

上述的过程都是基于部署的,那么实际的应用接入就按以下的方式进行

5.1 引入依赖

版本号与agent对应即可

        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-logback-1.x</artifactId>
            <version>9.3.0</version>
        </dependency>

        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-trace</artifactId>
            <version>9.3.0</version>
        </dependency>

5.2 修改日志文件

修改logback.xml内容,增加skywalking的内容

    <!--  skywalking控制台输出  -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}) [%X{tid}] [%thread] %highlight(%-5level) %clr(%-40.40logger{39}){cyan} %msg%n</Pattern>
            </layout>
        </encoder>
    </appender>

    <!--  上报给skywalking-oap  -->
        <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
                <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
            </layout>
        </encoder>
    </appender>