Настройка Spring Boot Actuator для Kubernetes probing

Настройка Spring Boot Actuator для Kubernetes probing

Mikhail Borisov

Если вы использовали Spring Initializr, то вам не нужно думать о совместимых версиях, т.к. в Gradle будет применен плагин io.spring.dependency-management, а в Maven ваш pom.xml будет отнаследован от org.springframework.boot:spring-boot-starter-parent, оба способа зафиксируют совместимые версии зависимостей для Spring Boot. Также, если вы начинаете новый проект, то в Spring Initializr можно сразу добавить Spring Boot Actuator и Spring Web/Reactive Web, которые нам понадобятся.

Прежде всего, нужно добавить starter для actuator:

Gradle:

dependencies {
   // какие-то зависимости...
   implementation 'org.springframework.boot:spring-boot-starter-actuator'
   // еще какие-то зависимости...
}

Maven:

<dependencies>
   // какие-то зависимости...
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
   </dependency>
   // еще какие-то зависимости...
</dependencies>

Теперь actuator присутствует в classpath и мы можем получить информацию о приложении через JMX, но мы хотим, чтобы Kubernetes мог "достучаться" до нее по HTTP. Без Spring Web/Reactive Web у приложения не будет веб-сервера, который мог бы отдавать ответы, поэтому добавим один из них.

Gradle:

dependencies {
   // какие-то зависимости...
   implementation 'org.springframework.boot:spring-boot-starter-webflux'
   // еще какие-то зависимости...
}

Maven:

<dependencies>
   // какие-то зависимости...
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-webflux</artifactId>
   </dependency>
   // еще какие-то зависимости...
</dependencies>

Все возможные опции для настройки представлены тут. При запуске приложения в среде Kubernetes, Spring Boot должен автоматически сделать доступными пути /actuator/health/liveness и /actuator/health/readiness, которые мы можем использовать в Kubernetes. Если мы хотим увидеть эти пути при локальном запуске или по какой-то причине Spring Boot не делает их доступными автоматически, нам нужно задать свойство (в application.properties, application.yml или другими способами. Прочитать о способах можно здесь)

management.health.probes.enabled=true

Доступные статусы описаны здесь. После того, как мы добавили Spring Boot Actuator в зависимости, мы можем изменять состояния probes используя механизм ApplicationEvent. Вот пример такого использования:

/**
 * Component that checks that the local cache is in a valid state.
 */
@Component
public class LocalCacheVerifier {

    private final ApplicationEventPublisher eventPublisher;

    public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
        this.eventPublisher = eventPublisher;
    }

    public void checkLocalCache() {
        try {
            //...
        }
        catch (CacheCompletelyBroken ex) {
            AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
        }
    }

}


Report Page