【问题标题】:.NET Core Workerservice - how to provide a health check endpoint without HTTP?.NET Core Workerservice - 如何在没有 HTTP 的情况下提供健康检查端点?
【发布时间】:2021-09-05 01:23:16
【问题描述】:

我已经构建了一个在 kubernetes 上运行的 ASP.NET Core Worker Service(它处理来自队列的消息)。由于它是一个后台服务,它目前没有任何 HTTP 端点。现在我想为它添加一个 k8s 的健康/活跃度端点——最好利用.NET Core standard health checks

所以我的问题是:有没有办法在不增加 HTTP 端点开销的情况下公开这些健康检查,而 k8s 可以使用它们(TCP or generic command)?任何指向示例的指针都会很棒!谢谢!

【问题讨论】:

  • 假设您的最终目标是支持活性探测,您可以编写一个健康检查/发布器,在磁盘上创建一个文件stackoverflow.com/q/58770795/491907 然后您可以编写一个exec不是 httpGet) 运行命令检查文件存在/修改日期/时间的活动探针kubernetes.io/docs/tasks/configure-pod-container/…
  • 谢谢!这正是我想要的
  • 我会说您需要稍微调整一下解决方案。如果应用程序冻结,发布者本身可能无法删除该文件。因此,您可以有一个看起来是实时的挂起服务。我会调整并让运行状况检查发布者修改现有文件,并让活性探针跟踪修改日期(可能通过使用第二个文件)。这样您就可以跟踪整个应用程序冻结并且无法删除文件的情况
  • 很好的标注!我会检查文件修改日期
  • 如果一切顺利,我建议您完成自我回答

标签: c# asp.net-core kubernetes


【解决方案1】:

感谢@pinkfloydx33 的指点,我能够构建这个解决方案:

程序.cs

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
    .ConfigureServices((hostContext, services) =>
    {
        services.AddHealthChecks() // Register some real health check here ==>
            .AddCheck("test", () => DateTime.UtcNow.Minute % 2 == 0 ? HealthCheckResult.Healthy() : HealthCheckResult.Unhealthy());
        services.AddSingleton<IHealthCheckPublisher, HealthCheckPublisher>();
        services.Configure<HealthCheckPublisherOptions>(options =>
        {
            options.Delay = TimeSpan.FromSeconds(5);
            options.Period = TimeSpan.FromSeconds(20);
        });

        // Register the actual message processor service
        services.AddHostedService<QueueProcessorService>();
    })

HealthCheckPublisher.cs

public class HealthCheckPublisher : IHealthCheckPublisher
{
    private readonly string _fileName;
    private HealthStatus _prevStatus = HealthStatus.Unhealthy;

    public HealthCheckPublisher()
    {
        _fileName = Environment.GetEnvironmentVariable("DOCKER_HEALTHCHECK_FILEPATH") ??
                    Path.GetTempFileName();
    }

    /// <summary>
    /// Creates / touches a file on the file system to indicate "healtyh" (liveness) state of the pod
    /// Deletes the files to indicate "unhealthy"
    /// The file will then be checked by k8s livenessProbe
    /// </summary>
    /// <param name="report"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    public Task PublishAsync(HealthReport report, CancellationToken cancellationToken)
    {
        var fileExists = _prevStatus == HealthStatus.Healthy;

        if (report.Status == HealthStatus.Healthy)
        {
            using var _ = File.Create(_fileName);
        }
        else if (fileExists)
        {
            File.Delete(_fileName);
        }

        _prevStatus = report.Status;

        return Task.CompletedTask;
    }
}

k8s deployment.yaml(原始来源:https://medium.com/spire-labs/utilizing-kubernetes-liveness-and-readiness-probes-to-automatically-recover-from-failure-2fe0314f2b2e

livenessProbe:
  exec:
    command:
    - find
    - /tmp/healthy
    - -mmin
    - '-1'
  initialDelaySeconds: 5
  periodSeconds: 10

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多