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 控制檯
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,歡迎大家關注