基于 Docker Compose 实践 .NET Core 的现代化架构 2:在容器中集成 Skywalking APM
本章節代碼已經上傳至?https://github.com/siegrainwong/.NET-Core-with-Docker/tree/master/Part2
系列大綱
還是先介紹一下目錄,這次我們講第二篇:
用 docker-compose 啟動 WebApi 和 SQL Server
在容器中集成 Skywalking APM
通過 nginx-proxy 對 ES、Skywalking、WebApi 實現自動反向代理和 HTTPS
通過 Azure DevOps 進行 CI/CD 和藍綠發布
按照慣例,故障排除在最后一個章節~
Skywalking 介紹
Skywalking是一個分布式鏈路追蹤系統,在部署分布式系統時能以非常清晰和全面的方式為你展示各種各樣的監控數據,且本身接入對代碼毫無侵入性,加上docker的部署優勢能讓你分分鐘將這個強大的 APM 集成并啟動起來。
配置監控代理
監控代理負責運行在你WebApi容器中并向收集器(Skywalking-OAP)定時發送監控數據。
本節中的F:\path\to\your\project的路徑字符串都用來指代你的項目根目錄,注意替換
打開程序包管理控制臺,安裝SkyAPM
Install-Package SkyAPM.Agent.AspNetCore -Version 0.9.0安裝SkyAPM.DotNet.CLI
dotnet tool install -g SkyAPM.DotNet.CLI添加配置文件
cd F:\path\to\your\project\Core.APIdotnet skyapm config coreapi sw-oap:11800添加后是這樣的,并且記得設置其為始終復制。
配置docker-compose
修改你的docker-compose.yml文件成這樣:
version: "3.3"services: #coreapi: # container_name: coreapi # image: siegrainwong/coreapi:latest # ports: # - 5000:5000 # depends_on: # - sqlserver # links: # - sqlserver # volumes: # - ./Core.API/appsettings.docker.json:/app/appsettings.json:ro # environment: # ASPNETCORE_HOSTINGSTARTUPASSEMBLIES: SkyAPM.Agent.AspNetCore # SKYWALKING__SERVICENAME: coreapi # restart: always sqlserver: image: mcr.microsoft.com/mssql/server:2017-latest container_name: sqlserver restart: always environment: ACCEPT_EULA: Y MSSQL_PID: Developer SA_PASSWORD: "NetCore123!@#" volumes: - coredata:/var/opt/mssql ports: - 1433 elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.4.3 container_name: elasticsearch restart: always ports: - 9200:9200 - 9300:9300 environment: discovery.type: single-node ulimits: memlock: soft: -1 hard: -1 sw-oap: image: apache/skywalking-oap-server:6.1.0 container_name: sw-oap depends_on: - elasticsearch links: - elasticsearch restart: always ports: - 11800:11800 - 12800:12800 environment: SW_STORAGE: elasticsearch SW_STORAGE_ES_CLUSTER_NODES: elasticsearch:9200 sw-ui: image: apache/skywalking-ui:6.1.0 container_name: sw-ui depends_on: - sw-oap links: - sw-oap restart: always ports: - 8080:8080 environment: SW_OAP_ADDRESS: sw-oap:12800volumes: coredata:是的,我們先把這里的coreapi注釋掉,方便本地調試
在根目錄添加一個名為launch.ps1的腳本:
docker-compose up -ddocker run --rm -it ` -v F:\path\to\your\project:/app/ ` -v F:\path\to\your\project\Core.API\appsettings.docker.json:/app/Core.API/appsettings.Development.json:ro ` -p 5000:5000 ` --link sw-oap ` --link sqlserver ` --name coreapi_dev ` --network part2_default ` --env ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=SkyAPM.Agent.AspNetCore ` --env SKYWALKING__SERVICENAME=coreapi ` -w /app/Core.API mcr.microsoft.com/dotnet/core/sdk:2.2-stretch dotnet watch rundocker run這條命令的意思是以交互模式將當前目錄掛載到docker中執行dotnet watch run,并在執行完成后(或按 Ctrl+C 退出時)移除該容器,一般我們開發中就都是通過這種命令將應用程序快速運行在容器中。
還需要注意的是,這里手動指定了容器的網絡(--network),只有運行在同一網絡內的容器才能利用容器名在容器內網互相通信,你可以用docker network ls看看有哪些容器網絡,之前我們用docker-compose創建起來的所有容器都在一個網絡中,這個網絡的名稱一般是當前你的項目根目錄名_default,所以我的就叫part2_default,你需要將其改為你的網絡名稱。
想驗證容器之間的網絡是否通暢,比如想測試從 coreapi 到 sqlserver 的連接,只需要docker exec coreapi_dev curl sqlserver:1433即可。
其他命令的意思你應該很輕松就能猜到的,如果不明白可以對照一下上一章中文注釋過的docker-compose.yml文件,就不多解釋了。
我們執行這個腳本后,訪問localhost:8080,不出意外將出現Skywalking的登錄界面:?
輸入 admin/admin 登錄:?
然后就能看到這個酷炫的頁面了,不過此時你很有可能看不見數據,別急,我們先去http://localhost:5000/api/values頁面刷兩下,回來再將右下角的 UTC+8 改為 UTC+0,因為 ES 跟 OAP 的默認時區都是 UTC+0,這個我們后面再解決,現在刷新看是不是有數據了。
里面具體有什么就自己探索吧,這里主要講部署方法,具體使用方法也有很多其他博主寫過了,就不多講了。
糾正時區為 UTC+8
糾正時區的原理非常簡單,就是靠命令修改容器虛擬機的時區。這需要我們在 oap 跟 es 的 Dockerfile 中執行這兩條命令:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeecho Asia/Shanghai > /etc/timezone好消息是其實這些活兒也是有人做好了的,直接拿來用就是了。
修改 ES 的容器鏡像為:
elasticsearch: image: wutang/elasticsearch-shanghai-zone:6.3.2修改 OAP 的容器鏡像為:
sw-oap: image: siegrainwong/skywalking-oap:6.1.0再去劃拉兩下,是不是時間就正確了??
具體的修改方式可以參考這個commit以及這個repo,其實在有官方的容器化之前一直是這位大佬在維護的,大家要感謝他,本來當時我也是跟著這個 Repo 學習的,文章也寫到一半了,結果發現官方容器化后又重新走了一遍 23333。
故障排除
通過查看Core.API\logs\skyapm-xxx.log排錯,一般都是代理連不上 oap 等類似錯誤,重新修改下你的gRPC/Servers直到連通為止(不過這里好像有點 bug,有時候莫名其妙日志就不生成了~),如果有這樣的日志,就說明代理連上 oap 了
通過docker logs命令查看sw-oap或者sw-ui的日志,看看是不是有什么錯誤,一般也還是連不通的錯誤,oap 連不上 es 呀,ui 連不上 oap 啊,等等
參考 skywalking-docker 官方repo
參考 SkyAPM 官方repo
如果你的 skywalking 沒有 CLR 信息,可能是你混用的 5.x 版本的監控代理,那個程序集叫 Skywalking.xxxxx,接入時還需要修改 Startup.cs 文件,發生這種情況用最新的 Agent 即可?
原文地址:https://siegrain.wang/article/2019/07/08/deploy-skywalking-in-docker-with-netcore
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的基于 Docker Compose 实践 .NET Core 的现代化架构 2:在容器中集成 Skywalking APM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【半小时大话.net依赖注入】(一)理论
- 下一篇: 使用Minikube部署本地Kubern