关于kubernetes:Kubernetes-Spring-Cloud-集成链路追踪-SkyWalking

39次阅读

共计 6761 个字符,预计需要花费 17 分钟才能阅读完成。

一、概述
1、什么是 SkyWalking?
分布式系统的应用程序性能监督工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。提供分布式追踪、服务网格遥测剖析、度量聚合和可视化一体化解决方案。

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

2、SkyWalking 个性
多种监控伎俩,语言探针和 Service Mesh
多语言主动探针,Java,.NET Core 和 Node.JS
轻量高效,不须要大数据
模块化,UI、存储、集群治理多种机制可选
反对告警
优良的可视化计划
3、整体构造

整个架构,分成上、下、左、右四局部:

思考到让形容更简略,咱们舍弃掉 Metric 指标相干,而着重在 Tracing 链路相干性能。

上局部 Agent:负责从利用中,收集链路信息,发送给 SkyWalking OAP 服务器。目前反对 SkyWalking、Zikpin、Jaeger 等提供的 Tracing 数据信息。而咱们目前采纳的是,SkyWalking Agent 收集 SkyWalking Tracing 数据,传递给服务器。
下局部 SkyWalking OAP:负责接管 Agent 发送的 Tracing 数据信息,而后进行剖析 (Analysis Core),存储到内部存储器(Storage),最终提供查问(Query) 性能。

右局部 Storage:Tracing 数据存储。目前反对 ES、MySQL、Sharding Sphere、TiDB、H2 多种存储器。而咱们目前采纳的是 ES,次要思考是 SkyWalking 开发团队本人的生产

左局部 SkyWalking UI:负责提供控台,查看链路等等
简略详情原理为下图:
![上传中 …]()

二、搭建 skywalking
1、环境筹备
Mkubernetes 版本:1.18.5
Nginx Ingress 版本:2.2.8
Helm 版本:3.2.4
长久化存储驱动:NFS
2、应用 chart 部署
本文次要讲述的是如何应用 Helm Charts 将 SkyWalking 部署到 Kubernetes 集群中,相干文档能够参考 skywalking-kubernetes

目前举荐的四种形式:

应用 helm 3 提供的 helm serve 启动本地 helm repo
应用本地 chart 文件部署
应用 harbor 提供的 repo 性能
间接从官网 repo 进行部署(暂不满足)

留神:目前 skywalking 的 chart 还没有提交到官网仓库,请先参照前三种形式进行部署


2.1、下载 chart 文件
能够间接应用本地文件部署 skywalking, 依照下面的步骤将 skywalking chart 下载实现之后,间接应用以下命令进行部署:

git clone https://github.com/apache/sky…
cd skywalking-kubernetes/chart
helm repo add elastic https://helm.elastic.co
helm dep up skywalking
export SKYWALKING_RELEASE_NAME=skywalking # 定义本人的名称
export SKYWALKING_RELEASE_NAMESPACE=default # 定义本人的命名空间
2.2、定义已存在 es 参数文件
批改 values-my-es.yaml:

oap:
image:

tag: 8.1.0-es7      # Set the right tag according to the existing Elasticsearch version

storageType: elasticsearch7

ui:
image:

tag: 8.1.0

elasticsearch:
enabled: false
config: # For users of an existing elasticsearch cluster,takes effect when elasticsearch.enabled is false

host: elasticsearch-client
port:
  http: 9200
user: "elastic"         # [optional]
password: "admin@123"     # [optional]

2.3、helm 装置
helm install “${SKYWALKING_RELEASE_NAME}” skywalking -n “${SKYWALKING_RELEASE_NAMESPACE}” \
-f ./skywalking/values-my-es.yaml
装置实现后,咱们核实下装置状况:

$ kubectl get deployment -n skywalking
NAME READY UP-TO-DATE AVAILABLE AGE
my-skywalking-oap 2/2 2 2 9m
my-skywalking-ui 1/1 1 1 9m
三、应用 Skywalking Agent
Java 中应用 agent,提供了以下三种形式供你抉择

