SkyWalking入门与实战

SkyWalking部署

一、基础介绍

1.1 概念

SkyWalking是一个国产的开源框架,2015年由吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为,2019年4月17日Apache董事会批准SkyWalking成为顶级项目,支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持,目前增长势头强劲,社区活跃。
SkyWalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。

1.2 核心三部分

  • 1、Agent(探针): Agent 运行在各个服务实例中,负责采集服务实例的 Trace 、Metrics 等数据,然后通过 gRPC方式上报给SkyWalking后端。

  • 2、OAP: SkyWalking 的后端服务,其主要责任有两个。一个是负责接收 Agent 上报上来的 Trace、Metrics 等数据,交给 Analysis Core (涉及SkyWalkingOAP 中的多个模块)进行流式分析,最终将分析得到的结果写入持久化存储中。SkyWalking 可以使用ElasticSearch、H2、MySQL等作为其持久化存储,一般线上使用ElasticSearch 集群作为其后端存储。另一个是负责响应 SkyWalking UI 界面发送来的查询请求,将前面持久化的数据查询出来,组成正确的响应结果返回给 UI界面进行展示。

  • 3、UI 界面: SkyWalking 前后端进行分离,该 UI 界面负责将用户的查询操作封装为 GraphQL 请求提交给 OAP后端触发后续的查询操作,待拿到查询结果之后会在前端负责展示。

1.3、系统监控的三个维度

  • 1、Metrics 指标性统计
    一个服务的正确率、成功率、流量、TPS、响应时间等
  • 2、Tracing 分布式追踪
    从请求开始到结束,服务节点之间的调用链路
  • 3、 Logging 日志记录
    程序在执行的过程中间发生了一些日志,会一帧一帧地跳出来给大家去记录这个东西,这是日志记录

1.4、特性

多种监控手段,语言探针和service mesh
多语言探针:Java、.NET Core、PHP、Node.JS、Go
支持多种数据存储方式: ElasticSearch、MySql、TiDB、H2、Sharding Sphere
强大的UI可视化界面
高性能、高可用:agent端探针性能消耗低,服务端支持多种集群部署方式
支持多种指标的监控告警
微核+插件式扩展的高扩展框架

1.5、同类型的开源APM

大众点评的cat、
韩国的pinpoint、
老牌APM zipkin,
以及skywalking

1.6、skywalking优势

国内开源项目,社区成熟,且可与作者直接沟通
支持语言更多:Java、.NET Core、PHP、Node.JS、Golang
支持java自动探针,代码无侵入,只要简单配置,就可以自动实现各种指标、调用链的埋点
众多存储选择:ElasticSearch、MySql、TiDB、H2、Sharding Sphere
扩展性:支持模块、插件的可拔插
支持java语言的几十种插件,例如:Tomcat、RabbitMq、Kafka,且易于二次开发
性能:比其他开源软件性能都强

1.8、官网地址

官网地址: http://skywalking.apache.org/

中文官网: http://skywalking.apache.org/zh/

下载地址: https://skywalking.apache.org/downloads/

github官网:https://github.com/apache/skywalking

二、SkyWalking部署

2.1、下载安装包

  • Agents为v8.10.0
wget https://archive.apache.org/dist/skywalking/8.9.1/apache-skywalking-apm-8.9.1.tar.gz
wget https://archive.apache.org/dist/skywalking/java-agent/8.10.0/apache-skywalking-java-agent-8.10.0.tgz

2.2、安装

tar -xf apache-skywalking-apm-8.9.1.tar.gz 
cd apache-skywalking-apm-bin/
  • 修改配置文件,参数说明
    • selector 存储选择器。本文选在ES7
    • nameSpace 命名空间。Elasticsearch实例中,所有索引的命名会使用此参数值作为前缀。
    • clusterNodes 指定Elasticsearch实例的访问地址。
    • user Elasticsearch实例的访问用户名,默认为elastic。
    • password 对应用户的密码。elastic用户的密码在创建实例时指定,
vim config/application.yml
# core.restHost 改为自己的ip地址
core:
  selector: ${SW_CORE:default}
  default:
    # Mixed: Receive agent data, Level 1 aggregate, Level 2 aggregate
    # Receiver: Receive agent data, Level 1 aggregate
    # Aggregator: Level 2 aggregate
    role: ${SW_CORE_ROLE:Mixed} # Mixed/Receiver/Aggregator
    restHost: ${SW_CORE_REST_HOST:192.168.1.160}             # 这里
    
# 数据存储修改为 elasticsearch,配置 elasticsearch的地址,命名空间,和用户名密码(没有则不需填写)
# storage.selector storage.elasticsearch
storage:
  selector: ${SW_STORAGE:elasticsearch}
  elasticsearch:
    namespace: ${SW_NAMESPACE:""}
    # 集群地址,多个地址使用逗号分隔,比如 192.168.1.162:9200,192.168.1.162:9200
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.1.162:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    connectTimeout: ${SW_STORAGE_ES_CONNECT_TIMEOUT:500}
    socketTimeout: ${SW_STORAGE_ES_SOCKET_TIMEOUT:30000}
    numHttpClientThread: ${SW_STORAGE_ES_NUM_HTTP_CLIENT_THREAD:0}
    user: ${SW_ES_USER:"elastic"}
    password: ${SW_ES_PASSWORD:"123456"}
# 修改webapp配置文件
# 配置ui服务webapp.yml文件的oap-service,写多个oap服务地址
vim  webapp/webapp.yml
server:
  port: 18080    # 改个默认端口

