Thanos: Nền tảng Giám sát Phân tán và Bảo mật

·

10 min read

Thanos là một giải pháp mở rộng (scalable) được xây dựng trên Prometheus để cung cấp khả năng lưu trữ lâu dài, truy vấn tập trung, tính sẵn sàng cao (high availability), và khả năng vận hành đa cụm (multi-cluster). Với các tổ chức DevSecOps, Thanos không chỉ đơn thuần là một công cụ giám sát mà còn là một phần quan trọng trong chiến lược quản lý bảo mật và tuân thủ.

Thanos là giải pháp mở rộng của Prometheus, được thiết kế để giải quyết các hạn chế trong khả năng lưu trữ, sẵn sàng cao, và quản lý đa cụm. Đối với DevSecOps, Thanos không chỉ cung cấp khả năng giám sát mạnh mẽ mà còn đảm bảo tuân thủ các yêu cầu về bảo mật và quản lý truy cập.


1. Giới thiệu về Thanos

Prometheus là công cụ giám sát mạnh mẽ, nhưng nó có một số hạn chế:

  • Không có lưu trữ lâu dài: Metrics chỉ tồn tại trong bộ nhớ ngắn hạn.

  • Giới hạn xử lý đơn cụm: Không dễ dàng tích hợp dữ liệu từ nhiều Prometheus.

  • Không hỗ trợ phân cụm (clustering): Một Prometheus node lỗi sẽ làm mất dữ liệu.

  • Không hỗ trợ lưu trữ lâu dài: Dữ liệu cũ thường bị xóa để giải phóng tài nguyên.

  • Không có tính sẵn sàng cao (HA): Một instance Prometheus gặp sự cố có thể gây mất dữ liệu.

  • Khó quản lý đa cụm (multi-cluster): Truy vấn dữ liệu từ nhiều Prometheus là một thách thức lớn.

Thanos khắc phục những vấn đề này bằng cách mở rộng Prometheus với các tính năng:

  • Lưu trữ lâu dài (Long-term Storage): Dữ liệu được lưu trữ trên các Object Storage như S3, MinIO, hoặc Ceph.

  • Sẵn sàng cao (HA): Cho phép nhiều Prometheus hoạt động đồng thời mà không trùng lặp dữ liệu.

  • Truy vấn tập trung (Centralized Query): Tập hợp dữ liệu từ nhiều Prometheus vào một giao diện duy nhất.

  • Khả năng mở rộng (Scalability): Xây dựng kiến trúc modular, dễ dàng mở rộng theo yêu cầu.

2. Kiến trúc và Mô hình Hoạt động

Thanos có các thành phần chính:

  1. Thanos Sidecar:

    • Gắn với từng Prometheus instance.

    • Truyền dữ liệu từ Prometheus đến Object Storage.

    • Đảm bảo tính sẵn sàng cao (HA) bằng cách gửi dữ liệu đồng bộ giữa các Prometheus.

  2. Thanos Receiver:

    • Nhận dữ liệu từ nhiều Prometheus qua Remote Write.

    • Là thành phần quan trọng để thiết lập mô hình "Write Path".

  3. Thanos Store Gateway:

    • Truy vấn và tải dữ liệu lịch sử từ Object Storage.
  4. Thanos Querier:

    • Cung cấp giao diện tập trung để truy vấn metrics từ các Prometheus và Thanos Store Gateway.

    • Hỗ trợ API PromQL quen thuộc.

  5. Thanos Compactor:

    • Nén dữ liệu trong Object Storage để tối ưu hóa chi phí lưu trữ.