应用官网提供的根底镜像
将 agent 包构建到曾经存在的根底镜像中
sidecar 模式挂载 agent(举荐)
1、应用官网提供的根底镜像
查看官网 docker hub 提供的根底镜像,只须要在你构建服务镜像是 From 这个镜像即可,间接集成到 Jenkins 中能够更加不便

2、将 agent 包构建到曾经存在的根底镜像中
提供这种形式的起因是:官网的镜像属于精简镜像,并且是 openjdk,可能很多命令没有,须要本人二次装置,这里略过。

3、sidecar 模式挂载 agent
因为服务是部署在 Kubernetes 中,应用这种形式来应用 Skywalking Agent , 这种形式的益处在不须要批改原来的根底镜像,也不必从新构建新的服务镜像,而是以 sidecar 模式,通过共享 volume 的形式将 agent 所需的相干文件挂载到曾经存在的服务镜像中。

3.1、构建 skywalking agent image
本人构建, 参考:https://hub.docker.com/r/prop…

通过以下 dockerfile 进行构建:

FROM alpine:3.8

LABEL maintainer=”zmailto:uozewei@hotmail.com”

ENV SKYWALKING_VERSION=8.1.0

ADD http://mirrors.tuna.tsinghua….${SKYWALKING_VERSION}/apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz /

RUN tar -zxvf /apache-skywalking-apm-${SKYWALKING_VERSION}.tar.gz && \

mv apache-skywalking-apm-bin skywalking && \
mv /skywalking/agent/optional-plugins/apm-trace-ignore-plugin* /skywalking/agent/plugins/ && \
echo -e "\n# Ignore Path" >> /skywalking/agent/config/agent.config && \
echo "# see https://github.com/apache/skywalking/blob/v8.1.0/docs/en/setup/service-agent/java-agent/agent-optional-plugins/trace-ignore-plugin.md" >> /skywalking/agent/config/agent.config && \
echo 'trace.ignore_path=${SW_IGNORE_PATH:/health}' >> /skywalking/agent/config/agent.config

docker build -t 172.16.106.237/monitor/skywalking-agent:8.1.0 .
待 docker build 结束后,push 到仓库即可。

3.2、应用 sidecar 挂载
示例配置文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-skywalking
spec:
replicas: 1
selector:

matchLabels:
  app: demo-skywalking

strategy:

rollingUpdate:
  maxSurge: 1
  maxUnavailable: 0
type: RollingUpdate

template:

metadata:
  labels:
    app: demo-skywalking
spec:
  initContainers:
    - name: init-skywalking-agent
      image: 172.16.106.237/monitor/skywalking-agent:8.1.0
      command:
        - 'sh'
        - '-c'
        - 'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent;'
      volumeMounts:
        - mountPath: /vmskywalking/agent
          name: skywalking-agent
  containers:
    - image: nginx:1.7.9
      imagePullPolicy: Always
      name: nginx
      ports:
        - containerPort: 80
          protocol: TCP
      volumeMounts:
        - mountPath: /opt/skywalking/agent
          name: skywalking-agent
  volumes:
    - name: skywalking-agent
      emptyDir: {}

以上是挂载 sidecar 的 deployment.yaml 文件,以 nginx 作为服务为例,次要是通过共享 volume 的形式挂载 agent,首先 initContainers 通过 skywalking-agent 卷挂载了 sw-agent-sidecar 中的 /vmskywalking/agent,并且将下面构建好的镜像中的 agent 目录 cp 到了 /vmskywalking/agent 目录,实现之后 nginx 启动时也挂载了 skywalking-agent 卷,并将其挂载到了容器的 /opt/skywalking/agent 目录,这样就实现了共享过程。

四、革新 Spring Cloud 利用
1、docker 打包并推送到仓库
批改下 dockerfile 配置,集成 skywalking agent:

FROM insideo/centos7-java8-build
VOLUME /tmp
ADD mall-admin.jar app.jar
RUN bash -c ‘touch /app.jar’
RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone
ENTRYPOINT [“java”,”-Dapp.id=svc-mall-admin”,”-javaagent:/opt/skywalking/agent/skywalking-agent.jar”,”-Dskywalking.agent.service_name=svc-mall-admin”,”-Dskywalking.collector.backend_service=my-skywalking-oap.skywalking.svc.cluster.local:11800″,”-jar”,”-Dspring.profiles.active=prod”,”-Djava.security.egd=file:/dev/./urandom”,”/app.jar”]
改好了,间接运行 maven package 就能将这个我的项目打包成镜像。

