Автор оригинала: Mona Mohamadinia.
1. Обзор
В этом учебнике, мы увидим, как Весенняя загрузка 2.3 интегрируется с Kubernetes зонды создать еще более приятный облачный опыт.
Во-первых, мы начнем с небольшого фона на зондах Kubernetes. Затем мы переключим передачи и посмотрим, как Spring Boot 2.3 поддерживает эти зонды.
2. Зонды Kubernetes
При использовании Kubernetes в качестве нашей платформы оркестровки, kubelet в каждом узел отвечает за поддержание стручков в этом узел здоровым.
Например, иногда нашим приложениям может потребоваться немного времени, прежде чем мы сможем принимать запросы. Kubelet может убедиться, что приложение получает запросы только тогда, когда оно будет готово. Кроме того, если основной процесс стручка падает по какой-либо причине, kubelet перезапустит контейнер.
Для выполнения этих обязанностей, Kubernetes имеет два зонда: живость зондов и зондов готовности.
Kubelet будет использовать зонд готовности, чтобы определить, когда приложение готово принять запросы. В частности, стручок готов, когда все его контейнеры будут готовы.
Аналогичным образом, kubelet может проверить, если стручок все еще жив через живость зондов . В основном, живость зонд помогает kubelet знать, когда он должен перезапустить контейнер.
Теперь, когда мы знакомы с концепциями, давайте посмотрим, как работает интеграция Spring Boot.
3. живут и готовность в актуаторе
По мере того как загрузка весны 2.3, LivenessStateЗдоровьеИндикатор и ГотовностьГосударственного ЗдравоохраненияИндикатор классы будут подвергать живость и состояние готовности приложения. Когда мы развертываем наше приложение в Kubernetes, Spring Boot автоматически регистрирует эти индикаторы здоровья.
В результате мы можем использовать /Актуатор/здоровье/живость и /актуатор/здоровье/готовность конечные точки, как наша живость и готовность зондов, соответственно.
Например, мы можем добавить их в наше определение стручка, чтобы настроить зонд живости как запрос HTTP GET:
livenessProbe: httpGet: path: /actuator/health/liveness port: 8080 initialDelaySeconds: 3 periodSeconds: 3
Мы обычно позволяем Spring Boot решать, когда встать эти зонды для нас. Но, если мы хотим, мы можем включить их вручную в наших application.properties.
Если мы работаем с Spring Boot 2.3.0 или 2.3.1, мы можем включить упомянутые зонды через свойство конфигурации:
management.health.probes.enabled=true
Тем не менее, так как весенняя загрузка 2.3.2, это свойство уничает из-за путаница конфигурации .
Если мы работаем с Spring Boot 2.3.2, мы можем использовать новые свойства для обеспечения живости и готовности зондов:
management.endpoint.health.probes.enabled=true management.health.livenessState.enabled=true management.health.readinessState.enabled=true
3.1. Готовность и живость государственных переходов
Spring Boot использует два энума для инкапсулировать различные состояния готовности и живости. Для состояния готовности существует энум под названием ГотовностьГосударственная со следующими значениями:
- ACCEPTING_TRAFFIC состояние означает, что приложение готово принять трафик
- REFUSING_TRAFFIC означает, что приложение пока не готово принимать какие-либо запросы
Аналогичным образом, Liveness Государство enum представляет состояние живости приложения с двумя значениями:
- ПРАВИЛЬНОе значение означает, что приложение работает и его внутреннее состояние правильно
- С другой стороны, BROKEN значение означает, что приложение работает с некоторыми фатальными сбоями
Вот как меняется состояние готовности и живости с точки зрения событий жизненного цикла приложения весной:
- Регистрация слушателей и инициализаторов
- Подготовка окружающая среда
- Подготовка ПриложениеКонтекст
- Загрузка определений фасоли
- Изменение состояния живости на Правильно
- Вызов приложений и командных строк
- Изменение состояния готовности на ACCEPTING_TRAFFIC
Как только приложение запущено и запущено, мы (и сама Весна) можем изменить эти состояния, опубликовав соответствующие ДоступностьИзменив .
4. Управление доступностью приложений
Компоненты приложения могут получить текущее состояние готовности и живости путем введения ПрименениеДоступность интерфейс:
@Autowired private ApplicationAvailability applicationAvailability;
Затем мы можем использовать его следующим образом:
assertThat(applicationAvailability.getLivenessState()) .isEqualTo(LivenessState.CORRECT); assertThat(applicationAvailability.getReadinessState()) .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC); assertThat(applicationAvailability.getState(ReadinessState.class)) .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC);
4.1. Обновление состояния доступности
Мы также можем обновить состояние приложения, опубликовав ДоступностьИзменив событие:
assertThat(applicationAvailability.getLivenessState()) .isEqualTo(LivenessState.CORRECT); mockMvc.perform(get("/actuator/health/liveness")) .andExpect(status().isOk()) .andExpect(jsonPath("$.status").value("UP")); AvailabilityChangeEvent.publish(context, LivenessState.BROKEN); assertThat(applicationAvailability.getLivenessState()) .isEqualTo(LivenessState.BROKEN); mockMvc.perform(get("/actuator/health/liveness")) .andExpect(status().isServiceUnavailable()) .andExpect(jsonPath("$.status").value("DOWN"));
Как показано выше, перед публикацией любого события, /актуатор/здоровье/живость конечная точка возвращает 200 OK ответ со следующим JSON:
{ "status": "OK" }
Затем, после нарушения состояния живости, та же конечная точка возвращает 503 службы недоступный ответ со следующим JSON:
{ "status": "DOWN" }
Когда мы меняемся в состояние готовности REFUSING_TRAFFIC, статус значение будет OUT_OF_SERVICE:
assertThat(applicationAvailability.getReadinessState()) .isEqualTo(ReadinessState.ACCEPTING_TRAFFIC); mockMvc.perform(get("/actuator/health/readiness")) .andExpect(status().isOk()) .andExpect(jsonPath("$.status").value("UP")); AvailabilityChangeEvent.publish(context, ReadinessState.REFUSING_TRAFFIC); assertThat(applicationAvailability.getReadinessState()) .isEqualTo(ReadinessState.REFUSING_TRAFFIC); mockMvc.perform(get("/actuator/health/readiness")) .andExpect(status().isServiceUnavailable()) .andExpect(jsonPath("$.status").value("OUT_OF_SERVICE"));
4.2. Прослушивание изменений
Мы можем зарегистрировать слушателей событий, которые будут уведомлены об изменении состояния доступности приложения:
@Component public class LivenessEventListener { @EventListener public void onEvent(AvailabilityChangeEventevent) { switch (event.getState()) { case BROKEN: // notify others break; case CORRECT: // we're back } } }
Здесь мы прислушиваемся к любым изменениям в состоянии живости приложения.
5. Автоконтумации
Перед завершением давайте посмотрим, как Spring Boot автоматически настраивает эти зонды в развертываниях Kubernetes. ДоступностьПробСаутоКонфигурация класс несет ответственность за регистрацию живости и готовности зондов условно.
На самом деле, есть особая состояние там, что регистрирует зонды, когда один из следующих истинный:
- Кубернетес является среда развертывания
- management.health.probes.enabled свойство настроено на истинный
Когда приложение отвечает одному из этих условий, автоматическая конфигурация регистрирует бобы LivenessStateЗдоровьеИндикатор и ГотовностьГосударственного ЗдравоохраненияИндикатор.
6. Заключение
В этой статье мы увидели, как мы можем использовать Spring Boot предоставляет два зонда здоровья для интеграции Kubernetes.
Как обычно, все примеры доступны более на GitHub .