使用 Skywalking Agent,這里使用sidecar 模式掛載 agent


文章轉載自:https://bbs.huaweicloud.com/blogs/315037

方法匯總

Java 中使用 agent ,提供了以下三種方式供你選擇

  • 使用官方提供的基礎鏡像
  • 將 agent 包構建到已經存在的基礎鏡像中
  • sidecar 模式掛載 agent(推薦)

使用官方提供的基礎鏡像

查看官方 docker hub 提供的基礎鏡像,只需要在你構建服務鏡像是 From 這個鏡像即可,直接集成到 Jenkins 中可以更加方便
但是這樣以來,項目鏡像會變得比較大,因為里面多了agent 包

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

提供這種方式的原因是:官方的鏡像屬於精簡鏡像,並且是 openjdk ,可能很多命令沒有,需要自己二次安裝,這里略過。
但是這樣以來,項目鏡像會變得比較大,因為里面多了agent 包

sidecar 模式掛載 agent

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

構建 skywalking agent image

通過以下 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 完畢后,push 到倉庫即可。

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

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

查看 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 服務的類名 + 方法簽名。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM