容器HEALTHCHECK指令对接ASP.NET Core健康检查能力

 写在前面

HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查, 还包括应用程序对外部服务或依赖资源的健康检查。

健康检查通常是以暴露应用程序的HTTP端点的形式 实施,可用于配置健康探测的的场景有 :

  • 容器或负载均衡时 探测应用的状态, 例如:容器探测到应用unhealthy可 终止后续的滚动部署或者重启容器;负载均衡器探测到实例healthyunt能将请求路由到健康的运行实例。
  • 对应用程序种依赖的第三方服务进行健康探测,比如redis、database、外部服务接口
  • 内存、硬盘、网络等物理依赖资源的探测

HealthCheck提供一种 告知外部应用运行状态的机制

容器HEALTHCHECK指令

  一般情况下我们很容易知道容器正在运行[running], 但容器作为相对独立的应用执行环境,有时候并不知道容器是否以预期的方式正确运作[working]

Dockerfile/ docker-compose.yml文件提供的 HEALTHCHECK指令提供了探测容器正确工作的轮训机制,轮训内容可由应用自身决定。

该指令定义轮询参数interval、探测超时参数timeout、 重试参数retries 进行不间断探测容器:

// 通过在容器内运行shell命令来探测容器健康状态, 命令返回值0表示容器healthy, 命令返回值1表示unhealthy
EALTHCHECK [OPTIONS] CMD command  

对于容器内Web应用,自然而然会想到使用暴露HTTP端点的方式去探测,并将error response认定为unhealthy

// 容器每隔5min请求应用程序的http://localhost(重试3次),成功响应则返回0,错误响应则返回1
HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1

下面我们会将渐进式演示 使用Docker平台的HEALTHCHECK指令对接 ASP.NET Core程序的健康检查能力

 ASP.NET Core 实现HealthCheck

ASPNET Core在2.2版本内置了健康检查的能力, 使用的是一个HealthCheck Middleware, 该中间件是一个终端中间件,满足该路径的url请求,将会被该中间件处理。

public void ConfigureServices(IServiceCollection services)
{
    services.AddHealthChecks();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseHealthChecks("/healthcheck");
}

请求/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中配置并启用健康检查

// 以下代码截取自 Startup.ConfigureServices方法,对swagger服务地址、redis、sqlte进行健康检查
services.AddHealthChecks().AddAsyncCheck("Http", async () =>
                      {
                        using (HttpClient client = new HttpClient())
                        {
                            try
                            {
                                var response = await client.GetAsync("http://localhost:5000/swagger");
                                if (!response.IsSuccessStatusCode)
                                {
                                    throw new Exception("Url not responding with 200 OK");
                                }
                            }
                            catch (Exception)
                            {
                                return await Task.FromResult(HealthCheckResult.Unhealthy());
                            }
                        }
                        return await Task.FromResult(HealthCheckResult.Healthy());
                    })
                    .AddSqlite(
                        sqliteConnectionString: Configuration.GetConnectionString("sqlite"),
                        healthQuery: "select count(*) as count from ProfileUsageCounters;",
                        name: "sqlite",
                        failureStatus: HealthStatus.Degraded,
                        tags: new string[] { "db", "sqlite", "sqlite" }
                     )
                    .AddRedis(Configuration.GetConnectionString("redis"), "redis", HealthStatus.Unhealthy, new string[] { "redis", "redis" })
                    .Services
                    .AddMvc();

// 以下代码截取自Startup.Configure方法: 启用/healthz作为检查端点
 app.UseHealthChecks("/healthz").UseMvcWithDefaultRoute();    //  这里仍然只会响应 200/503状态码+简单的HealthStatus枚举值

 小技巧:你也可以使用UseHealthChecks()扩展方法修改默认的响应输出, 这里我们可引入HealthChecks.UI.Client nuget package输出更加详细的的HealthReport

  app.UseHealthChecks("/healthz", new HealthCheckOptions()
                {
                    Predicate = _ => true,
                    ResponseWriter =  UIResponseWriter.WriteHealthCheckUIResponse  // 该响应输出是一个json,包含所有检查项的详细检查结果
                });

注意

 上文在Dockerfile中配置的HEALTHCHECK 指令:

       HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1

      并不关注响应体输出,依然对于success response 返回0, error response返回1。

    

 测试容器的HEALTHCHECK输出

    使用docker ps命令可查看容器的状态, 通过docker inspect [container_id] 查看容器HealthCheck的输出

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                  PORTS                NAMES
0111ea10581f        eqidmanager_proxy   "nginx -g ‘daemon ..."   24 hours ago        Up 24 hours             0.0.0.0:80->80/tcp   eqidmanager_proxy_1
8e96a0e8b993        eqidmanager_app     "dotnet EqidManage..."   24 hours ago        Up 24 hours (healthy)   80/tcp               eqidmanager_app_1

原文地址:https://www.cnblogs.com/mi12205599/p/10837804.html

时间: 2024-08-29 15:48:23

