Kubernetes + Spring Cloud 集成鏈路追蹤 SkyWalking

      網友投稿 1082 2025-03-31

      概述


      什么是 SkyWalking ?

      分布式系統的應用程序性能監視工具,專為微服務、云原生架構和基于容器(Docker、K8s、Mesos)架構而設計。

      提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。

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

      SkyWalking 特性

      多種監控手段,語言探針和 Service Mesh

      多語言自動探針,Java,.NET Core和Node.JS

      輕量高效,不需要大數據

      模塊化,UI、存儲、集群管理多種機制可選

      支持告警

      優秀的可視化方案

      整體結構

      整個架構,分成上、下、左、右四部分:

      考慮到讓描述更簡單,我們舍棄掉 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 開發團隊自己的生產環境采用 ES 為主。

      左部分 SkyWalking UI :負責提供控臺,查看鏈路等等

      簡單概況原理為下圖:

      搭建 skywalking

      環境準備

      Mkubernetes 版本:1.18.5

      Nginx Ingress 版本:2.2.8

      Helm 版本:3.2.4

      持久化存儲驅動:NFS

      使用 chart 部署

      本文主要講述的是如何使用 Helm Charts 將 SkyWalking 部署到 Kubernetes 集群中,相關文檔可以參考skywalking-kubernetes

      目前推薦的四種方式:

      使用 helm 3 提供的 helm serve 啟動本地 helm repo

      Kubernetes + Spring Cloud 集成鏈路追蹤 SkyWalking

      使用本地 chart 文件部署

      使用 harbor 提供的 repo 功能

      直接從官方 repo 進行部署(暫不滿足)

      注意:目前 skywalking 的 chart 還沒有提交到官方倉庫,請先參照前三種方式進行部署

      可以直接使用本地文件部署 skywalking,按照上面的步驟將skywalking chart下載完成之后,直接使用以下命令進行部署:

      git clone https://github.com/apache/skywalking-kubernetes 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 # 定義自己的命名空間

      修改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]

      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(推薦)

      使用官方提供的基礎鏡像

      查看官方 docker hub 提供的基礎鏡像,只需要在你構建服務鏡像是 From 這個鏡像即可,直接集成到 Jenkins 中可以更加方便

      將 agent 包構建到已經存在的基礎鏡像中

      提供這種方式的原因是:官方的鏡像屬于精簡鏡像,并且是 openjdk ,可能很多命令沒有,需要自己二次安裝,這里略過。

      sidecar 模式掛載 agent

      由于服務是部署在 Kubernetes 中,使用這種方式來使用 Skywalking Agent ,這種方式的好處在與不需要修改原來的基礎鏡像,也不用重新構建新的服務鏡像,而是以sidecar 模式,通過共享 volume 的方式將 agent 所需的相關文件掛載到已經存在的服務鏡像中。

      自己構建,參考:https://hub.docker.com/r/prophet/skywalking-agent

      通過以下 dockerfile 進行構建:

      FROM alpine:3.8 LABEL maintainer="zuozewei@hotmail.com" ENV SKYWALKING_VERSION=8.1.0 ADD http://mirrors.tuna.tsinghua.edu.cn/apache/skywalking/${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 到倉庫即可。

      示例配置文件如下:

      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 應用

      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 條目。此條目的格式為 ..svc.cluster.local,這意味著如果容器只使用,它將解析為本地服務到命名空間。 如果要跨命名空間訪問,則需要使用完全限定的域名。

      編寫 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 查看是否鏈路收集成功。

      測試應用 API

      首先,請求下 Spring Cloud 應用提供的 API。因為,我們要追蹤下該鏈路。

      查看 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/skywalking/blob/v8.1.0/docs/en/setup/service-agent/java-agent/README.md

      點擊「拓撲圖」菜單,進入查看拓撲圖的界面:

      點擊「追蹤」菜單,進入查看鏈路數據的界面:

      小結

      本文詳細介紹了如何使用 Kubernetes + Spring Cloud 集成 SkyWalking,順便說下調用鏈監控在目前的微服務系統里面是必不可少的組件,分布式追蹤、服務網格遙測分析、度量聚合和可視化還是挺好用的,這里我們選擇了 Skywalking,具體原因和細節的玩法就不在此詳述了。

      本文源碼:

      https://github.com/zuozewei/blog-example/tree/master/Kubernetes/k8s-skywalking

      Kubernetes Spring Spring Cloud

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:網運信息系統生產作業(物流信息系統作業)
      下一篇:Atlas 200 DK使用FAQ】SD卡制作過程中人為拔卡導致系統存在冗余掛載盤
      相關文章
      亚洲精品二三区伊人久久| 国产成人A亚洲精V品无码 | 亚洲精品国产V片在线观看 | 久久亚洲av无码精品浪潮| 麻豆亚洲AV成人无码久久精品 | 亚洲avav天堂av在线不卡| 亚洲色大成网站WWW久久九九| 久久久久亚洲AV综合波多野结衣 | 精品日韩亚洲AV无码一区二区三区| 亚洲va中文字幕无码久久| 久久国产亚洲精品麻豆| 精品国产亚洲一区二区三区| 亚洲成亚洲乱码一二三四区软件| 国产亚洲综合成人91精品| 国产亚洲成av片在线观看 | 亚洲国产成人久久一区二区三区| 亚洲欧美日韩中文高清www777| 亚洲性色精品一区二区在线| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲av无码久久忘忧草| 亚洲国产乱码最新视频| 亚洲日韩精品无码专区加勒比| 亚洲色偷偷色噜噜狠狠99网| 亚洲成在人线aⅴ免费毛片| 国产精品亚洲专区无码唯爱网| 国产亚洲女在线线精品| 亚洲视频人成在线播放| 久久久久亚洲精品无码网址| 亚洲理论电影在线观看| 亚洲成a人片77777老司机| 亚洲国产成人久久综合碰碰动漫3d| 亚洲尹人九九大色香蕉网站| 亚洲成无码人在线观看| 亚洲а∨天堂久久精品9966| 久久亚洲精品无码av| 亚洲中文字幕成人在线| 日韩va亚洲va欧洲va国产| 色播亚洲视频在线观看| 亚洲一区无码中文字幕乱码| 亚洲欧美日韩自偷自拍| 亚洲国产精品无码久久青草 |