使用 Skywalking 對 Kubernetes(K8s)中的微服務進行監控

追風人聊Java發表於2021-12-05

1. 概述

老話說的好:任何成功都不是輕易得來的,是不斷地堅持與面對的結果。

 

言歸正傳,之前我們聊了 SpringCloud 開發的微服務是如何部署在  Kubernetes(K8s)叢集中的,今天我們來聊聊在 Kubernetes(K8s)叢集中是如何監控這些微服務的。

apache 的 Skywalking 就是一個不錯的選擇,SkyWalking 是一個可觀察性分析平臺和應用程式效能管理系統,可以對微服務進行鏈路追蹤,可以對微服務的指標進行分析,可以快速定位執行慢的服務。

Skywalking官網地址:https://skywalking.apache.org/

 

今天我們就來搭建一套 Skywalking 服務,監控一下我們之前搭建在 Kubernetes(K8s)叢集中的微服務。

 

2. 場景介紹

在伺服器 192.168.1.15 中,搭建並啟動 Skywalking 控制檯。

 

改造之前部署的 Eureka Client 服務 和 Gateway 服務,在服務中植入 Skywalking Java 代理。

微服務的部署詳情可參見我的上一篇文章《Kubernetes(K8s)部署 SpringCloud 服務實戰》(https://www.cnblogs.com/w84422/p/15630185.html

 

3. Skywalking 控制檯的搭建 

3.1 下載 Skywalking 控制檯程式

官網下載地址:https://skywalking.apache.org/downloads/

 

 

 

3.2 將程式包上傳到 CentOS7 伺服器,並解壓

這裡上傳到 /home 目錄

# tar -zxvf apache-skywalking-apm-8.8.1.tar.gz

 

3.3 啟動 Skywalking 控制檯

注意:該伺服器要預先安裝 JDK8,並在環境變數中設定。

Skywalking 會佔用 8080 和 11800 埠。

# cd /home/apache-skywalking-apm-bin/bin

# ./startup.sh

 

3.4 在瀏覽器訪問 Skywalking 控制檯 

http://192.168.1.15:8080

 

 

 

4. 在微服務中植入 Skywalking Java 代理

4.1 概述

在微服務中需要植入 Skywalking Java 代理,才能將執行資料傳遞給 Skywalking 控制檯。

Skywalking 的 Java 代理,支援 java -jar、Tomcat、Docker、Kubernetes(K8s)等。

 

4.2 java -jar 方式植入代理

1)首先從官網下載 SkyWalking Java Agent 程式,上傳到 CentOS7 伺服器,解壓

官網下載地址:https://skywalking.apache.org/downloads/

 

 

2)在 CentOS7 伺服器設定環境變數

SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制檯的地址,例如:192.168.1.15:11800,預設是 127.0.0.1:11800

 

3)啟動微服務時,使用以下方式

# java -javaagent:/path/to/skywalking-agent/skywalking-agent.jar=agent.service_name=服務的名稱 -jar yourApp.jar

/path/to/skywalking-agent/skywalking-agent.jar 替換成真實的 SkyWalking Java Agent 所在的路徑。

agent.service_name 是服務的名稱,用於 Skywalking 控制檯中的顯示。

 

4.3 Docker 中的微服務植入代理

1)編排 Dockerfile 檔案

將之前的 FROM java:8 替換為 FROM apache/skywalking-java-agent:8.5.0-jdk8 即可,其他不用動

 

2)設定環境變數

SW_AGENT_NAME:容器中服務的名稱,用於 Skywalking 控制檯中的顯示。

SW_AGENT_COLLECTOR_BACKEND_SERVICES:Skywalking控制檯的地址,例如:192.168.1.15:11800,預設是 127.0.0.1:11800

 

4.4 Kubernetes(K8s)中的微服務植入代理

4.4.1 重新部署 eureka client 的 Deployment

1)編輯指令碼

vi eurekaclient-deployment-sw.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-eureka-client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-eureka-client
  template:
    metadata:
      labels:
        app: my-eureka-client
    spec:
      volumes:
        - name: skywalking-agent
          emptyDir: { }

      initContainers:
        - name: agent-container
          image: apache/skywalking-java-agent:8.7.0-alpine
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]

      containers:
        - name: my-eureka-client
          image: myeurekaclient:1.0
          volumeMounts:
            - name: skywalking-agent
              mountPath: /skywalking
          env:
            - name: JAVA_TOOL_OPTIONS
              value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
            - name: SW_AGENT_NAME
              value: "my-eureka-client"
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: "192.168.1.15:11800"

指令碼的大概意思是pull apache/skywalking-java-agent:8.7.0-alpine 映象,然後掛載一個空目錄,將 Skywalking 的 Java 代理程式拷貝到目錄中,然後微服務的容器也去掛載這個目錄,並使用裡面的檔案,配合環境變數向 Skywalking 控制檯傳送資料。

 

2)刪除之前 deployment

# kubectl delete deployment my-eureka-client

 

3)執行指令碼

# kubectl apply -f eurekaclient-deployment-sw.yml

 

4.4.2 重新部署 Gateway 的 Deployment

1)編輯指令碼

vi gateway-deployment-sw.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-gateway
  template:
    metadata:
      labels:
        app: my-gateway
    spec:
      volumes:
        - name: skywalking-agent
          emptyDir: { }

      initContainers:
        - name: agent-container
          image: apache/skywalking-java-agent:8.7.0-alpine
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          command: [ "/bin/sh" ]
          args: [ "-c", "cp -R /skywalking/agent /agent/" ]

      containers:
        - name: my-gateway
          image: mygateway:1.0
          volumeMounts:
            - name: skywalking-agent
              mountPath: /skywalking
          env:
            - name: JAVA_TOOL_OPTIONS
              value: "-javaagent:/skywalking/agent/skywalking-agent.jar"
            - name: SW_AGENT_NAME
              value: "my-gateway"
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: "192.168.1.15:11800"

 

2)刪除之前 deployment

# kubectl delete my-gateway

 

3)執行指令碼

# kubectl apply -f gateway-deployment-sw.yml

 

4.4.3 訪問 Eureka Client 的簡單介面

GET http://192.168.1.12:44000/my-eureka-client/eurekaClient/hello

 

4.4.4 Skywalking Demo資料展示 

 此時可以從 Skywalking 中看到介面的呼叫情況,一些指標的統計圖,拓撲圖、鏈路追蹤等資訊,可以幫助我們很好的監控叢集,定位問題,快速的對微服務進行優化。

 

  

 

 

 

 

 

 

 

 

 

 

5. 綜述

今天聊了一下 kubernetes(k8s)叢集中的微服務是如何被 Skywalking 監控的,希望可以對大家的工作有所幫助。

歡迎幫忙點贊、評論、轉發、加關注 :)

關注追風人聊Java,每天更新Java乾貨。

 

6. 個人公眾號

追風人聊Java,歡迎大家關注

 

相關文章