容器HEALTHCHECK指令对接ASP.NET Core健康检查能力的相关文章

Linux中以单容器部署Nginx+ASP.NET Core

引言 正如前文提到的,强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程. Nginx->ASP.NET Coe部署架构容器化 在Docker中部署Nginx--->ASP.NETCore 有两种选择, 第一种是在单容器内部署Nginx+ASP.NET Core, 这是本文着重要讲述的,另外一种是以独立容器分别部署Nginx和ASP.NET Core,容器之间通过Docker内建

ASP.NET Core重写个人博客站点小结

今天用ASP.NET Core重写了个人博客站点,原来是基于ASP.NET 4.5开发的.重写工作总体很顺利,最后成功发布到Ubunt+Nginx平台上.效果如下: 右边的Header信息里可以看到已经是Nginx(Ubuntu)了,虽然最后成功发布了,但是过程中遇到点坑,特来分享. HtmlHelper问题 ASP.NET Core之前,大家都很熟悉HtmlHelper方法.但是到了ASP.NET Core后,一些方法已经不能使用了,取而代之的是全新的TagHelper.但今天我遇到的问题是@

Knative Serving 健康检查机制分析

作者|??阿里云智能事业群技术专家牛秋霖(冬岛) 导读:从头开发一个 Serverss 引擎并不是一件容易的事情,今天咱们就从 Knative 的健康检查说起.通过健康检查这一个点来看看 Serverless 模式和传统的模式都有哪些不同,以及 Knative 针对 Serverless 场景都做了什么思考. Knative Serving 模块的核心原理如下图所示,图中的 Route 可以理解成是 Istio Gateway 的角色. 当缩容到零时进来的流量就会指到 Activator 上面:

k8s探测机制之pod健康检查

一:需求来源: 首先来看一下,整个需求的来源:当把应用迁移到 Kubernetes 之后,要如何去保障应用的健康与稳定呢?其实很简单,可以从两个方面来进行增强: 1,首先是提高应用的可观测性:2,第二是提高应用的可恢复能力. 从可观测性上来讲,可以在三个方面来去做增强: 1,首先是应用的健康状态上面,可以实时地进行观测:2,第二个是可以获取应用的资源使用情况:3,第三个是可以拿到应用的实时日志,进行问题的诊断与分析. 当出现了问题之后,首先要做的事情是要降低影响的范围,进行问题的调试与诊断.最后

在Linux和Windows的Docker容器中运行ASP.NET Core

(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇到了. 不过首先,对于不熟悉的朋友我还是来解释一下Linux容器和Windows容器的概念. 由于容器成为虚拟化和应用托管的一种不可避免的选项,Windows也开始为公众提供容器功能(其实微软具备和使用

Docker容器中运行ASP.NET Core

在Linux和Windows的Docker容器中运行ASP.NET Core 译者序:其实过去这周我都在研究这方面的内容,结果周末有事没有来得及总结为文章,Scott Hanselman就捷足先登了.那么我就来翻译一下这篇文章,让更多的中文读者看到.当然Scott遇到的坑我也遇到了. 不过首先,对于不熟悉的朋友我还是来解释一下Linux容器和Windows容器的概念. 由于容器成为虚拟化和应用托管的一种不可避免的选项,Windows也开始为公众提供容器功能(其实微软具备和使用容器技术很久了).这

Docker容器环境下ASP.NET Core Web API

Docker容器环境下ASP.NET Core Web API应用程序的调试 本文主要介绍通过Visual Studio 2015 Tools for Docker – Preview插件,在Docker容器环境下,对ASP.NET Core Web API应用程序进行调试.在自己做实验的过程中也碰到了一些问题,经过一些测试和搜索资料,基本解决了这些问题,本文也会对这些问题进行介绍,以免有相同需求的朋友多走弯路. 插件的下载与安装 至撰写本文为止,Visual Studio 2015 Tools

ASP.NET Core之跨平台的实时性能监控(2.健康检查)

前言 上篇我们讲了如何使用App Metrics 做一个简单的APM监控,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core之跨平台的实时性能监控 首先我们来了解一下什么是健康检查(health checks)? 1.什么是健康检查? 健康检查,其实这个名称已经很明确了,它是检查你的应用程序是否健康运行的一种方式.随着当前各类项目越来越多的应用程序正在转向微服务式架构,健康检查就变得尤为关键.虽然微服务体系结构具有许多好处,但其中一个缺

ASP.NET Core使用Docker-Compose实现多容器应用部署

一.需求背景 人生苦短,我用.NET Core!前面的<ASP.NET Core使用Docker进行容器化托管和部署>基础课程我们学习了如何使用Docker来部署搭建ASP.NET Core + Mysql容器化应用程序环境.对于需要多个容器(比如需要Nginx.SqlServer.Redis.RabbitMQ等)协调运行的复杂应用中,使用逐个单个运行容器的方式进行部署时,很显然会很麻烦,而且还要为各个容器之间的网络连接而苦恼.还好,Docker体贴的为我们想到了这一点.借助Compose模块