spring:
  cloud:
    gateway:
      routes:
        - id: oap-route
          uri: lb://oap-service
          predicates:
            - Path=/graphql/**
    discovery:
      client:
        simple:
          instances:
            oap-service:
              - uri: http://192.168.1.160:12800    # 修改本机IP
            # - uri: http://<oap-host-1>:<oap-port1>
            # - uri: http://<oap-host-2>:<oap-port2>                   

2.3、启动

# 单独启动 backend(oapService)
./bin/oapService.sh

# 单独启动 UI(webappService)
./bin/webappService.sh

# 如果想要两个服务同时启动,可以不用上边两个脚本,用下边这个即可:
[root@masternode1 apache-skywalking-apm-bin]# ./bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!

# 启动后端(2个实例), 要配置注册中心就启动2个实例(部署去两台机器)
sh bin/oapService.sh

2.4、探针 agent

  • 普通启动,在你部署了业务的节点启动
java -javaagent:skywalking-agent.jar \
     -Dskywalking.agent.service_name=test             \
     -Dskywalking.collector.backend_service=127.0.0.1:11800 \
     -jar skywalking-agent.jar

微服务 
认证中心
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-authcenter
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800 
网关
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-gateway
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800 
农污
-javaagent:F:\java\apache-skywalking-apm-bin-es7\agent\skywalking-agent.jar
-DSW_AGENT_NAME=cloud-nongwu
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.73.132:11800


-javaagent:                                指定skywalking中的agent中的skywalking-agent.jar的路径
-Dskywalking.agent.service_name:           指定在skywalking中的服务名称,一般是微服务的spring.application.name
-Dskywalking.collector.backend_service:    指定oap服务绑定的地址,并且oap服务默认的端口是11800
  • k8s上搞
FROM centos:7.6.1810
LABEL maintainer ssgeek@ssgeek.com

ENV LANG "en_US.UTF-8"
ENV JDK_VERSION 1.8.0_191
ENV SW_VERSION 8.4.0

ADD jdk-8u191-linux-x64.tar.gz /usr/local
ADD agent /skywalking/agent

ENV JAVA_HOME /usr/local/jdk1.8.0_191
ENV CLASSPATH $JAVA_HOME/lib;$JAVA_HOME/jre/lib
ENV PATH $PATH:$JAVA_HOME/bin

RUN set -x && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# docker build -t hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
# docker push hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
FROM hub.ssgeek.com/basic_image/jdk_8u191:skywalking_v1.0
LABEL maintainer ssgeek@ssgeek.com

RUN mkdir /app
WORKDIR /app
COPY target/*.jar /app/app.jar
EXPOSE 8080
CMD java -Djava.security.egd=file:/dev/./urandom -javaagent:/skywalking/agent/skywalking-agent.jar -jar ${JAVA_OPTS} /app/app.jar

## 或者
FROM java:8
WORKDIR /project
ENV JAVA_OPTS=""
ENV SKYWALKING_OPTS=""
CPOY skywalking-agent.jar  skywalking-agent.jar
COPY web-monitor.jar web-monitor.jar
ENTRYPOINT ["sh","-c","java -jar ${JAVA_OPTS} web-monitor.jar ${SKYWALKING_OPTS} "]
  • 注入环境变量1
- env:
        - name: JAVA_OPTS
          value: -Xmx3550M -Xms3550M -Xmn2G -Xss256k
		- name: SKYWALKING_OPTS
          value: -javaagent:./skywalking-agent.jar -Dskywalking.agent.service_name=web-monitor -Dskywalking.collector.backend_service=skywalking-oap:11800
  • 注入环境变量2
...
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: java
        image: hub.ssgeek.com/java/xxx:tag
        imagePullPolicy: IfNotPresent
        env:
        - name: JAVA_OPTS
          value: 'JVM参数'
        - name: SW_AGENT_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        - name: SW_AGENT_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.name
        - name: SW_AGENT_CACHE_CLASS
          value: 'true'
        - name: SW_MYSQL_TRACE_SQL_PARAMETERS
          value: 'true'
        - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
          value: 'skywalking-oap.monitoring.svc:11800'
        ports:
        - containerPort: 8080
          name: AppName
          protocol: TCP

三、容器化部署

docker run --name skywalking-oap-server --restart always -p 11800:11800 -p 12800:12800 -d -e TZ=Asia/Shanghai  -e SW_ES_USER=  -e SW_ES_PASSWORD=  -e SW_STORAGE=elasticsearch  -e SW_STORAGE_ES_CLUSTER_NODES=192.168.44.131:9200  -v /etc/localtime:/etc/localtime:ro  apache/skywalking-oap-server:8.9.1
docker run -d --name skywalking-ui --restart always -p 8080:8080 --link skywalking-oap-server:skywalking-oap-server -e TZ=Asia/Shanghai  -e SW_OAP_ADDRESS=http://skywalking-oap-server:12800  -v /etc/localtime:/etc/localtime:ro  apache/skywalking-ui:8.9.1

四、k8s上部署

apiVersion: v1
kind: ConfigMap
metadata:
  name: skywalking-cm
  namespace: skywalking
data:
  CLUSTER: 'nacos'
  CLUSTER_NACOS_HOST_PORT: 'nacos-headless.default.svc.cluster.local:8848'
  CORE_GRPC_PORT: '11800'
  CORE_REST_PORT: '12800'
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: oap
  namespace: skywalking  
spec:
  replicas: 1
  selector:
    matchLabels:
      app: oap
      release: skywalking
  template:
    metadata:
      labels:
        app: oap
        release: skywalking
    spec:
      containers:
        - envFrom:
          - prefix: SW_
            configMapRef:
              name: skywalking-cm
          name: oap
          image: apache/skywalking-oap-server:8.8.1  
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 11800
              name: grpc
            - containerPort: 12800
              name: rest
          volumeMounts:
            - mountPath: /etc/localtime
              name: volume-localtime
      volumes:
        - hostPath:
            path: /etc/localtime
            type: ''
          name: volume-localtime
---
apiVersion: v1
kind: Service   
metadata:
  name: oap
  namespace: skywalking
  labels:
    service: oap
spec:
  ports:
    - port: 12800
      name: rest
    - port: 11800
      name: grpc
  type: NodePort
  selector:
    app: oap
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ui-deployment
  namespace: skywalking
  labels:
    app: ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ui
  template:
    metadata:
      labels:
        app: ui
    spec:
      containers:
        - name: ui
          image: apache/skywalking-ui:8.8.1
          ports:
            - containerPort: 8080
              name: page
          env:
            - name: SW_OAP_ADDRESS   
              value: oap:12800
---
apiVersion: v1
kind: Service  
metadata:
  name: ui
  namespace: skywalking
  labels:
    service: ui
spec:
  ports:
    - port: 8080
      name: page
  type: NodePort  
  selector:
    app: ui
  • skywalking agent 部署在k8s
# 下载 skywalking-8.5.0 for es6 版本的发布包,与部署的 skywalking 后端版本一致
wget https://www.apache.org/dyn/closer.cgi/skywalking/8.5.0/apache-skywalking-apm-8.5.0.tar.gz
# 将下载的发布包解压到当前目录
tar -zxvf apache-skywalking-apm-8.5.0.tar.gz

FROM busybox:latest
LABEL maintainer="xiniao"
COPY apache-skywalking-apm-bin/agent/ /usr/skywalking/agent/

docker build -t skywalking-agent-sidecar:8.5.0 .
  • sidecar 模式接入 skywalking
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-skywalking-demo
  namespace: default
  labels:
    app: spring-boot-skywalking-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-boot-skywalking-demo
  template:
    metadata:
      labels:
        app: spring-boot-skywalking-demo
    spec:
      #构建初始化镜像(通过初始化镜像的方式集成SkyWalking Agent)
      initContainers:
        - image: registry.cn-shenzhen.aliyuncs.com/devan/skywalking-agent-sidecar:8.5.0
          name: sw-agent-sidecar
          imagePullPolicy: IfNotPresent
          command: [ "sh" ]
          args:
            [
                "-c",
                "cp -R /usr/skywalking/agent/* /skywalking/agent",
            ]
          volumeMounts:
            - mountPath: /skywalking/agent
              name: sw-agent
      containers:
        - name: spring-boot-skywalking-demo
          image: ${ORIGIN_REPO}/spring-boot-skywalking-demo:${IMAGE_TAG}
          imagePullPolicy: Always
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: BUILD_TAG
              value: ${BUILD_TAG}
            - name: NAMESPACE
              value: default 
          # 这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS, 可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/usr/skywalking/agent/skywalking-agent.jar
            - name: SW_AGENT_NAME
              value: spring-boot-skywalking-demo
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              # FQDN: servicename.namespacename.svc.cluster.local
              value: skywalking-oap.default.svc:11800
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 200m
              memory: 500Mi
          volumeMounts:
            - mountPath: /usr/skywalking/agent
              name: sw-agent
      volumes:
        - name: sw-agent
          emptyDir: { }


---
apiVersion: v1
kind: Service
metadata:
  name: spring-boot-skywalking-demo
  namespace: default
  labels:
    app: spring-boot-skywalking-demo
spec:
  ports:
    - name: port
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: spring-boot-skywalking-demo
  type: ClusterIP

spec.volumes 指的是 pod 中的卷,spec.containers.volumeMounts 是将指定的卷 mount 到容器指定的位置,相当于 docker 里面的 -v 宿主机目录:容器目录,我们这里使用的是 emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。初始容器执行的命令是 sh -c cp -R /usr/skywalking/agent/* /skywalking/agent, 意思是将 skywalking agent 复制到共享目录,主容器关联了共享目录,所以主容器就可以访问 skywalking agent。

posted @ 2023-07-10 23:19  taotaozh  阅读(629)  评论(0编辑  收藏  举报