Недавно я работал над миграцией устаревшего сервиса 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»