学习
实践
活动
工具
TVP
写文章
专栏首页精益码农Docker-HealthCheck指令探测ASP.NET Core容器健康状态

Docker-HealthCheck指令探测ASP.NET Core容器健康状态

写在前面

HealthCheck 不仅是对应用程序内运行情况、数据流通情况进行检查,还包括应用程序对外部服务或依赖资源的健康检查。 健康检查通常是以暴露应用程序的HTTP端点的形式实施,可用于配置健康探测的的场景有 :

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

HealthCheck提供对外暴露程序运行状态的机制。

容器HEALTHCHECK指令

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

Dockerfile HEALTHCHECK指令提供了探测容器以预期工作的轮询机制,轮询内容可由应用自身决定。

具体而言:通过在容器内运行shell命令来探测容器健康状态,以Shell命令的退出码表示容器健康状态:

0 指示容器健康 1 指示容器不健康 2 指示不使用这个退出码

// 可定义轮询interval、探测超时timeout、 重试retries参数轮询探测
HEALTHCHECK [OPTIONS] CMD command

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端点失败,命令返回非0(假)

// curl -f 表示请求失败返静默输出
HEALTHCHECK --interval=5m --timeout=3s --retries=3 CMD curl -f http://localhost:5000/healthz || exit 1

探测命令在stdout或stderr输出的任何内容会在容器Health Status中存储,可通过docker inspect [ContainerId] 查看HealthCheck状态。

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

ASP.NET Core实现HealthCheck端点

ASPNET Core在2.2版本内置了健康检查的能力:终端中间件(满足该路径的url请求,将会被该中间件处理)。

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

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

// 以下代码截取自 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枚举值

再次强调,容器HealthCheck指令不关注Shell命令的执行过程,只关注shell命令的执行结果

// docker-compose.yml文件健康检查 参考如下配置:
healthcheck:
      test: curl -f http://localhost/healthcheck || exit 1
      interval: 1m30s
      timeout: 10s
      retries: 3

HealthChecks-UI 了解一下

抛开Docker的HEALTHCHECK指令、负载均衡器的轮询机制不谈,我们的Web自身也可以进行 轮询健康检查并给出告警。

就我们上面的Web 实例来说,我们只对外提供的是一个 /healthcheck 检查端点,引入HealthChecks.UI.dll 将会在前端生成友好的HealthReport 界面, 该库支持后台轮询检查、支持webhook 通知。

这里就不展开说明,自行前往AspNetCore.Diagnostics.HealthChecks查看相应文档,效果如下

至此,本文内容完毕:

  • 使用ASP.NET Core框架实现一个稍复杂的HealthCheck端点 /healthz
  • 使用docker的HEALTHCHECK指令对接Web应用健康检查端点
文章分享自微信公众号:
精益码农

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:小码甲
原始发表时间:2020-04-02
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • Docker容器和K8s添加Health Check

    docker容器启动后,怎么确认容器运行正常,怎么确认可以对外提供服务了,这就需要health check功能了。

    Ryan-Miao
  • 你必须知道的Dockerfile

    本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

    Edison Zhou
  • .Net Core实现健康检查

    ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。

    HueiFeng
  • .Net Core实现健康检查

    ASP.NET Core 提供运行状况检查中间件和库,以用于报告应用基础结构组件的运行状况。 运行状况检查由应用程序作为 HTTP 终结点公开。可以为各种实时监...

    梁规晓
  • .NET Core 3.1之深入源码理解HealthCheck(二)

    前文讨论了HealthCheck的理论部分,本文将讨论有关HealthCheck的应用内容。

    Edison.Ma
  • Kubernetes Pod 生命周期

    Pod 的 status 定义在 PodStatus 对象中,其中有一个 phase 字段。它简单描述了 Pod 在其生命周期的阶段。熟悉Pod的各种状态对我们...

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

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

    跟着阿笨一起玩NET
  • ASP.NET Core Jenkins Docker 实现一键化部署

    在前段时间尝试过用Jenkins来进行ASP.NET Core 程序在IIS上面的自动部署。

    DevOps时代
  • ASP.NET Core on K8S深入学习(6)Health Check

    本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。

    Edison Zhou
  • ASP.NET Core使用Docker进行容器化托管和部署

    跟着阿笨一起玩NET
  • Kubernetes系列学习文章 - Pod的深入理解(四)

    | 导语 从这篇文章开始,我们将详细介绍K8S的各个组件。学习一项技术,理论先行,只有充分的了解了内在原理才能在日后的维护和调优方面有所思路。

    宝哥@上云专家
  • kubernetes面试题汇总详解

    答:Kubenetes是一个针对容器应用,进行自动部署,弹性伸缩和管理的开源系统。主要功能是生产环境中的容器编排。 K8S是Google公司推出的,它来源于由...

    zhangdd
  • kubernetes 组件之 kubelet

    每个Node节点上都运行一个 Kubelet 服务进程,默认监听 10250 端口,接收并执行 Master 发来的指令,管理 Pod 及 Pod 中的容器。每...

    看、未来
  • k8s 实践经验(五)pod 详解(1)

    容器中的程序要运行,肯定会占用一定的资源,比如CPU和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量的资源,导致其他的容器无法运行。针对这种情况,k...

    看、未来
  • [翻译] ASP.NET Core 3.0 的新增功能

    全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0

    梁规晓
  • .Net Core in Docker极简入门(上篇)

    Docker 是一个开源的应用容器引擎,它十分火热,如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生产环境中可能用不上它,就算把它当作一个辅助开发的工具...

    xhznl
  • [翻译] ASP.NET Core 2.2 正式版发布

    本文为翻译,原文地址:https://blogs.msdn.microsoft.com/webdev/2018/12/04/asp-net-core-2-2-a...

    晓晨
  • 使用Kubernetes探针使用一二

    Kubernetes调度Pod到Kubernetes节点上,节点上的Kubelet运行Pod的容器。如果容器内进程终止运行(容器的主进程崩溃),Kubelet会...

    ucdream82
  • 针对Fluent-Bit采集容器日志的补充

    hello,之前我写过《一套标准的ASP.NET Core容器化应用日志收集分析方案》,在公司团队、微信公众号、Github上反映良好。

    有态度的马甲

扫码关注腾讯云开发者

领取腾讯云代金券