Auto-scale Kubernetes pod với custom metrics cho MQTT broker

735
15-06-2023
Auto-scale Kubernetes pod với custom metrics cho MQTT broker

Như ta đã biết, Kubernetes (K8s) sử dụng Horizontal Pod Autoscaler (HPA) để có thể scale số lượng pod. Để có thể làm được điều đó, HPA sẽ thực hiện vòng loop để query những metrics hiện tại sau đó tính toán và thực viện công việc scale.

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 1.

Nhưng có vấn đề đặt ra ở đây, đó là đôi khi những metrics thu về được lại chưa đủ để có thể thực hiện scale. Ví dụ sẽ được nói đến tiếp theo trong bài viết.

>> Tìm hiểu thêm về: Kubernetes là gì? Vai trò và các thuật ngữ phổ biến

Để thực hiện điều này thì Kubernetes có thành phần được gọi metrics registry. Mục đích metrics registry là cung cấp giao diện để client có thể query metrics. Giao diện này gồm 3 thành phần là:

Resource Metrics APICustom Metrics APIExternal Metrics API

Vậy khi chúng ta muốn scale với Custom Metrics API, ta cần phải cung cấp backend cho nó. Backend này bao gồm 2 thành phần chính đó là Metric collectorMetric API server.

METRIC COLLECTOR

Chúng ta sẽ lựa chọn Metric collector khá phổ biến: Prometheus

Để cho đơn giản,ở đây ta sẽ sử dụng Prometheus-operator thông qua Helm:

Repo prometheus-operator:

https://github.com/helm/charts/tree/master/stable/prometheus-operator

Prometheus-operator gồm nhiều thành phần, trong đó chủ yếu là Prometheus, Grafana (công cụ tạo dashboard), và các service monitor để lấy metrics từ kubernetes.

Câu lệnh:

helm install my-mon stable/prometheus-operator -f values.yaml

Trong đó values.yaml là file mình tự tạo với nội dung như sau:

serviceMonitorSelectorNilUsesHelmValues: false [1]

Việc này là cần thiết vì nó sẽ cho phép thu được những metrics khác ngoài những thành phần của Kubernetes.

Sau khi thực hiện xong, ta hoàn toàn có thể truy cập trang web đã được host lên:

Prometheus:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 1.

 Grafana:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 2.

MQTT BROKER (VerneMQ)

Ta sẽ sử dụng VerneMQ làm MQTT Broker làm ví dụ

>> Tìm hiểu thêm về: MQTT là gì? Giao thức truyền thông điệp theo mô hình cung cấp/ Thuê bao

Tiếp tục sử dụng Helm để tải VerneMQ

Repo:

<https://docs.vernemq.com/installing-vernemq/docker> 

Ta cần phải cấu hình VerneMQ 1 chút mới có thể chạy được không như Prometheus-operator.

Đầu tiên, ta cần pull verneMQ chart về:

helm pull vernemq/vernemq --untar true

Ta sẽ pull Chart về và giải nén, ta có thư mục vernemq

Truy cập file values.yaml trong thư mục, ta chỉnh sửa 1 số thông số như sau

Quan trọng

Vì helm sử dụng image 1.10.2 để tạo vernemq và image này bị lỗi thiếu thư viện, ta cần chỉnh config

image: 1.10.2 thành image: 1.10.2-1-alpine hoặc image: lastest để không gặp lỗi này

Sau đó:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 4.

Tạo ra service monitor để prometheus lấy được những metrics

Đồng thời ta cần phải thêm vào:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 5.

Để bỏ qua bước xác thực khi truyền tin

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 6.

Chấp nhận điều khoản sử dụng của VerneMQ [2]

Ngoài ra, VerneMQ còn là 1 Stateful Cluster thế nên ta cần phải lệnh gọi để tách node khỏi cluster khi scale down.

Trong thư mục templates, ta truy cập file statefulset.yaml thêm nội dung:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 7.

Sau khi cấu hình xong, ta sử dụng helm để triển khai:

helm install myVerneMQ . --set replicaCount=2 -f values.yaml

Sau khi triển khai xong, thì Prometheus cũng có thể lấy được metrics từ VerneMQ (VerneMQ có exporter mặc định khi được tạo ở port 8888) [3]

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 8.

 Để kiểm tra hoạt động monitor đúng, ta sẽ thử publish message đến

Ở đây ta sẽ sử dụng Python và thư viện paho-mqtt

paho-mqttMQTT version 3.1.1 client classPyPI

Code python:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 9.

 time.sleep(5) để điều khiển tần suất bắn message

Ta sẽ tạo dashboard sử dụng grafana

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 11.

Trong đó:

Total publish receive: sum(mqtt_publish_received)

Total publish receive per second: sum(irate(mqtt_publish_received{mqtt_version="4"}[1m]))

Publish receiver per second per node:

irate(mqtt_publish_received{mqtt_version="4"}[1m])

Ở đây, ta muốn cho VerneMQ scale theo số lượng message publish mỗi giây, nhưng lại không có metrics nào đáp ứng được nhu cầu của chúng ta cả.

Và như đã nói ở trên, chúng ta cần Metric collector và Metric API server, ta sẽ cần Metric API server. Ở đây chúng ta sử dụng Prometheus-adapter

METRIC API SERVER

repo :

https://github.com/helm/charts/tree/master/stable/prometheus-adapter

Tương tự như VerneMQ, ta cũng cần pull về cấu hình 1 số chỗ

Trong file values.yaml

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 11.

Ta trỏ đến prometheus operator

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 12.

Ta tạo custom rule để biến metrics mqtt_publish_received 

trở thành tổng số message nhận được mỗi giây trên mỗi node

sum(irate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)

Sau đó khởi tạo prometheus-adapter

helm install prom-adap . -f values.yaml

Tạo autoscale và kiểm tra

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 13.

Ban đầu khi không chạy stress test:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 15.

Khi tải tăng lên:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 16.

Tiếp tục tăng:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 17.

 Sau cùng:

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 18.

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 19.

Techblog: Auto-scale Kubernetes pod với custom metrics cho MQTT broker - Ảnh 20.

 Ta theo dõi vào TARGETS có thể thấy pod được scale khi request đến nhiều hơn, và scale vào khi ít request đi.

>> Có thể bạn quan tâm: Kubernetes Pod là gì? Tìm hiểu chi tiết về Kubernetes Pod

SHARE