Xây Dựng Hệ Thống Khởi động lại Tự động An toàn với Kured và Prometheus

Tổng quan về Tích hợp Giám sát Khởi động lại

Kubernetes Reboot Daemon (Kured) được thiết kế để tự động quản lý quy trình khởi động lại các nút (node) trong cụm集群. Tuy nhiên, việc khởi động chỉ dựa trên dấu hiệu tĩnh (như sự tồn tại của file cảm biến) thường không đủ linh hoạt để xử lý các tình huống phức tạp trong môi trường sản xuất. Bằng cách kết nối Kured với hệ thống giám sát Prometheus, ta có thể thiết lập một cơ chế ra quyết định động, đảm bảo việc duy trì phần cứng diễn ra an toàn mà không làm gián đoạn dịch vụ cốt lõi.

Mục tiêu chính của việc tích hợp này là đưa dữ liệu thời gian thực vào quá trình ra quyết định. Thay vì khởi động ngẫu nhiên, Kured sẽ kiểm tra trạng cảnh báo trước khi thực hiện hành động.

Lợi ích của Việc Liên kết với Monitoring System

Khi thiếu dữ liệu từ hệ thống giám sát bên ngoài, nguy cơ xảy ra sự cố khi tái cấu hình node luôn hiện hữu. Dưới đây là các khả năng tăng cường khi dùng Prometheus:

  • Nhận diện xung đột: Phát hiện các sự kiện lỗi nghiêm trọng đang diễn ra và tạm hoãn tiến trình khởi động.
  • Quản lý lịch trình: Chỉ ưu tiên thực hiện cập nhật phần mềm hoặc reboot trong khung giờ ít tương tác.
  • Khả năng truy vết: Ghi nhận lại lịch sử kích hoạt dựa trên các metric cụ thể giúp việc audit trở nên dễ dàng hơn.

yêu cầu Chuẩn bị Môi Trường

Trước khi triển khai cấu hình, hãy xác nhận các điều kiện nền tảng sau:

  1. Bộ máy Kubernetes đã sẵn sàng (khuyến nghị phiên bản từ 1.21 trở lên).
  2. Prometheus đã được cài đặt và cấu hình rule cảnh báo phù hợp.
  3. Dịch vụ Kured đã chạy dưới dạng DaemonSet trên tất cả các node mong muốn.

Cấu hình chi tiết thường nằm trong file tài nguyên Kubernetes hoặc tham số khởi động của container. Các hàm xử lý logic tích hợp nằm ở phần thư mục `pkg/blockers/`.

Cấu Hình Tham Số Kết Nối

Việc giao tiếp giữa Kured và Prometheus được điều khiển thông qua cờ khởi động (flags) trong manifest của DaemonSet. Các tham số quan trọng bao gồm:

1. Địa Điểm Kết Nối

Đối với mạng nội bộ Kubernetes, đường dẫn đến Prometheus Service thường có dạng DNS đầy đủ. Ví dụ cấu hình URL:

# Cấu hình trong args hoặc env
# --prometheus-http-address=http://prometheus.monitoring.svc.cluster.local:9090

2. Bộ Lọc Cảnh Báo (Filtering Rules)

Để tránh cảnh báo giả hoặc nhiễu, bạn có thể điều chỉnh regex lọc tên cảnh báo và trạng thái của chúng:


--alert-filter-regexp="^Critical|MemoryPressure$" 
--alert-firing-only=true 
--alert-match-mode=false

Trong đó:

  • --alert-filter-regexp: Định dạng chuỗi ký tự mẫu dùng để khớp tên rule.
  • --alert-firing-only: Nếu đặt thành true, Kured chỉ phản hồi khi trạng thái cảnh báo là Firing.

3. Ví dụ Triển Khai Fullstack

Dưới đây là đoạn trích cấu hình Helm Chart hoặc Yaml DaemonSet hoàn chỉnh:

