Ответ 1
Я бы рекомендовал проводить проверки состояния здоровья через отдельные конечные точки. В целом, есть несколько веских причин для этого, например:
- Проверка того, что приложение в реальном времени/готово или, в целом, в здоровом состоянии, не обязательно совпадает с отправкой запроса пользователя на ваш веб-сервис. При выполнении проверок состояния здоровья вы должны определить, что делает ваш веб-сервис здоровым: это может быть, например, проверка доступа к внешним ресурсам, таким как база данных.
- Легче контролировать, кто может фактически проверять работоспособность через ваши конечные точки.
- Более того, вы не хотите испортить фактические функциональные возможности службы: в противном случае вам нужно было бы подумать о том, как вы выполняете проверки работоспособности при сохранении функциональных возможностей службы. Например, если ваша служба взаимодействует с базой данных, в контексте проверки работоспособности вы хотите проверить, что соединение с базой данных в порядке, но на самом деле вы не очень заботитесь о том, что данные обрабатываются внутри вашей службы.
- Все становится еще сложнее, если ваш веб-сервис не является апатридом: в таком случае вам нужно будет убедиться, что данные остаются неизменными независимо от проверок вашего здоровья.
Как вы указали, хорошим способом избежать любого из вышеперечисленных может быть создание отдельного контроллера для обработки проверок работоспособности.
В качестве альтернативного варианта в 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 соответствующим образом балансировать трафик. Тривиально (и в большинстве случаев, как предложил Лукас в другом ответе), вы можете использовать ту же самую точную конечную точку, которую будете использовать для жизнеспособности, но устанавливаете разные тайм-ауты, но это действительно зависит от ваших потребностей и требований.