留神:


k8s 创立 Service 时,它会创立相应的 DNS 条目。此条目标格局为 <service-name>.<namespace-name>.svc.cluster.local,这意味着如果容器只应用 <service-name>,它将解析为本地服务到命名空间。如果要跨命名空间拜访,则须要应用齐全限定的域名。


2、编写 k8s 的 yaml 版本的部署脚本
这里我以其中某服务举例:


apiVersion: apps/v1
kind: Deployment
metadata:
name: svc-mall-admin
spec:
replicas: 1
selector:

matchLabels:
  app: svc-mall-admin

strategy:

rollingUpdate:
  maxSurge: 1
  maxUnavailable: 0
type: RollingUpdate

template:

metadata:
  labels:
    app: svc-mall-admin
spec:
  initContainers:
    - name: init-skywalking-agent
      image: 172.16.106.237/monitor/skywalking-agent:8.1.0
      command:
        - 'sh'
        - '-c'
        - 'set -ex;mkdir -p /vmskywalking/agent;cp -r /skywalking/agent/* /vmskywalking/agent;'
      volumeMounts:
        - mountPath: /vmskywalking/agent
          name: skywalking-agent
  containers:
    - image: 172.16.106.237/mall_repo/mall-admin:1.0
      imagePullPolicy: Always
      name: mall-admin
      ports:
        - containerPort: 8180
          protocol: TCP
      volumeMounts:
        - mountPath: /opt/skywalking/agent
          name: skywalking-agent
  volumes:
    - name: skywalking-agent
      emptyDir: {}

apiVersion: v1
kind: Service
metadata:
name: svc-mall-admin
spec:
ports:

- name: http
  port: 8180
  protocol: TCP
  targetPort: 8180

selector:

app: svc-mall-admin

而后就能够间接运行了, 它就能够将的我的项目全副跑起来了。

五、测试验证
完事,能够去 SkyWalking UI 查看是否链路收集胜利。

1、测试利用 API
首先,申请下 Spring Cloud 利用提供的 API。因为,咱们要追踪下该链路。

2、查看 SkyWalking UI 界面

在这里插入图片形容
这里,咱们会看到 SkyWalking 中十分重要的三个概念:

服务(Service):示意对申请提供雷同行为的一系列或一组工作负载。在应用 Agent 或 SDK 的时候,你能够定义服务的名字。如果不定义的话,SkyWalking 将会应用你在平台(例如说 Istio)上定义的名字。这里,咱们能够看到 Spring Cloud 利用的服务为 svc-mall-admin,就是咱们在 agent 环境变量 service_name 中所定义的。

服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例。就像 Kubernetes 中的 pods 一样, 服务实例未必就是操作系统上的一个过程。但当你在应用 Agent 的时候, 一个服务实例理论就是操作系统上的一个实在过程。这里,咱们能够看到 Spring Cloud 利用的服务为 UUID@hostname,由 Agent 主动生成。

端点(Endpoint):对于特定服务所接管的申请门路, 如 HTTP 的 URI 门路和 gRPC 服务的类名 + 办法签名。

这里,咱们能够看到 Spring Cloud 利用的一个端点,为 API 接口 /mall-admin/admin/login。

更多 agent 参数介绍参考:https://github.com/apache/sky…

点击「拓扑图」菜单,进入查看拓扑图的界面:
点击「追踪」菜单,进入查看链路数据的界面:

六、小结
本文具体介绍了如何应用 Kubernetes + Spring Cloud 集成 SkyWalking,顺便说下调用链监控在目前的微服务零碎外面是必不可少的组件,分布式追踪、服务网格遥测剖析、度量聚合和可视化还是挺好用的,这里咱们抉择了 Skywalking,具体起因和细节的玩法就不在此详述了。

正文完
 0