containers:
  - name: kured
    command:
      - /usr/bin/kured
      - --reboot-sentinel=/var/run/kubernetes/reboot-marker
      - --prometheus-http-address=http://prometheus.kube-system.svc:9090
      - --lock-object=kured-lock
      - --alert-regexp=HighLoad|DiskSpace|OomKiller
      - --firing-only=true

Sơ Đồ Hoạt Động Nội Bộ

Logic kiểm soát được đóng gói trong module chặn (blocker). Khi daemon chạy chu kỳ, nó sẽ thực hiện luồng xử lý sau:

  1. Tạo instance khách hàng giao tiếp API Prometheus.
  2. Gửi yêu cầu truy vấn `GET /api/v1/query_range` để lấy dữ liệu cảnh báo mới nhất.
  3. Hệ thống lọc bỏ các kết quả không khớp với regexp quy định.
  4. Nếu danh sách cảnh báo còn lại khác rỗng, hệ thống quay về trạng thái Chặn (Blocked).

Đoạn mã giả dưới đây mô tả logic hàm kiểm tra trạng thái (đã thay đổi tên biến để minh họa):


// Logic đơn giản hóa cho ví dụ
func (blocker *AlertMonitorChecker) VerifyAllowance() bool {
    // Lấy danh sách các cảnh báo đang hoạt động
    currentFires, err := blocker.FetchActiveSignals()
    if err != nil {
        logger.Warn("Lỗi truy vấn dữ liệu:", err)
        return blocker.AllowDefault
    }

    // Trả về false nếu có bất kỳ cảnh báo nào trùng lặp
    return len(currentFires) == 0
}

Kiểm Thử Tính Năng Sau Khi Cài Đặt

Để đảm bảo cơ chế hoạt động đúng như mong đợi, hãy thực hiện các bước thử nghiệm sau:

1. Tạo Tình Huống Giả Mạ (Simulate Alerts)

Bạn có thể sử dụng công cụ dòng lệnh `curl` gửi request trực tiếp tới API Prometheus hoặc điều chỉnh file Alertmanager để trigger một cảnh báo tạm thời có tên khớp với quy tắc đã set.

2. Kiểm Tra Nhật Ký Daemon

Sử dụng lệnh sau để xem nhật ký chi tiết của Kured, tìm kiếm thông tin về việc ngăn chặn hoặc cho phép khởi động:

kubectl logs -n kube-system -l app.kubernetes.io/name=kured

3. Xác Minh Qua Đơn Vị Kiểm Thử

Kết quả kiểm thử đơn vị cho module blockers cung cấp cái nhìn sâu hơn về các kịch bản edge-case. File nguồn thường nằm tại thư mục tests tương ứng.

Xử Lý Các Lỗi Thường Gặp

Vấn đề 1: Không Thể Thiết Lập Kết Nối Đến Service Giám Sát

Nếu thấy lỗi kết nối timeout:

  • Kiểm tra lại cấu hình mạng Policy trong namespace monitoring.
  • xác minh tên Service DNS trong tham số `--prometheus-http-address`.
  • Đảm bảo ServiceAccount của Kured không bị khóa bởi Pod Security Standards.

Vấn đề 2: Quy Trình Khởi Động Bị Ngăn Cản Quá Mức

Nếu node bị kẹt ở trạng thái chờ mãi:

  • Rà soát lại regex filter, có thể nó đang quá rộng và bắt phải các cảnh báo không liên quan.
  • Kiểm tra xem có đang bật chế độ `alert-firing-only` hay chưa, đôi khi cảnh báo Pending cũng gây nhiễu.
  • Thay đổi tham số `--allow-empty-alerts` nếu cần linh hoạt hơn.

Vấn đề 3: Quan Sát Chỉ Số Metics Của Chính Daemon

Kured tự publish metrics để phục vụ việc monitor ngược lại. Mặc định nó lắng nghe tại cổng nội bộ 8080. Để thay đổi cổng, dùng flag `--metrics-port`. Dữ liệu này rất hữu ích để vẽ bảng Dashboard tổng quan về tần suất restart.

Thẻ: kured prometheus Kubernetes node-maintenance golang

Đăng vào ngày 25 tháng 6 lúc 02:46