skywalking链路跟踪

前言

微服务中,有时候服务调用多了,排查问题会变得异常繁琐,需要不断找到调用链每个服务的日志查看问题,消耗大量人力物力,最终才找到问题。
这时候如果出现线上重大问题,又需要快速定位问题,有什么组件是实时监控整个调用链辅助我们快速定位问题的呢?
当然有,那就是链路跟踪,其中比较出名的就是skywalking,无代码侵入性,只需要运行脚本加入对应命令即可。
本文介绍skywalking的搭建全过程,同时提供了普通服务和k8s服务加入skywalking探针的方法。

skywalking简单安装部署

前提:需要安装java环境

1、下载

安装
版本目录地址:https://archive.apache.org/dist/skywalking/

这里下载当前最新for es7的8.5.0版本。不用es7存储的可以下载其他版本。

下载命令:

wget https://dlcdn.apache.org/skywalking/8.7.0/apache-skywalking-apm-es7-8.7.0.tar.gz

解压

mkdir /data -p
#解压到/data目录
tar -zxf apache-skywalking-apm-es7-8.5.0.tar.gz -C /data/

#重命名
mv /data/apache-skywalking-apm-bin-es7 /data/skywalking

配置

环境配置

修改/etc/hosts,加入如下内容

#es在本地安装
127.0.0.1 es

搭建docker版的es

docker安装略,直接用docker安装es吧,省事点。

docker pull elasticsearch:7.6.2

#创建docker容器挂在的目录:
sudo mkdir -p /data/elasticsearch/config
sudo mkdir -p /data/elasticsearch/data
sudo mkdir -p /data/elasticsearch/plugins
#配置文件
echo "http.host: 0.0.0.0" >> /data/elasticsearch/config/elasticsearch.yml

#创建容器
sudo docker run --name elasticsearch -p 9200:9200  -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms84m -Xmx512m" \
-v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /data/elasticsearch/data:/usr/share/elasticsearch/data \
-v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.6.2


#查看启动详情

docker ps # 查看是否启动
docker logs elasticsearch  #启动日志查询
docker restart elasticsearch   #重启
docker exec -it elasticsearch bash #进入


#  可能会出现的安装异常
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
## 异常一:文件夹未设置所有用户读写执行权限,处理:sudo chmod -R 777 /opt/elasticsearch/
## 异常三:因虚拟内存太少导致,处理:sudo sysctl -w vm.max_map_count=262144

服务配置

进入安装目录

cd /data/skywalking

修改配置文件./config/application.yml,修改数据库为elasticsearch7,其他使用默认配置即可。

vim config/application.yml
#集群配置
cluster:
  #选择配置,这里使用单机版
  selector: ${SW_CLUSTER:standalone}
  #单机版配置
  standalone:
    ...
  #基于zk集群配置
  zookeeper:
    ...
...
#数据库
storage:
  #这里使用elasticsearch7
  selector: ${SW_STORAGE:elasticsearch7}
  ...
  elasticsearch7:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:node3:9200}
    ...
...

UI端口修改

修改./webapp/webapp.yml文件

vim webapp/webapp.yml
server:
  #访问端口号
  port: 8080

collector:
  path: /graphql
  ribbon:
    ReadTimeout: 10000
    # Point to all backend's restHost:restPort, split by ,
    # 内置zuul负载均衡
    listOfServers: 127.0.0.1:12800

启停

启动

执行启动命令./bin/startup.sh,默认会占用的8080,11800,12800端口

$ ./bin/startup.sh
SkyWalking OAP started successfully!
SkyWalking Web Application started successfully!

停止

杀掉8080、11800端口对应的pid

kill -9 [pid]

访问

访问地址

http://localhost:8080/

skywalking做成service服务

做成服务,保证skywalking挂了能自动重启,开机自启,而且方便启停。(当前也能直接用做成镜像,用docker,但对于这种cpu或内存占用大的,还是推荐做成服务比较好点)

位置:

/usr/lib/systemd/system/skywalking.service

内容

[Unit]
Description=skywalking service
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
Environment=JAVA_HOME=/data/java/jdk
ExecStart=/data/skywalking/bin/startup.sh
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
StandardOutput=syslog
StandardError=inherit

[Install]
WantedBy=multi-user.target

命令

#重载配置
systemctl daemon-reload

#开机自启
systemctl enable skywalking

#重启skywalking
systemctl restart skywalking


systemctl status skywalking

加入探针

agent文件放到对应位置

给 springboot 服务加入探针

我的 start.sh 文件如下
,需要注意的是: -jar 后面是要加探针的 jar 包,一定要放在命令行的最后。

java -Dfile.encoding=UTF-8  -Xms256m -Xmx256m \
 -javaagent:/opt/skywalking/agent/skywalking-agent.jar \
 -Dskywalking.agent.service_name=ybf-static \
 -Dskywalking.collector.backend_service=vipmajia.com:11800 \
 -jar  /root/dev/ybf-static-0.0.2-SNAPSHOT.jar \
 &

启动 springboot:

./start.sh

给k8s的微服务加入探针

如果是k8s,其yaml要添加如下内容:

#外部 skywalking引入k8s作为endpoints
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    name: skywalking
  name: skywalking
  namespace: xcc-prod
subsets:
  - addresses:
      - ip: 10.10.40.161
    ports:
      - name: skywalking
        port: 11800

---
#skywalking作为service
apiVersion: v1
kind: Service
metadata:
  labels:
    name: skywalking
  name: skywalking
  namespace: xcc-prod
spec:
  ports:
    - name: skywalking
      port: 11800
      targetPort: 11800
  type: NodePort

对应服务上加入skywalking的探针

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-project-name
  namespace: xcc-test
spec:
  replicas: 1
  selector:
    matchLabels:
      name: my-project-name
  template:
    metadata:
      labels:
        name: my-project-name
    spec:
      containers:
        - name: my-project-name
          ...
          env:
            - ...
            # 镜像中没有JAVA_OPTS这个ENV实际上这个地方不会生效,所以在docker中 -javaagent:/sidecar/agent/skywalking-agent.jar 是需要的。
            #这里通过JAVA_TOOL_OPTIONS,而不是JAVA_OPTS可以实现不通过将agent命令加入到java应用jvm参数而实现agent的集成
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/data/skywalking/agent/skywalking-agent.jar
            - name: SW_AGENT_NAME
              value: my-project-name
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: skywalking:11800
          volumeMounts:
            - name: bd-skywalking
              mountPath: /data/skywalking/agent
      volumes:
        - name: bd-skywalking
          nfs:
            path: /data/k8snfs/sys/skywalking/agent
            server: 10.10.40.121

  • volumes前提,在挂载的nfs里提前把skywalking的agent目录放好到目录 :/data/k8snfs/sys/skywalking/agent
  • volumeMounts:跟volumes呼应,name要保持一致,mountPath为当前目录,跟env的JAVA_TOOL_OPTIONS路径一致,都为/data/skywalking/agent
  • env:必要的环境变量,JAVA_TOOL_OPTIONS 是jar跑的时候的代理jar
  • env:必要的环境变量,SW_AGENT_COLLECTOR_BACKEND_SERVICES 是agent后台地址,要能在当前容器里ping通
  • env:必要的环境变量,SW_AGENT_NAME 为最终在 http://127.0.0.1:8080 里会展示出来的名字,最好跟项目名称呼应,如例子里的my-project-name

访问后台

http://localhost:8080/

skywalking

img

页面里,核心是successful rate 即,访问成功率,这个正常服务要一直100%才是对的,低于这个数都得报警

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