Docker-HealthCheck指令探测ASP.NET Core容器健康状态
寫(xiě)在前面
HealthCheck 不僅是對(duì)應(yīng)用程序內(nèi)運(yùn)行情況、數(shù)據(jù)流通情況進(jìn)行檢查,還包括應(yīng)用程序?qū)ν獠糠?wù)或依賴(lài)資源的健康檢查。
健康檢查通常是以暴露應(yīng)用程序的HTTP端點(diǎn)的形式實(shí)施,可用于配置健康探測(cè)的的場(chǎng)景有 :
容器或負(fù)載均衡器 探測(cè)應(yīng)用狀態(tài),執(zhí)行既定策略,例如:容器探測(cè)到應(yīng)用unhealthy可終止后續(xù)的滾動(dòng)部署或者重啟容器;負(fù)載均衡器探測(cè)到實(shí)例unhealthy能將請(qǐng)求路由到健康的運(yùn)行實(shí)例。
對(duì)應(yīng)用程序種依賴(lài)的第三方服務(wù)進(jìn)行健康探測(cè),比如redis、database、外部服務(wù)接口
內(nèi)存、硬盤(pán)、網(wǎng)絡(luò)等物理依賴(lài)資源的探測(cè)
HealthCheck提供對(duì)外暴露程序運(yùn)行狀態(tài)的機(jī)制。
容器HEALTHCHECK指令
一般情況下我們很容易知道容器正在運(yùn)行running, 但容器作為相對(duì)獨(dú)立的應(yīng)用執(zhí)行環(huán)境,有時(shí)候并不知道容器是否以預(yù)期方式正確運(yùn)作working
Dockerfile HEALTHCHECK指令提供了探測(cè)容器以預(yù)期工作的輪詢(xún)機(jī)制,輪詢(xún)內(nèi)容可由應(yīng)用自身決定。
具體而言:通過(guò)在容器內(nèi)運(yùn)行shell命令來(lái)探測(cè)容器健康狀態(tài),以Shell命令的退出碼表示容器健康狀態(tài):
0 指示容器健康
1 指示容器不健康
2 指示不使用這個(gè)退出碼
Every Linux or Unix command executed by the shell script or user has an exit status. Exit status is an integer number. 0 exit status means the command was successful without any errors. A non-zero (1-255 values) exit status means command was a failure.
linux shell執(zhí)行成功,返回0;為對(duì)接Docker-HealcthCheck失敗退出碼1,要對(duì)Shell執(zhí)行失敗返回退出碼1
對(duì)Web應(yīng)用,自然會(huì)聯(lián)想到使用curl命令訪問(wèn)端點(diǎn)去探測(cè)容器應(yīng)用:
curl web端點(diǎn)成功,命令返回0;curl web端點(diǎn)失敗,命令返回1
探測(cè)命令在stdout或stderr輸出的任何內(nèi)容會(huì)在容器Health Status中存儲(chǔ),可通過(guò)docker inspect [ContainerId] 查看HealthCheck狀態(tài)。
下面漸進(jìn)式演示使用Docker平臺(tái)的HEALTHCHECK指令對(duì)接 ASP.NET Core程序的健康檢查能力。
ASP.NET Core實(shí)現(xiàn)HealthCheck端點(diǎn)
ASPNET Core在2.2版本內(nèi)置了健康檢查的能力:終端中間件(滿(mǎn)足該路徑的url請(qǐng)求,將會(huì)被該中間件處理)。
public void ConfigureServices(IServiceCollection services) {services.AddHealthChecks(); }public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.UseHealthChecks("/healthcheck"); }Asp.NetCore 3.1將健康檢查集成在 EndPoints,請(qǐng)自行修改。
請(qǐng)求/healthcheck端點(diǎn), 程序會(huì)進(jìn)行健康檢查邏輯并響應(yīng)輸出, 默認(rèn)的行為:
① 對(duì)healthy、degraded狀態(tài)返回200 OK響應(yīng)碼;對(duì)于unhealthy返回503 Service Unavailable響應(yīng)碼
② 響應(yīng)體只會(huì)包含簡(jiǎn)單的HealthStatus枚舉字符串
③ 將每次健康檢查的結(jié)果寫(xiě)入HealthReport對(duì)象。
作為企業(yè)級(jí)項(xiàng)目,存在對(duì)Web項(xiàng)目物理資源和服務(wù)依賴(lài)的健康檢查需求, 這里我們?yōu)楸苊庵貜?fù)造輪子,引入了開(kāi)源的力量。
開(kāi)源社區(qū)對(duì)HealthCheck的支持
開(kāi)源的企業(yè)級(jí)AspNetCore.Diagnostics.HealthChecks系列組件,該系列組件支持多種物理資源和服務(wù)依賴(lài)的健康檢查,支持報(bào)告推送,支持友好的檢查報(bào)告UI(支持后臺(tái)輪詢(xún)檢查)、支持webhook通知。
下面的步驟演示了對(duì)web程序HTTP請(qǐng)求、Redis、Sqlite等服務(wù)進(jìn)行健康檢查的端點(diǎn)配置
① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget庫(kù)
② Startup.cs配置并啟用健康檢查
再次強(qiáng)調(diào),容器HealthCheck指令不關(guān)注Shell命令的執(zhí)行過(guò)程,只關(guān)注shell命令的執(zhí)行結(jié)果
// docker-compose.yml文件健康檢查 參考如下配置: healthcheck:test: curl -f http://localhost/healthcheck || exit 1interval: 1m30stimeout: 10sretries: 3HealthChecks-UI 了解一下
拋開(kāi)Docker的HEALTHCHECK指令、負(fù)載均衡器的輪詢(xún)機(jī)制不談,我們的Web自身也可以進(jìn)行 輪詢(xún)健康檢查并給出告警。
就我們上面的Web 實(shí)例來(lái)說(shuō),我們只對(duì)外提供的是一個(gè) /healthcheck 檢查端點(diǎn),引入HealthChecks.UI.dll 將會(huì)在前端生成友好的HealthReport 界面, 該庫(kù)支持后臺(tái)輪詢(xún)檢查、支持webhook 通知。
這里就不展開(kāi)說(shuō)明,自行前往AspNetCore.Diagnostics.HealthChecks查看相應(yīng)文檔,效果如下
至此,本文內(nèi)容完畢:
使用ASP.NET Core框架實(shí)現(xiàn)一個(gè)稍復(fù)雜的HealthCheck端點(diǎn) /healthz
使用docker的HEALTHCHECK指令對(duì)接Web應(yīng)用健康檢查端點(diǎn)
推薦閱讀
●?DotNetCore三大Redis客戶(hù)端對(duì)比和使用心得
●?一文掌握Cookies前世今生
●?ASP.NET Core跨平臺(tái)技術(shù)內(nèi)幕
●?EFCore批量操作,你真的清楚嗎
●?誰(shuí)說(shuō)docker-compose不能水平擴(kuò)展容器、服務(wù)多實(shí)例?
●?基于docker-compose的Gitlab CI/CD實(shí)踐&排坑指南
總結(jié)
以上是生活随笔為你收集整理的Docker-HealthCheck指令探测ASP.NET Core容器健康状态的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 玩转控件:对Dev中GridContro
 - 下一篇: ASP.NET Core分布式项目实战(