Mô hình triển khai phổ biến

  1. Pull-based Model:

    • Prometheus gửi dữ liệu tới Sidecar, và Querier truy vấn dữ liệu từ Sidecar và Object Storage.

    • Phù hợp với các cụm Prometheus có sẵn.

    •   +-------------------+                     +-------------------+
        | Prometheus A      |                     | Prometheus B      |
        | (local scrape)    |                     | (local scrape)    |
        |  +------------+   |                     |  +------------+   |
        |  |   Sidecar  |---|-----------------------|---Sidecar    |   |
        |  +------------+   |                     |  +------------+   |
        |                   |                     |                   |
        +-------------------+                     +-------------------+
               |                                         |
               | (Query and Upload to Object Storage)    |
               |                                         |
               v                                         v
        +-------------------------------------------------------+
        |                    Object Storage                     |
        | (e.g., S3, MinIO, GCS)                                |
        +-------------------------------------------------------+
               |                                         |
               v                                         v
        +-------------------+                     +-------------------+
        | Thanos Store      |                     | Thanos Store      |
        | Gateway           |                     | Gateway           |
        +-------------------+                     +-------------------+
               |                                         |
               |                                         |
               +-----------------------+-----------------+
                                       |
                                       v
                             +-------------------+
                             | Thanos Querier    |
                             | (Unified Query)   |
                             +-------------------+
                                       |
                                       v
                              +------------------+
                              | Grafana / CLI    |
                              | (PromQL Query)   |
                              +------------------+
      
  2. Push-based Model:

    • Prometheus sử dụng Remote Write để gửi trực tiếp dữ liệu tới Thanos Receiver.

    • Hỗ trợ các thiết lập bảo mật, xác thực và phân quyền tốt hơn.

    •   +-------------------+                     +-------------------+
        | Prometheus A      |                     | Prometheus B      |
        |  (Remote Write)   |                     |  (Remote Write)   |
        |  +------------+   |                     |  +------------+   |
        |  | Remote_write|---|-----------------------|---Remote_write| |
        |  +------------+   |                     |  +------------+   |
        |                   |                     |                   |
        +-------------------+                     +-------------------+
               |                                         |
               |  (Send Metrics to Receiver)            |
               |                                         |
               v                                         v
                             +-------------------+
                             | Thanos Receiver   |
                             | (Aggregates Data) |
                             +-------------------+
                                       |
                                       |
                             +-------------------+
                             | Object Storage    |
                             +-------------------+
                                       |
                                       v
                             +-------------------+
                             | Thanos Store      |
                             | Gateway           |
                             +-------------------+
                                       |
                                       v
                             +-------------------+
                             | Thanos Querier    |
                             | (Unified Query)   |
                             +-------------------+
                                       |
                                       v
                             +-------------------+
                             | Grafana / CLI     |
                             +-------------------+
      
  3. Hybrid Model:

    • Kết hợp cả Pull và Push để tối ưu khả năng quản lý dữ liệu.

    •   +-------------------+                     +-------------------+
        | Prometheus A      |                     | Prometheus B      |
        |  (Remote Write +  |                     |  (Sidecar + Local |
        |   Sidecar)        |                     |   Storage)        |
        |  +------------+   |                     |  +------------+   |
        |  | Sidecar    |---|---+                 |  | Sidecar    |---+ 
        |  | RemoteWrite|---|---+                 |  +------------+   |
        |  +------------+   |                     |                   |
        +-------------------+                     +-------------------+
               |                                         |
               |                                         |
               +-----------------+-----------------------+
                                 |
                                 v
                         +-------------------+
                         | Thanos Receiver   |
                         +-------------------+
                                 |
                                 v
                         +-------------------+
                         | Object Storage    |
                         +-------------------+
                                 |
                                 v
                         +-------------------+
                         | Thanos Store      |
                         | Gateway           |
                         +-------------------+
                                 |
                                 v
                         +-------------------+
                         | Thanos Querier    |
                         | (Unified Query)   |
                         +-------------------+
                                 |
                                 v
                         +-------------------+
                         | Grafana / CLI     |
                         +-------------------+
      

