天天看點

web 容器 中執行 runtime.getruntime()_DockerHealthCheck指令探測ASP.NET Core容器健康狀态...

寫在前面

HealthCheck 不僅是對應用程式内運作情況、資料流通情況進行檢查,還包括應用程式對外部服務或依賴資源的健康檢查。

健康檢查通常是以

暴露應用程式的HTTP端點

的形式實施,可用于配置健康探測的的場景有 :

  1. 容器或負載均衡器 探測應用狀态,執行既定政策,例如:容器探測到應用unhealthy可終止後續的滾動部署或者重新開機容器;負載均衡器探測到執行個體unhealthy能将請求路由到健康的運作執行個體。
  2. 對應用程式種依賴的第三方服務進行健康探測,比如redis、database、外部服務接口
  3. 記憶體、硬碟、網絡等實體依賴資源的探測

HealthCheck提供對外暴露程式運作狀态的機制。

容器HEALTHCHECK指令

一般情況下我們很容易知道容器

正在運作running

, 但容器作為相對獨立的應用執行環境,有時候并不知道容器是否

以預期方式正确運作working

Dockerfile HEALTHCHECK指令提供了探測容器以預期工作的輪詢機制,輪詢内容可由應用自身決定。

具體而言:通過在容器内運作shell指令來探測容器健康狀态,以Shell指令的退出碼表示容器健康狀态:

0 訓示容器健康

1 訓示容器不健康

2 訓示不使用這個退出碼

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執行成功,傳回0;為對接Docker-HealcthCheck失敗退出碼1,要對Shell執行失敗傳回退出碼1

對Web應用,自然會聯想到使用

curl指令通路端點

去探測容器應用:

curl web端點成功,指令傳回0;curl web端點失敗,指令傳回1

探測指令在stdout或stderr輸出的任何内容會在容器Health Status中存儲,可通過docker inspect [ContainerId] 檢視HealthCheck狀态。

下面漸進式示範使用Docker平台的HEALTHCHECK指令對接 ASP.NET Core程式的健康檢查能力。

web 容器 中執行 runtime.getruntime()_DockerHealthCheck指令探測ASP.NET Core容器健康狀态...

ASP.NET Core實作HealthCheck端點

ASPNET Core在2.2版本内置了健康檢查的能力:終端中間件(滿足該路徑的url請求,将會被該中間件處理)。

Asp.NetCore 3.1将健康檢查內建在 EndPoints,請自行修改。

請求/healthcheck端點, 程式會進行健康檢查邏輯并響應輸出, 預設的行為:

對healthy、degraded狀态傳回200 OK響應碼;對于unhealthy傳回503 Service Unavailable響應碼

② 響應體隻會包含簡單的HealthStatus枚舉字元串

③ 将每次健康檢查的結果寫入HealthReport對象。

作為企業級項目,存在對Web項目實體資源和服務依賴的健康檢查需求, 這裡我們為避免重複造輪子,引入了開源的力量。

開源社群對HealthCheck的支援

開源的企業級AspNetCore.Diagnostics.HealthChecks系列元件,該系列元件支援多種實體資源和服務依賴的健康檢查,支援報告推送,支援友好的檢查報告UI(支援背景輪詢檢查)、支援webhook通知。

下面的步驟示範了對web程式HTTP請求、Redis、Sqlite等服務進行健康檢查的端點配置

① 引入AspNetCore.HealthChecks.Redis 、 AspNetCore.HealthChecks.Sqlite nuget庫

② Startup.cs配置并啟用健康檢查

再次強調,容器HealthCheck指令不關注Shell指令的執行過程,

隻關注shell指令的執行結果

HealthChecks-UI 了解一下

抛開Docker的HEALTHCHECK指令、負載均衡器的輪詢機制不談,我們的Web自身也可以進行 輪詢健康檢查并給出告警。

就我們上面的Web 執行個體來說,我們隻對外提供的是一個 /healthcheck 檢查端點,引入HealthChecks.UI.dll 将會在前端生成友好的HealthReport 界面, 該庫支援背景輪詢檢查、支援webhook 通知。

這裡就不展開說明,自行前往AspNetCore.Diagnostics.HealthChecks檢視相應文檔,效果如下

web 容器 中執行 runtime.getruntime()_DockerHealthCheck指令探測ASP.NET Core容器健康狀态...

至此,本文内容完畢:

  • 使用ASP.NET Core架構實作一個稍複雜的HealthCheck端點 /healthz
  • 使用docker的HEALTHCHECK指令對接Web應用健康檢查端點

推薦閱讀

● DotNetCore三大Redis用戶端對比和使用心得

● 一文掌握Cookies前世今生

● ASP.NET Core跨平台技術内幕

● EFCore批量操作,你真的清楚嗎

● 誰說docker-compose不能水準擴充容器、服務多執行個體?

● 基于docker-compose的Gitlab CI/CD實踐&排坑指南

web 容器 中執行 runtime.getruntime()_DockerHealthCheck指令探測ASP.NET Core容器健康狀态...