【云原生 | Kubernetes 系列】---Skywalking部署和监控
【云原生 | Kubernetes 系列】—Skywalking部署和監控
1. 分布式鏈路追蹤概念
在較大的web集群和微服務環境中,客戶端的一次請求可能需要經過多個不同的模塊,多個不同中間件,多個不同的機器一起相互協作才能處理完成客戶端請求,而在這一系列的請求過程之中,處理流程可能是串行執行,也可能是并行執行.那么如何確定客戶端的一次請求到結束背后究竟調用了哪些應用以及哪些模塊并經過了哪些節點,并且每個模塊的調用先后順序是怎么樣的,每個模塊的處理響應性能如何?后期隨著業務系統的不斷增多,業務處理邏輯會越來越復雜,而分布式系統中急需要一套鏈路追蹤(Trace)系統來解決這個問題,從而讓運維人員對整個業務系統一目了然,了如指掌.
分布式服務追蹤系統是整個分布式系統中跟蹤一個用戶請求的完整過程,包過數據采集,數據傳輸,數據存儲,數據分析和數據可視化,獲取并存儲和分享此類追蹤可以讓運維清晰了解用戶請求與業務系統交互背后的整個調用鏈的調用關系,鏈路追蹤系統是針對調試和監控微服務不可或缺的幫手
Dapper是google 2008年開始內部使用的鏈路追蹤系統.
2. Dapper采集
分布式追蹤方法:
黑盒法(black-box)
無需任何侵入代碼,它的優勢在于無需修改代碼,缺點在于記錄不是很精確,且需要大量數據才能推導出服務間的關系.
標記法(annotation-based)
需要為每個請求打標記,并通過一個全局標識符將請求途徑的所有服務信息串聯,復盤整個鏈路,標記法記錄準確,但他的缺點也很明顯,需要將標記代碼注入到每個服務中.
Span代表系統中具有開始時間和執行時長的請求跨度,span之間通過嵌入或者順序排列建立邏輯因果關系.
任何一個Span可以包含來自不同的主機信息,這些也要記錄下來.事實上每一個RPC Span可以包含客戶端和服務器兩個過程注釋.由于客戶端和服務器上的時間戳來自不同主機,還必須考慮到時間偏差,在分析工具就利用了時間偏差,即RPC客戶端發送一個請求之后服務端才能收到,對應響應也是一樣的.這樣一來服務器的RPC就有一個時間戳的一個開始和結束,然后就計算出時間消耗.
Dapper跟蹤記錄和收集管道的過程分為三階段:
一個跟蹤被設計成Bigtable中的一行,每一列相當于一個Span.Bigtable的支持稀疏表格布局正適合這種情況,因為每一次跟蹤可以有任意多個span.
Dapper資源占用很小
Dapper守護進程CPU使用率從來沒超過0.3%單核CPU.而且只有少量的內存使用,另外還限制了Dapper守護進程內核scheduler最低的優先級,以防在一臺高負載的服務器上發生cpu競爭.
一個span在倉庫傳輸中占用平均426byte
2.1 Dapper應用場景
3. 分布式鏈路系統APM
APM系統(Application Performance Management)性能管理系統
早起APM功能主要在監控CPU,內存,IO,網絡等資源上
微服務興起后,系統功能被模塊化,再加上k8s與容器化的興起及應用數據量的爆炸式增長,各模塊和服務之間的調用鏈路,響應時間,負載等越來越不好通過傳統的工具進行監控和統計,此時APM系統誕生了.
4. Skywalking 特點
實現從請求跟蹤,指標收集和日志記錄的完整信息記錄
多語言自動探針,支持java,go,python,php,nodejs,Lua,Rust等客戶端
內置服務器網絡可觀察性,支持從Istio+Envoy Service Mesh收集和分析數據
模塊化架構,存儲,集群管理,使用插件集合都可以進行自由選擇.
支持告警.
優秀的可視化效果.
4.1 Skywalking組件
OAP平臺(Observability Analysis Platform,可觀測性分析平臺)或OAP Server,它是一個高度組件化的輕量級分析程序,由兼容各種探針Receiver,流式分析內核和查詢內核三部分構成.
探針: 基于無侵入式的收集,并通過HTTP或者gRPC方式發送數據到OAP Server
存儲實現(Sotrage Implementors)SkyWalking OAP Server支持多種存儲實現并且提供了標準接口,可支持不同的存儲后端.
UI模塊(Skywalking)通過標準的GraphQL(Facebook 2012年開源)協議進行統計數據查詢和展示.
面向協議設計: 面向協議設計時SkyWalking從5.X開始嚴格遵守的首要設計原則,組件之間使用標準的協議進行數據交互
4.2 SkyWalking協議
協議有探針協議和查詢協議
探針協議:
探針上報協議: 協議包括語言探針的注冊,Metrics數據上報,Tracing數據上報等標準,Java,Go等探針都需要嚴格遵守此協議的標準.
探針交互協議:因為分布式追蹤環境,探針間需要借助HTTP Header,MQ Header在應用之間進行通信和交互,探針交互協議就定義了交互的數據格式
Service Mesh 協議: 是SkyWalking對Service Mesh抽象的專有協議,任何Mesh類的服務都可以通過此協議直接上傳指標數據,用于計算服務的指標數據和繪制拓撲圖.
第三方協議: 對大型的第三方開源項目尤其是Service Mesh核心平臺Istio和Envoy,提供核心協議適配,支持針對Istio+Envoy Service Mesh進行無縫對接.
查詢協議:
元數據查詢: 查詢在skywalking注冊的服務,服務實例,Endpoint等元數據信息.
拓撲關系查詢: 查詢全局,或單個服務,Endpoint的拓撲圖及依賴關系.
Metrics指標查詢:區間范圍均值查詢及Top N排名查詢等.
Trace查詢: 追蹤數據的明細查詢.
告警查詢: 基于表達式,判斷指標數據是否超出閾值.
4.3 SkyWalking模塊
模塊化設計:
- 探針負責收集數據 - 前端負責展示數據 - OAP Server負責從后端存儲讀寫數據 - 后端存儲負責持久化數據輕量化設計:
? SkyWalking在設計之初就提出了輕量化的設計理念,skywalking使用最輕量級的jar包模式,實現強大的數據處理和分析能力,可擴展能力和模塊化能力
4.4 SkyWalking優勢
SkyWalking優勢:
5. SkyWalking部署
| skywalking-oap | 192.168.31.232 | 11800(寫),12800(讀) | OAP觀測性分析平臺Server端 |
| es-1 | 192.168.31.41 | 9200 | ES數據庫Version: 7.12.1 |
| es-2 | 192.168.31.42 | 9200 | ES數據庫Version: 7.12.1 |
| es-3 | 192.168.31.43 | 9200 | ES數據庫Version: 7.12.1 |
| zookeeper-1 | 192.168.31.121 | 2181 | zookeeper節點 |
| zookeeper-2 | 192.168.31.122 | 2181 | zookeeper節點 |
| zookeeper-3 | 192.168.31.123 | 2181 | zookeeper節點 |
| django | 192.168.31.231 | 80 | django服務端 |
創建skywalking工作目錄及下載skywalking
mkdir /apps && cd /apps wget https://dlcdn.apache.org/skywalking/9.2.0/apache-skywalking-apm-9.2.0.tar.gz tar xf apache-skywalking-apm-9.2.0.tar.gz apt install openjdk-11-jdk -y ## 確認jdk安裝版本正確 root@skywalking-oap:/apps# java --version openjdk 11.0.16 2022-07-19 OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)5.2 配置skywalking
cd /apps/apache-skywalking-apm-bin vim config/application.yml修改133行和136行,指定elasticsearch為數據庫及elasticsearch的集群地址
storage:selector: ${SW_STORAGE:elasticsearch}elasticsearch:namespace: ${SW_NAMESPACE:""}## 單機ES## clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.31.41:9200}## ES集群多個ip用逗號,分割clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.31.41:9200,192.168.31.42:9200,192.168.31.43:9200}其他幾個重要參數
# 配置你的elasticsearch服務的IP和端口,集群IP請用“,”逗號隔開 clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.31.41:9200} clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:192.168.31.41:9200,192.168.31.42:9200,192.168.31.43:9200} #存儲最多7天的內容,過期數據將會清理。因此請根據實際需求進行調整recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day# 每10秒刷新數據到收集器中flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10}# 提供2個并發請求,如果系統業務量大,日志產生的非???#xff0c;請根據實況調整concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2}5.3 啟動skywalking
啟動skywalking服務
# /apps/apache-skywalking-apm-bin/bin/startup.sh SkyWalking OAP started successfully! SkyWalking Web Application started successfully!確認skywalk是否正常啟動,如果正常啟動會在es數據庫里創建數據.
skywalking正常啟動后監聽8080端口
可以通過192.168.31.232:8080訪問skywalking
6. 監控案例
6.1 單體jar包監控
6.1.1 Halo 環境準備
Halo需要jdk11以上版本
yum install -y java-11-openjdk mkdir /apps/halo -p && cd /apps/halo curl -L https://github.com/halo-dev/halo/releases/download/v1.5.4/halo-1.5.4.jar --output halo.jar cd /apps wget https://dlcdn.apache.org/skywalking/java-agent/8.12.0/apache-skywalking-java-agent-8.12.0.tgz tar xf apache-skywalking-java-agent-8.12.0.tgz vi /apps/skywalking-agent/config/agent.config6.1.2 配置skywalking agent
修改/apps/skywalking-agent/config/agent.config配置
# The group name is optional only. # 在UI顯示,服務的名字 agent.service_name=${SW_AGENT_NAME:Halo}# The agent namespace # 不顯示,一般是所屬項目 agent.namespace=${SW_AGENT_NAMESPACE:Qiu}# Backend service addresses. # skywalk server 地址 collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:192.168.31.232:11800}啟動服務
java -javaagent:/apps/skywalking-agent/skywalking-agent.jar -jar /apps/halo/halo.jar如果是容器可以
java -javaagent:/apps/skywalking-agent/skywalking-agent.jar \ -DSW_AGENT_NAMESPACE=Qiu\ -DSW_AGENT_NAME=Halo\ -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.31.232:11800\ -jar /apps/halo/halo.jar6.1.3 配置halo 環境
6.1.4 訪問測試
測試發幾個博客 nodeip:8090/admin/
此時SkyWalking可以看到有流量數據
6.1.5 儀表盤
Apdex(應用性能指數),是由Apdex聯盟開放的用于評估應用性能的標準,Apdex聯盟起源于2004年,Apdex標準從用戶的角度發出,提供了一個統一的測量和報告用戶體驗的方法,將其量化為范圍0-1的滿意度評價,把最終用戶體驗和應用性能作為一個完整的指標進行統一度量.
在網絡中運行的一個應用服務,它的響應時間決定了用戶的滿意程度,用戶等待所有交互完整時間的長短直接影響了用戶對應用的滿意程度,這才是對用戶有真正意義的"響應時間",Apdex把完成這樣一個任務所用的時間長短稱為應用的"響應性"
Apdex定義了應用響應時間的最優門檻為T,根據應用響應時間結合T定義了三種不同的性能表現:
服務:表示對請求提供相同行為的一系列或一組工作負載(服務名稱),在使用Agent或者SDK的時候,可以定義服務的名字,如果不定義的話,SkyWalking將會使用你平臺上定義的名字.
服務實例:上述的一組工作負載中的每一個工作負載稱為一個實例(一個服務運行的節點),一個服務實例可以是一個kubernetes中的pod或者是一個虛擬機甚至于物理機.
端點:對于特定服務所接收的請求路徑,如http的rui路徑和rpc服務的類+方法簽名,如/api/v1/
6.2 Tomcat 環境監控
6.2.1 安裝環境
mkdir /apps ## 下載apache-tomcat-8.5.73.tar.gz,apache-skywalking-java-agent-8.12.0.tgz和jenkins.war(2.319.2) tar xf apache-tomcat-8.5.73.tar.gz ln -sf /apps/apache-tomcat-8.5.73 /apps/tomcat mv jenkins.war tomcat/webapps/ tar xf apache-skywalking-java-agent-8.12.0.tgzSkyWalking-agent依然配置以下3行
skywalking-agent/config/agent.config
配置tomcat啟動文件
vi /apps/tomcat/bin/catalina.sh追加以下行 用以加載SkyWalking-agent 125行插入
JAVA_OPTS="$JAVA_OPTS -javaagent:/apps/skywalking-agent/skywalking-agent.jar"6.2.2 啟動tomcat
[root@centos-18 apps]# /apps/tomcat/bin/startup.sh Using CATALINA_BASE: /apps/tomcat Using CATALINA_HOME: /apps/tomcat Using CATALINA_TMPDIR: /apps/tomcat/temp Using JRE_HOME: /usr Using CLASSPATH: /apps/tomcat/bin/bootstrap.jar:/apps/tomcat/bin/tomcat-juli.jar Using CATALINA_OPTS: -javaagent:/apps/skywalking-agent/skywalking-agent.jar Tomcat started. [root@centos-18 apps]# ss -ntl|grep 8080 LISTEN 0 100 *:8080 *:*此時訪問skywalking-ui
6.3 微服務監控
6.3.1 生產者
上傳dubbo-demo-provider-2.1.5-assembly.tar.gz
tar xf dubbo-demo-provider-2.1.5-assembly.tar.gz vi /apps/dubbo-demo-provider-2.1.5/conf/dubbo.properties # 配置zookeeper連接 ## 單個zookeeper ## dubbo.registry.address=zookeeper://192.168.31.122:2181 ## zookeeper集群 dubbo.registry.address=zookeeper://192.168.31.122:2181?backup=192.168.31.121:2181,192.168.31.123:2181配置skywalking-agent
vi skywalking-agent/config/agent.config
運行生產者
java -javaagent:/apps/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo-demo-provider-2.1.5/conf:/apps/dubbo-demo-provider-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo-demo-provider-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/dubbo-demo-provider-2.1.5.jar:/apps/dubbo-demo-provider-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo-demo-provider-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo-demo-provider-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo-demo-provider-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo-demo-provider-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo-demo-provider-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo-demo-provider-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo-demo-provider-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo-demo-provider-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo-demo-provider-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo-demo-provider-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo-demo-provider-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo-demo-provider-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo-demo-provider-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo-demo-provider-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo-demo-provider-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo-demo-provider-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo-demo-provider-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main啟動成功
[3.057s][warning][exceptions] Class com.alibaba.dubbo.common.URL in throws clause of method com.alibaba.dubbo.remoting.Client com.alibaba.dubbo.remoting.Transporter_Adpative.connect(com.alibaba.dubbo.common.URL, com.alibaba.dubbo.remoting.ChannelHandler) is not a subtype of class java.lang.Throwable [2022-09-09 23:49:58] Dubbo service server started!6.3.2 消費者
上傳dubbo-demo-consumer-2.1.5-assembly.tar.gz
tar xf dubbo-demo-consumer-2.1.5-assembly.tar.gz vi dubbo-demo-consumer-2.1.5/conf/dubbo.properties ## 配置zookeeper地址 dubbo.registry.address=zookeeper://192.168.31.122:2181?backup=192.168.31.121:2181,192.168.31.123:2181配置skywalking-agent
vi skywalking-agent/config/agent.config
啟動consumer
java -javaagent:/apps/skywalking-agent/skywalking-agent.jar -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:SurvivorRatio=2 -XX:+UseParallelGC -classpath /apps/dubbo-demo-consumer-2.1.5/conf:/apps/dubbo-demo-consumer-2.1.5/lib/cache-api-0.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-codec-1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-logging-1.1.1.jar:/apps/dubbo-demo-consumer-2.1.5/lib/commons-pool-1.5.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/dubbo-demo-consumer-2.1.5.jar:/apps/dubbo-demo-consumer-2.1.5/lib/fastjson-1.1.8.jar:/apps/dubbo-demo-consumer-2.1.5/lib/gmbal-api-only-3.0.0-b023.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-core-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-framework-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-portunif-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/grizzly-rcm-2.1.4.jar:/apps/dubbo-demo-consumer-2.1.5/lib/hessian-4.0.7.jar:/apps/dubbo-demo-consumer-2.1.5/lib/hibernate-validator-4.2.0.Final.jar:/apps/dubbo-demo-consumer-2.1.5/lib/httpclient-4.1.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/httpcore-4.1.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/javassist-3.15.0-GA.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jedis-2.0.0.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jetty-6.1.26.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jetty-util-6.1.26.jar:/apps/dubbo-demo-consumer-2.1.5/lib/jline-0.9.94.jar:/apps/dubbo-demo-consumer-2.1.5/lib/log4j-1.2.16.jar:/apps/dubbo-demo-consumer-2.1.5/lib/management-api-3.0.0-b012.jar:/apps/dubbo-demo-consumer-2.1.5/lib/mina-core-1.1.7.jar:/apps/dubbo-demo-consumer-2.1.5/lib/netty-3.2.5.Final.jar:/apps/dubbo-demo-consumer-2.1.5/lib/servlet-api-2.5-20081211.jar:/apps/dubbo-demo-consumer-2.1.5/lib/slf4j-api-1.6.2.jar:/apps/dubbo-demo-consumer-2.1.5/lib/spring-2.5.6.SEC03.jar:/apps/dubbo-demo-consumer-2.1.5/lib/validation-api-1.0.0.GA.jar:/apps/dubbo-demo-consumer-2.1.5/lib/zookeeper-3.3.3.jar: com.alibaba.dubbo.container.Main啟動完畢
[16:02:12] Hello world0, response form provider: 192.168.31.18:20880 [16:02:14] Hello world1, response form provider: 192.168.31.18:20880 [16:02:16] Hello world2, response form provider: 192.168.31.18:20880 [16:02:18] Hello world3, response form provider: 192.168.31.18:208806.4 Python環境監控
6.4.1 安裝依賴
# Install the latest version pip apt install python3 pip3 -y# Install the latest version, using the default gRPC protocol to report data to OAP pip install "apache-skywalking"6.4.2 測試django程序
安裝django依賴包
# cat requirements.txt apache-skywalking==0.7.0 asgiref==3.4.1 backports.zoneinfo==0.2.1 Django==4.0.1 grpcio==1.43.0 grpcio-tools==1.43.0 packaging==21.3 protobuf==3.19.3 PyMySQL==1.0.2 pyparsing==3.0.6 six==1.16.0 sqlparse==0.4.2 wrapt==1.13.3 # pip3 install -r requirements.txt Successfully installed Django-4.0.1 PyMySQL-1.0.2 apache-skywalking-0.7.0 asgiref-3.4.1 backports.zoneinfo-0.2.1 grpcio-1.43.0 grpcio-tools-1.43.0 protobuf-3.19.3 pyparsing-3.0.6 six-1.16.0 sqlparse-0.4.2 wrapt-1.13.3啟動django項目
# django-admin startproject mysite # cd mysite # python3 manage.py startapp myapp # python3 manage.py migrate ## 創建超級用戶 # python3 manage.py createsuperuser Username (leave blank to use 'root'): root Email address: root@root.cn Password: Password (again): The password is too similar to the username. This password is too short. It must contain at least 8 characters. Bypass password validation and create user anyway? [y/N]: y Superuser created successfully.6.4.3 Django寫skywalking配置
## 聲明環境變量 # export SW_AGENT_NAME='python-app1' # export SW_AGENT_NAMESPACE='python-app1' # export SW_AGENT_COLLECTOR_BACKEND_SERVICES='192.168.31.232:11800'6.4.4 啟動django
# 修改配置文件 # vi mysite/settings.py ALLOWED_HOSTS = ['192.168.31.231'] # 啟動服務 # sw-python -d run python3 manage.py runserver 192.168.31.231:80這樣就可以訪問 192.168.31.231:80
此時skywalking里就有數據了
總結
以上是生活随笔為你收集整理的【云原生 | Kubernetes 系列】---Skywalking部署和监控的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于类的静态的模板函数的使用方式
- 下一篇: 安卓Apk下载以及静默安装