Ghi chú cho các thành phần:

  1. Prometheus A/B:

    • Chịu trách nhiệm thu thập metrics từ các dịch vụ trong cụm.

    • Có thể sử dụng Sidecar hoặc Remote Write để gửi dữ liệu.

  2. Thanos Sidecar:

    • Kết nối với Prometheus để gửi dữ liệu lịch sử tới Object Storage.

    • Cung cấp giao diện để Thanos Querier truy vấn.

  3. Thanos Receiver:

    • Nhận dữ liệu trực tiếp từ Prometheus qua Remote Write.

    • Kết hợp với Object Storage để lưu trữ lâu dài.

  4. Object Storage:

    • Lưu trữ dữ liệu lâu dài (AWS S3, MinIO, Ceph, GCS).
  5. Thanos Store Gateway:

    • Lấy dữ liệu lịch sử từ Object Storage.

    • Giảm tải Prometheus và tăng hiệu quả truy vấn.

  6. Thanos Querier:

    • Giao diện truy vấn trung tâm.

    • Tích hợp PromQL, sử dụng với Grafana hoặc các công cụ CLI.

  7. Grafana / CLI:

    • Giao diện truy vấn dữ liệu trực quan hoặc dòng lệnh.

3. Xác Thực và Phân Quyền

Xác thực

Thanos hỗ trợ các cơ chế xác thực:

  1. mTLS (Mutual TLS):

    • Prometheus và Thanos sử dụng chứng chỉ client/server để xác thực lẫn nhau.

    • Phù hợp với môi trường bảo mật cao, đặc biệt là trong multi-cluster.

  2. Token Authentication:

    • Proxy (NGINX, Envoy) trước Thanos Receiver yêu cầu Prometheus gửi token để xác thực.

    • Đơn giản và dễ triển khai.

      • Cấu hình NGINX/Envoy làm Proxy phía trước Thanos Receiver: Sử dụng một proxy như NGINX hoặc Envoy để yêu cầu Prometheus gửi token hoặc API key trong header khi gửi dữ liệu. Proxy sẽ xác thực token trước khi chuyển yêu cầu tới Thanos Receiver.

        Ví dụ với NGINX:

          server {
              listen 19291;
              location /api/v1/receive {
                  auth_request /auth;
                  proxy_pass http://thanos-receiver:19291;
              }
              location = /auth {
                  if ($http_authorization != "Bearer YOUR_SECRET_TOKEN") {
                      return 401;
                  }
                  return 200;
              }
          }
        
      • Cấu hình Prometheus gửi Token: Trong remote_write:

          remote_write:
            - url: "http://your-nginx/api/v1/receive"
              headers:
                Authorization: "Bearer YOUR_SECRET_TOKEN"
        

Nếu bạn muốn phân quyền theo nhóm Prometheus hoặc từng instance:

  • Cấu hình các route hoặc path riêng biệt trên proxy để phân loại tenants.

  • Ví dụ:

    • Prometheus A gửi tới /api/v1/receive/tenant-a

    • Prometheus B gửi tới /api/v1/receive/tenant-b

Proxy sẽ kiểm tra từng path tương ứng và chặn các yêu cầu sai path.

  1. OIDC/SSO:

    • Tích hợp với Keycloak hoặc các nhà cung cấp SSO khác để quản lý quyền truy cập.

Phân quyền

  1. Tenant-based Multi-tenancy:

    • Sử dụng nhãn (external_labels) để phân vùng dữ liệu theo từng tenant:

    • Kết hợp proxy để chỉ cho phép tenant A truy cập dữ liệu của chính họ.

Để phân biệt các Prometheus gửi metrics về Thanos Receiver, bạn có thể sử dụng các nhãn (labels) tùy chỉnh. Các bước cụ thể như sau:

1. Thêm nhãn tùy chỉnh trên Prometheus:

Trong cấu hình Prometheus (prometheus.yml), bạn có thể sử dụng external_labels để gán nhãn cho mỗi instance Prometheus. Ví dụ:

global:
  external_labels:
    cluster: "cluster-A"
    environment: "prod"

Điều này giúp thêm các nhãn cố định vào mọi dữ liệu Prometheus gửi đi, bao gồm các remote writes.

2. Sử dụng Remote Write để gửi đến Thanos Receiver:

Cấu hình phần remote_write trong prometheus.yml để gửi metrics về Thanos:

remote_write:
  - url: "http://thanos-receiver:19291/api/v1/receive"
    labels:
      source: "prometheus-instance-1"

3. Truy vấn trong Thanos Querier:

Khi truy vấn trên Thanos Querier, bạn có thể sử dụng nhãn để phân biệt các Prometheus. Ví dụ:

up{cluster="cluster-A", environment="prod"}
  1. RBAC (Role-Based Access Control):

    • Proxy tích hợp với OPA (Open Policy Agent) để triển khai RBAC chi tiết.

    • Ví dụ: Chỉ cho phép nhóm DevOps truy cập namespace prod.


4. Các Đặc Tính Nổi Bật Của Thanos

1. Lưu Trữ Dữ Liệu Độ Phân Giải Cao:

  • Lưu trữ nhiều chỉ số: Thanos có khả năng lưu trữ một lượng lớn chỉ số từ nhiều nguồn khác nhau, bao gồm cả các chỉ số có độ phân giải cao (ví dụ: dữ liệu theo giây).

  • Nén dữ liệu: Thanos sử dụng các thuật toán nén hiệu quả để giảm thiểu dung lượng lưu trữ mà không ảnh hưởng đến chất lượng dữ liệu.

  • Quản lý vòng đời dữ liệu: Thanos cho phép bạn thiết lập các quy tắc để tự động xóa hoặc lưu trữ dữ liệu theo các khoảng thời gian khác nhau, giúp tối ưu hóa việc sử dụng dung lượng.

2. Truy Vấn Linh Hoạt:

  • PromQL: Thanos sử dụng ngôn ngữ truy vấn PromQL mạnh mẽ, cho phép bạn thực hiện các truy vấn phức tạp để phân tích dữ liệu.

  • Truy vấn đa chiều: Bạn có thể truy vấn dữ liệu theo nhiều chiều khác nhau, chẳng hạn như thời gian, nhãn (label), và các chỉ số khác.

  • Aggregation: Thanos cung cấp các hàm aggregation (tính tổng, trung bình, tối đa, tối thiểu,...) để tính toán các chỉ số tổng hợp từ dữ liệu.

3. Khả Năng Mở Rộng:

  • Phân tán: Thanos được thiết kế để hoạt động trong môi trường phân tán, cho phép bạn dễ dàng mở rộng hệ thống để đáp ứng nhu cầu tăng trưởng của dữ liệu.

  • Tích hợp: Thanos có thể dễ dàng tích hợp với các hệ thống khác, chẳng hạn như Prometheus, Grafana, và các công cụ cảnh báo.

  • Cộng đồng lớn mạnh: Thanos có một cộng đồng người dùng và đóng góp mã nguồn mở rất lớn, giúp bạn dễ dàng tìm kiếm sự hỗ trợ và giải quyết các vấn đề.

4. Quản Lý Dữ Liệu Đa Vùng:

  • Lưu trữ dữ liệu phân tán: Thanos có thể lưu trữ dữ liệu trên nhiều vùng (region) khác nhau, giúp đảm bảo tính sẵn sàng và khả năng phục hồi của hệ thống.

  • Truy vấn xuyên vùng: Bạn có thể truy vấn dữ liệu từ nhiều vùng khác nhau một cách thống nhất.

5. Các Tính Năng Nâng Cao Khác:

  • Compaction: Thanos tự động thực hiện quá trình nén dữ liệu để giảm thiểu dung lượng lưu trữ và tăng tốc độ truy vấn.

  • Quản lý phiên bản: Thanos cho phép bạn quản lý các phiên bản dữ liệu khác nhau, giúp bạn dễ dàng so sánh và phân tích sự thay đổi của dữ liệu theo thời gian.

  • Cảnh báo: Thanos có thể được tích hợp với các công cụ cảnh báo để thông báo cho bạn khi có sự cố xảy ra.

Tóm lại, Thanos là một giải pháp toàn diện và linh hoạt cho việc lưu trữ và truy vấn dữ liệu thời gian series. Với các tính năng nổi bật như khả năng mở rộng, truy vấn linh hoạt, và quản lý dữ liệu đa vùng, Thanos giúp các tổ chức có thể xây dựng các hệ thống giám sát và phân tích dữ liệu hiệu quả và đáng tin cậy.