Подходящие пробники готовности и жизнеспособности Kubernetes для Kestrel.NET Core Web API

Наша цель - горизонтально масштабировать веб-API.NET Core 2.0 с использованием Kubernetes. Приложение Web API будет обслуживаться Kestrel.

Похоже, мы можем изящно обрабатывать окончание контейнеров, настраивая тайм-аут завершения Kestrel, поэтому теперь мы изучаем, как исследовать приложение, чтобы определить готовность и жизнеспособность.

Было бы достаточно просто исследовать веб-API с помощью HTTP-запроса? Если это так, было бы хорошей идеей создать новый контроллер проверки работоспособности для обработки этих запросов на зондирование или было бы разумнее исследовать фактическую конечную точку, которая будет потребляться при нормальном использовании?

Что мы должны учитывать при дифференциации зондов жизнедеятельности и готовности?

Ответ 1

Я бы рекомендовал проводить проверки состояния здоровья через отдельные конечные точки. В целом, есть несколько веских причин для этого, например:

  1. Проверка того, что приложение в реальном времени/готово или, в целом, в здоровом состоянии, не обязательно совпадает с отправкой запроса пользователя на ваш веб-сервис. При выполнении проверок состояния здоровья вы должны определить, что делает ваш веб-сервис здоровым: это может быть, например, проверка доступа к внешним ресурсам, таким как база данных.
  2. Легче контролировать, кто может фактически проверять работоспособность через ваши конечные точки.
  3. Более того, вы не хотите испортить фактические функциональные возможности службы: в противном случае вам нужно было бы подумать о том, как вы выполняете проверки работоспособности при сохранении функциональных возможностей службы. Например, если ваша служба взаимодействует с базой данных, в контексте проверки работоспособности вы хотите проверить, что соединение с базой данных в порядке, но на самом деле вы не очень заботитесь о том, что данные обрабатываются внутри вашей службы.
  4. Все становится еще сложнее, если ваш веб-сервис не является апатридом: в таком случае вам нужно будет убедиться, что данные остаются неизменными независимо от проверок вашего здоровья.

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

В качестве альтернативного варианта в ASP.NET Core имеется стандартная библиотека для включения проверки работоспособности на вашем веб-сервисе: на момент написания этого ответа он официально не входит в состав ASP.NET Core и пакеты NuGet еще не доступны, но есть план, чтобы это произошло в будущих выпусках. Пока вы можете легко вывести код из официального репозитория и включить его в свое решение, как описано в документации Microsoft. В настоящее время это планируется включить в ASP.NET Core 2.2, как описано в " Дорожной карте" ASP.NET Core 2.2.

Я лично считаю его очень элегантным, так как вы будете настраивать все через Startup.cs и Program.cs и не нужно явно создавать новую конечную точку, поскольку библиотека уже обрабатывает это для вас.

Я использую его в нескольких проектах, и я определенно рекомендую его. Репозиторий включает пример, характерный для проектов ASP.NET Core, которые вы можете использовать, чтобы быстро добираться до скорости.

Личность против готовности

В Kubernetes вы можете настроить пробники жизнеспособности и готовности через HTTP: как описано в документации Kubernetes, в то время как настройка для обоих почти идентична, Kubernetes предпринимает различные действия в зависимости от зонда:

Живучесть зонд из Kubernetes документации:

Многие приложения, работающие в течение длительных периодов времени, в конечном итоге переходят в разбитые состояния и не могут восстановить, за исключением перезапуска. Kubernetes предоставляет датчики жизнедеятельности для обнаружения и устранения таких ситуаций.

Зона готовности от документации Kubernetes:

Иногда приложения временно не могут обслуживать трафик. Например, при запуске приложения может потребоваться загрузить большие данные или файлы конфигурации. В таких случаях вы не хотите убивать приложение, но вы также не хотите отправлять ему запросы. Kubernetes предоставляет датчики готовности для обнаружения и смягчения этих ситуаций. Контейнер с контейнерами, сообщающий, что они не готовы, не получает трафик через Kubernetes Services.

Таким образом, хотя нездоровый ответ на пробуждающий зонд заставит Pod (и так, приложение) быть убитым, нездоровый ответ на зонд готовности просто заставит Pod получать трафик, пока он не вернется к здоровому состоянию.

Что следует учитывать при дифференцировании зондов жизнеспособности и готовности?

Для исследования активности: я бы рекомендовал определить, что делает ваше приложение здоровым, т.е. Минимальные требования к потреблению пользователей, и проводить на нем проверки работоспособности. Обычно это внешние ресурсы или приложения, выполняемые как отдельные процессы, например базы данных, веб-службы и т.д. Вы можете определить проверки работоспособности с помощью библиотеки основных средств проверки работоспособности ASP.NET или вручную с помощью отдельного контроллера.

Для проверки готовности: вы просто хотите загрузить свою службу, чтобы убедиться, что она действительно отвечает вовремя, и поэтому позволяет Kubernetes соответствующим образом балансировать трафик. Тривиально (и в большинстве случаев, как предложил Лукас в другом ответе), вы можете использовать ту же самую точную конечную точку, которую будете использовать для жизнеспособности, но устанавливаете разные тайм-ауты, но это действительно зависит от ваших потребностей и требований.

Ответ 2

Что мы должны учитывать при дифференциации зондов жизнеспособности и готовности

Моя рекомендация заключалась бы в том, чтобы предоставить конечную точку /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 конечной точки /health вы должны проверить внутреннее состояние своего приложения и вернуть код состояния 200 если все в порядке или 503 если у вашего приложения возникли проблемы. Имейте в виду, что проверки работоспособности выполняются обычно каждые 15 секунд для каждого экземпляра, и если вы выполняете дорогостоящие операции для определения состояния вашего приложения, вы можете замедлить свое приложение.

Что мы должны учитывать при дифференциации зондов жизнеспособности и готовности

Обычно единственной разницей между датчиками жизнеспособности и готовности являются тайм-ауты в каждом зонде. Возможно, вашему приложению потребуется 60 секунд, чтобы начать, тогда вам нужно будет установить начальный тайм-аут вашего теста готовности на 60, сохраняя время ожидания по умолчанию.