Рубрики
Uncategorized

Как здоровья Проверьте свой сервис Topshelf в Kubernetes

Недавно я работал над миграцией устаревшего сервиса Topshelf от VM в Кубейнет. Сервис был предварительно … с меткой Kubernetes, CSHARP, DEVOPS, DOTNET.

Недавно я работал над миграцией устаревшего сервиса Topshelf от VM в Кубейнет.

Сервис был довольно нестабильным и время от времени переходить в разбитое состояние и должен был быть перезапущен вручную, что было меньше идеального.

Тем не менее, перемещение сервиса к Kubernetes не решит самому вопросу, потому что независимо от того, сколько образование будет определено в Развертывание В конечном итоге они в конечном итоге потерпят неудачу из-за одного из-за тупика, бесконечной петли и т. Д., И Кубернаны никогда не узнали, поскольку процессы будут отображаться как все еще счастливо запущены.

Чтобы исправить такие ситуации, мы можем использовать одно из здоровья Kubernetes Checks Живность зонда который будет сигнален Kubernetes, если ваш сервис мертв или жив. Другой — это Готовность зонда Что говорит Куберату, когда контейнер готов принять трафик. В этом посте я сосредоточусь на первом.

Есть 3 типа зондов лжи:

  • Http.
  • TCP.
  • Команда

Я покажу, как настроить и использовать самый популярный тип http.

Что оно делает?

Зонд выполняет HTTP-запрос на IP-адрес POD, порта и пути, указанный в спецификации POD. Если зонд получает 2xx или 3xx HTTP-код ответа HTTP, то POD считается здоровым. Если сервер возвращает код ответа на ошибку, или если он вообще не отвечает, зонд считается неудачей, и POD будет перезапущен.

Поскольку Topfhelf по умолчанию не является сервером HTTP, мы должны самосовещать его, используя OWIN (открытый веб-интерфейс для .NET).

Сделать это я использовал Верхняя полка. Оуин Пакет Nuget.

Начните с установки пакета:

Верхняя полка установки. Овладеть

Затем измените код запуска и настройте конечную точку Owin, чтобы запустить на 8080 порт:

HostFactory.Run(configure =>
{
    configure.Service(service =>
    {
        service.ConstructUsing(s => new MyHeadacheService());
        service.WhenStarted(s => s.Start());
        service.WhenStopped(s => s.Stop());

        service.OwinEndpoint(app =>
        {
            app.Domain = "*";
            app.Port = 8080;
        });
    });
});

Теперь создайте новый файл HealthCheckController И определить контроллер API для проверки здоровья. Я использую Маршрут ("") что означает, что конечная точка проверки здоровья будет работать в localhost: 8080 Отказ

Конечная точка Health Cleash предположит здорованность нашего сервиса до тех пор, пока статическое свойство HealthCheckStatus. Leealthy это правда Отказ

Одним из проблем с таким видом чека состоит в том, что она может не проверить отзывчивость службы, таким образом, важно, чтобы чек выполняет свою задачу аналогичным образом, поскольку зависимые услуги будут делать. С другой стороны, он не должен проверять свои зависимости, поскольку это Готовность зонда Задача, как я упоминал ранее.

Для целей тестирования мы добавим дополнительную конечную точку, которая поставит наш сервис в искусственное разбитое состояние, поэтому проверка здоровья вернет 500 код состояния вместо 200 Отказ Обратите внимание, что я использую Serilog регистратор, который выводят на консоль каждый раз, когда конечная точка ударила.

public class HealthcheckController : ApiController
{
    [HttpGet, Route("")]
    public IHttpActionResult Healthcheck()
    {
        Log.Information("Healthcheck invoked using User-Agent: {UserAgent}", Request.Headers.UserAgent?.ToString());
        return HealthCheckStatus.IsHealthy ? Ok() : (IHttpActionResult) InternalServerError(new Exception("I'm not healthy. Restart me."));
    }

    [HttpGet, Route("break")]
    public IHttpActionResult Break()
    {
        Log.Information("Ups!");
        HealthCheckStatus.IsHealthy = false;
        return Ok();
    }
}

public static class HealthCheckStatus
{
    public static bool IsHealthy { get; set; } = true;
}

Наш сервис Topsfeed Topshelf теперь готов к обслуживанию зондов Kubernetes. Теперь мы должны позволить Kubernetes знаю, где здоровья проверяют наш сервис.

В спецификации POD мы добавляем раздел, чтобы рассказать Kubernetes выполнить зонд Lives на пути POD / и порт 8080 :

livenessProbe:
  httpGet:
    path: /
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5
  • INationalDelayseconds — Это задержка, которая рассказывает Kubelet (агент узла), чтобы дождаться 5 секунд, прежде чем выполнять первый зонд
  • Периоды — Указывает, что кублет должен выполнять пробную проживание каждые 5 секунд.

По умолчанию и минимальное время ожидания для запроса зонда — 1 секунду и может быть настроен с использованием Тайм-аутсекунды .

Чтобы увидеть другие варианты конфигурации, посмотрите на официальный документы .

Теперь мы можем развернуть наш POD (ы) на кластере и увидеть, как зонды отправляются на POD.

kubectl logs -f podname

[20:25:41 INF] Healthcheck invoked using User-Agent: kube-probe/1.15

С нашей разрывной конечной точкой ( : 8080/Break/ ) Теперь смогут имитировать искусственное разбитое состояние.

Давайте оболочке в бегущий подпуск:

kubectl exec -it podname cmd

и сбой триггера:

Curl -V Localhost: 8080/Break

Подождите достаточно долго, чтобы зонд имел шанс выполнить и увидеть неудачный зонд в событиях POD:

Kubectl Опишите Pod Podname

Events:
Type     Reason     Age                  From                     Message
----     ------     ----                 ----                     -------
Warning  Unhealthy  40s (x3 over 70s)    kubelet, *** Liveness probe failed: HTTP probe 
failed with statuscode: 500

Убедитесь, что это было перезапущено путем листинга POD:

Kubectl Получить Pod Podname

NAME      READY   STATUS    RESTARTS   AGE
podname   1/1     Running   1          1h

Вы можете увидеть столбец перезапуски показывает только что.

Самоустановившимся сервисом Topshelf и добавлением конечной точки состояния здоровья к нему можно использовать Kubernetes Valites, которые могут значительно улучшить надежность и устойчивость вашего обслуживания.

Оригинал: «https://dev.to/wolnikmarcin/how-to-health-check-your-topshelf-service-in-kubernetes-3phl»