Mở đầu
Môi trường Container ngày càng được sử dụng nhiều hơn và kéo theo đó là công cụ Kubernetes phục vụ cho việc quản lý các container cũng được sử dụng nhiều hơn. Các container khi được chạy trong môi trường Kubernetes có thể lên đến hàng trăm, hàng ngàn container chạy đồng thời nên việc giám sát sẽ trở nên rất khó khăn nếu không có các công cụ hỗ trợ. Trong bài viết này mình muốn giới thiệu đến mọi người một công cụ giúp bạn có thể giám sát cụm K8s của mình một cách toàn diện và hiệu quả nhất. Đây là công cụ mà mình đã sử dụng một thời gian và thấy nó đáp ứng được nhu cầu sử dụng khá tốt. Công cụ này có một cái tên khá hay là Robusta, cùng xem xem Robusta có giúp bạn làm việc hiệu quả hơn không nhé
Robusta là gì?
Robusta là một công cụ giám sát, truy vết và cảnh báo dành cho môi trường Kubernetes. Robusta tích hợp nhiều thao tác giúp bạn có thể nhanh chóng debug lỗi xảy ra trong cụm chứ không chỉ dừng ở việc phát hiện và cảnh báo. Robusta có thể làm những gì?
- Khi một Pod, Job bị CrashLoopBackOff, trả về cảnh báo kèm logs của Pod
- Khi Pod bị OOMKilled, trả về lịch sử memory dưới dạng biểu đồ tại thời điểm bị kill
- Khi mức sử dụng CPU của pod đạt ngưỡng, trả về lịch sử sử dụng CPU hoặc profiling của pod đó.
- Tạo ra những kịch bản cho từng trường hợp. VÍ dụ: Tăng số replicas khi CPU cao,...
- Tích hợp với Prometheus + AlertManager để cảnh báo 1 số những rule mở rộng.
- ....
Kể qua vài điều mà Robusta có thể làm ta có thể thấy hiếm có công cụ miễn phí, opensource nào có thể làm được rồi đúng không
Các khái niệm trong Robusta
Sink
Sink chính là nơi mà các cảnh báo được đổ về. Hiện tại Robusta hỗ trợ khá đầy đủ các công cụ để đẩy thông báo về như: Telegram, Slack, Webhook, Discord,...
Xem đầy đủ tại đây: https://docs.robusta.dev/master/configuration/sinks/index.html Hiện Sink Slack được hỗ trợ nhiều tính năng nhất, các sink khác có thể không được hỗ trợ đầy đủ các tính năng
Playbook
Playbook được hiểu là 1 tập các cấu hình bao gồm việc phát hiện, điều tra và cảnh báo.
Trong playbook sẽ có các cấu hình bao gồm: Trigger, Actions, Sink 1, Các sự kiện được gửi đến Robusta sẽ được kiểm tra với điều kiện được cấu hình ở trigger
2, Khi sự kiện khớp với trigger thì sẽ kích hoạt playbook
3, Playbook có liên quan sẽ chạy
4, Tất cả actions được cấu hình trong playbook sẽ được chạy.
5, Nếu có thông báo được tạo ra bởi playbook nó sẽ được gửi đến các sinks có trong cấu hình.
Ví dụ:
builtinPlaybooks:
- triggers: - on_pod_crash_loop: restart_reason: "CrashLoopBackOff" actions: - report_crash_loop: {} sinks: - "telegram-dev"
Phía trên là một playbook phát hiện các pod bị CrashLoopBackOff, sau khi phát hiện ra pod bị lỗi Robusta sẽ thực hiện action report_crash_loop bao gồm trả về logs gần nhất của pod và một số thông tin như số lần Restart về sink telegram-dev ví dụ như hình:
Cấu hình
Trong bài này mình sẽ giới thiệu với các bạn 1 số Trigger và Action phổ biến của Robusta, bạn có thể tìm hiểu thêm tại docs (https://docs.robusta.dev/master/playbook-reference/overview.html)
Các loại Trigger
- Dựa trên API Server: với loại trigger này Robusta sẽ phát hiện các sự kiện thông qua API Server của K8s, trigger này có thể phát hiện pod bị crash, các job fail, các event warning, các sự kiện tạo-xóa-sửa của các resources trong k8s (Pod, StatefulSet, Deployment, Daemonset,...)
Đây cũng là trigger thường được sử dụng nhất, tên một vài trigger trong loại này: on_pod_create, on_kubernetes_warning_event_create, on_job_failure, on_pod_crash_loop,...
- Dựa trên Prometheus và AlertManager: Loại trigger này thường được sử dụng để tích hợp một số rule mà bạn đã cấu hình ở AlertManager hoặc Robusta không hỗ trợ. Với loại trigger này giúp bạn có thể tích hợp đa dạng các loại trigger bên ngoài K8s.
Tên trigger trong loại này: on_prometheus_alert Ví dụ sau có trigger dựa theo alert có tên HostHighCpuLoad từ AlertManager và thực hiện trả về là kết quả khi chạy commnad "ps aux" liệt kê ra các process đang chạy :
customPlaybooks:
- triggers: - on_prometheus_alert: alert_name: HostHighCpuLoad actions: - node_bash_enricher: bash_command: ps aux
- Ngoài ra còn nhiều loại trigger khác các bạn tự tìm hiểu thêm nhé
Các loại Actions
- Event Enrichment: Action này cho phép bạn lấy ra thêm nhiều data của một resource nào đó thường phục vụ cho việc debug. Các thông tin được trả ra trong action này thường là: Logs, Running process, Biểu đồ tài nguyên sử dụng
- Remediation: Action này cho phép bạn chỉnh sửa tài nguyên trong K8s khi được trigger như: Xóa Job, xóa Pod, tăng số lượng max replicas trong HPA khi HPA đó đạt ngưỡng.
- Language Troubleshooting: Loại action này cho phép bạn debug dựa trên từng ngôn ngữ, hiện tại robusta đang hỗ trợ debug với 2 ngôn ngữ là Python và Java. Với Action này, Robusta sẽ trả về cho bạn thông tin profling, attach vào pod, lấy thông tin memory của process,...
- Ngoài ra actions cũng còn rất nhiều loại khác khá thú vị, các bạn tự tìm hiểu thêm nhé.
Cài đặt
Để cài đặt Robusta các bạn sử dụng Helm, việc cài đặt khá dễ dàng các bạn có thể xem tại đây:
https://docs.robusta.dev/master/quick-start.html
Nếu có khó khăn gì trong việc cài đặt các bạn có thể comment lại dưới bài nhé!
Kết
Robusta ngoài ra còn rất nhiều các tính năng hay ho khác tuy nhiên do mình lười chỉ viết được đến đây, tóm lại Robusta là một cộng cụ Observability khá hữu ích với đầy đủ các tính năng từ Phát hiện => Truy vết => Cảnh báo. Robusta hiện cũng đang phát triển rất nhanh, dự sẽ là một công cụ tiềm năng phổ biến trong tương lai Hy vọng sau bài viết này bạn đã biết thêm được một công cụ hay ho nữa để phục vụ công việc. Nếu bài viết này giúp ích cho bạn thì hãy cho mình 1 Upvote và Follow mình để xem thêm nhiều bài viết khác nhé! Thanks!
Chuyên mục quảng cáo
Nếu các bạn đang có nhu cầu triển khai ứng dụng như NodeJS, Python, Golang, Java hoặc sử dụng các Database - Message Queue như MongoDB, MySQL, Redis, Kafka thì có thể tham khảo sử dụng Bizfly Cloud App Engine nha! Đây là sản phẩm Serverless mà bên mình đang phát triển nhằm mục đích đơn giản hóa quá trình triển khai ứng dụng cho các bạn Devs. Hiện sản phẩm đang miễn phí sử dụng, hy vọng các bạn sẽ ủng hộ . Bất cứ đóng góp gì các bạn có thể nhắn cho mình thông qua Telegram @HoangViet12 nhé! Have a nice day