Cấu hình và tích hợp Spring Boot Actuator cho giám sát ứng dụng trong Kubernetes

Spring Boot Actuator là thành phần cốt lõi giúp vận hành các ứng dụng Spring Boot một cách ổn định trong môi trường sản xuất, đặc biệt khi triển khai trên nền tảng Kubernetes. Cơ chế kiểm tra sức khỏe (health probing) của Actuator được thiết kế để đồng bộ hóa với hai loại probe chuẩn của Kubernetes: livenessreadiness, từ đó hỗ trợ tự động cân bằng tải, phát hiện sự cố và thực hiện khởi động lại hoặc chuyển hướng lưu lượng một cách chính xác.

Phân biệt liveness và readiness

Trong Kubernetes, hai probe này đảm nhiệm vai trò khác nhau:

  • Liveness probe: Xác định liệu tiến trình ứng dụng còn đang chạy hay không — tương đương với việc kiểm tra tiến trình Java chưa bị treo hoặc crash. Kết quả chỉ phụ thuộc vào trạng thái nội tại của ứng dụng (ví dụ: vòng đời Spring Context), không phụ thuộc vào các hệ thống bên ngoài như cơ sở dữ liệu hay dịch vụ REST.
  • Readiness probe: Đánh giá khả năng tiếp nhận yêu cầu HTTP từ bên ngoài. Trạng thái này phản ánh cả trạng thái khởi tạo hoàn tất (application context fully refreshed) lẫn tính sẵn sàng của các phụ thuộc bắt buộc (ví dụ: kết nối tới Redis, khả năng gọi API bên thứ ba).

Chu kỳ sống và trạng thái tương ứng

Giai đoạn Trạng thái liveness Trạng thái readiness Mô tả
Khởi tạo (Starting) BROKEN REFUSING_TRAFFIC Ứng dụng chưa sẵn sàng; K8S có thể khởi động lại nếu probe thất bại liên tục.
Context đã tải xong (Started) CORRECT REFUSING_TRAFFIC Spring Context đã sẵn sàng, nhưng các tác vụ khởi tạo tùy chỉnh (ví dụ: preload cache) chưa hoàn tất.
Sẵn sàng phục vụ (Ready) CORRECT ACCEPTING_TRAFFIC Ứng dụng có thể xử lý yêu cầu — readiness probe trả về UP.
Đang tắt dần (Graceful shutdown) CORRECT REFUSING_TRAFFIC K8S ngừng gửi traffic mới, nhưng vẫn cho phép xử lý các request đang chạy.

Các endpoint giám sát quan trọng

Actuator cung cấp nhiều endpoint qua giao diện HTTP hoặc JMX. Các endpoint thường dùng bao gồm:

  • /actuator/health: Tổng quan sức khỏe tổng thể.
  • /actuator/health/liveness/actuator/health/readiness: Dành riêng cho Kubernetes.
  • /actuator/env: Liệt kê biến môi trường và cấu hình runtime.
  • /actuator/beans: Hiển thị toàn bộ bean được quản lý bởi Spring Container.
  • /actuator/info: Thông tin tùy chỉnh (ví dụ: version build, commit hash).

Để kích hoạt các endpoint cần thiết, thêm vào application.yml:

management:
  endpoints:
    web:
      exposure:
        include: info, health, env, beans
  endpoint:
    health:
      show-details: always
      probes:
        enabled: true
  endpoints:
    enabled-by-default: false
  endpoint:
    health:
      group:
        liveness:
          include: livenessState
        readiness:
          include: readinessState, db, redis, customApi

Tích hợp HealthIndicator tùy chỉnh

Để mở rộng khả năng kiểm tra, bạn có thể triển khai interface HealthIndicator. Ví dụ sau kiểm tra khả năng truy cập một dịch vụ REST bên ngoài thông qua WebClient (thay vì RestTemplate cũ):

@Component
public class ExternalServiceHealthCheck implements HealthIndicator {

    private final WebClient webClient;

    public ExternalServiceHealthCheck(WebClient.Builder builder) {
        this.webClient = builder.baseUrl("https://api.example.com").build();
    }

    @Override
    public Health health() {
        try {
            Mono<String> response = webClient.get()
                .uri("/status")
                .retrieve()
                .bodyToMono(String.class)
                .timeout(Duration.ofSeconds(3));

            String body = response.block();
            return Health.up()
                .withDetail("response", body.substring(0, Math.min(100, body.length())))
                .build();

        } catch (Exception e) {
            return Health.down()
                .withDetail("error", e.getMessage())
                .withException(e)
                .build();
        }
    }
}

Khi triển khai, endpoint /actuator/health/readiness sẽ tự động bao gồm kết quả từ ExternalServiceHealthCheck, giúp Kubernetes tránh gửi traffic đến phiên bản chưa sẵn sàng.

Quản lý nhóm kiểm tra (Health Groups)

Actuator cho phép tổ chức các HealthIndicator thành nhóm logic. Ví dụ:

  • Nhóm database gồm DataSourceHealthIndicatorHikariHealthIndicator.
  • Nhóm cache gồm RedisHealthIndicatorCacheManagerHealthIndicator.

Định nghĩa nhóm trong cấu hình:

management:
  endpoint:
    health:
      group:
        database:
          include: db, hikaricp
        cache:
          include: redis, cachemanager

Sau đó truy cập /actuator/health/database hoặc /actuator/health/cache để kiểm tra từng nhóm độc lập.

Triển khai trong Kubernetes

Trong file deployment.yaml, cấu hình probe như sau:

livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
  initialDelaySeconds: 60
  periodSeconds: 30

readinessProbe:
  httpGet:
    path: /actuator/health/readiness
    port: 8080
  initialDelaySeconds: 20
  periodSeconds: 15

Việc phân tách rõ ràng giữa hai probe đảm bảo rằng K8S chỉ gửi lưu lượng đến các pod đã hoàn tất khởi tạo và có đầy đủ phụ thuộc hoạt động.

Thẻ: spring-boot-actuator kubernetes-probes health-indicator spring-boot-3 webclient

Đăng vào ngày 17 tháng 6 lúc 22:01