适用于Kestrel .NET Core Web API的适当的Kubernetes准备和活动探测器

时间:2017-12-06 07:38:30

标签: asp.net-core kubernetes asp.net-core-webapi kestrel-http-server

我们的目标是使用Kubernetes横向扩展.NET Core 2.0 Web API。 Web API应用程序将由Kestrel提供。

看起来我们可以通过配置Kestrel的关机超时来优雅地处理pod的终止,所以现在我们正在研究如何探测应用程序以确定准备就绪和活跃度。

仅使用HTTP请求探测Web API是否足够?如果是这样,创建一个新的健康检查控制器来处理这些探测请求是不是一个好主意,或者探测在正常使用中消耗的实际端点会更有意义吗?

在区分活跃度和准备度探测时,我们应该考虑什么?

2 个答案:

答案 0 :(得分:5)

我建议通过单独的端点执行运行状况检查。 通常,这样做的原因很多,例如:

  1. 检查应用程序是否处于活动状态/就绪状态,或者更一般地说,处于健康状态,不一定与向Web服务发送用户请求相同。执行运行状况检查时,您应该定义使Web服务保持健康的原因:例如检查对外部资源(如数据库)的访问。
  2. 控制哪些人可以通过您的端点实际执行健康检查。
  3. 总的来说,您不想弄乱实际的服务功能:否则,您将需要重新考虑在维护服务功能时进行运行状况检查的方式。例如。如果您的服务与数据库进行了交互,则在运行状况检查上下文中,您想验证与数据库的连接是否正常,但是实际上您并不关心服务内部在操作的数据。
  4. 如果您的Web服务不是无状态的,事情将变得更加复杂:在这种情况下,您将需要确保数据独立于运行状况检查而保持一致。

正如您所指出的,避免上述情况的一种好方法是设置一个单独的Controller来处理运行状况检查。

作为替代选择,ASP.NET Core中提供了一个标准库,用于在您的Web服务上启用Health Checks:在撰写此答案时,它不是ASP.NET Core的正式组成部分,并且目前还没有可用的NuGet软件包,但是有计划在将来的版本中实现。目前,您可以轻松地从Official Repository中提取代码,并将其包含在解决方案中,如Microsoft documentation中所述。 如ASP.NET Core 2.2 Roadmap中所述,目前计划将其包含在ASP.NET Core 2.2中。

我个人认为它非常优雅,因为您将通过Startup.csProgram.cs配置所有内容,并且无需显式创建新端点,因为该库已经为您处理了。

我在一些项目中一直在使用它,我肯定会推荐它。 该存储库包括一个专门用于ASP.NET Core项目的example,您可以使用它来快速入门。

活力与准备就绪

然后在Kubernetes中,您可以通过HTTP:设置活动性和就绪性探针:如Kubernetes documentation中所述,虽然两者的设置几乎相同,但Kubernetes会根据探针采取不同的操作:

来自Kubernetes documentation

活力探测

  

许多长时间运行的应用程序最终会转换为损坏的状态,除非重新启动,否则无法恢复。 Kubernetes提供了活动性探针来检测和纠正这种情况。

来自Kubernetes documentation

准备情况调查

  

有时,应用程序暂时无法提供流量。例如,应用程序可能需要在启动过程中加载大数据或配置文件。在这种情况下,您不想杀死应用程序,但也不想发送请求。 Kubernetes提供了准备就绪探针以检测和缓解这些情况。装有报告其容器尚未就绪的容器的容器无法通过Kubernetes Services接收流量。

因此,尽管对活动性探针的不健康响应会导致Pod(因此,应用程序)被杀死,但对就绪性探针的不健康响应只会导致Pod没有流量,直到返回到健康状况。

区分活动性和就绪性探针时应考虑什么?

对于活度探针: 我建议定义使您的应用程序保持健康的原因,即用户消耗的最低要求,并根据此要求进行运行状况检查。 这通常涉及作为独立进程运行的外部资源或应用程序,例如数据库,Web服务等 您可以使用ASP.NET Core Health Checks库或通过单独的Controller手动定义运行状况检查。

对于准备情况调查: 您只需要加载服务以验证其是否及时响应,从而允许Kubernetes相应地平衡流量。琐碎的(在大多数情况下,是Lukas在另一个答案中建议的),您可以使用与活动相同的确切端点,但是设置不同的超时时间,但这实际上取决于您的需求和要求。

答案 1 :(得分:1)

  

区分活动性和准备性探针时应考虑什么

我的建议是在应用程序中与应用程序端点分开提供/health端点。如果您想阻止消费者致电您的内部健康终结点,这将很有用。然后,您可以配置Kubernetes来查询HTTP /health端点,如下面的示例所示。

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
spec:
  containers:
  - name: goproxy
    image: k8s.gcr.io/goproxy:0.1
    ports:
    - name: http
      containerPort: 8080
    readinessProbe:
      httpGet:
        port: http
        path: /health
      initialDelaySeconds: 60
    livenessProbe:
      httpGet:
        port: http
        path: /health

/health端点内部,您应该检查应用程序的内部状态,如果一切正常,则返回状态代码200,如果应用程序有问题,则返回状态代码503。请记住,通常会对每个实例每15秒执行一次运行状况检查,如果要执行昂贵的操作来确定应用程序状态,则可能会降低应用程序速度。

  

区分活动性和准备性探针时应考虑什么

通常,活动性和就绪性探针之间的唯一区别是每个探针中的超时。也许您的应用程序需要60秒才能启动,然后您需要将就绪探针的初始超时设置为60,同时保持默认的活动超时。