Giới thiệu
Prometheus và Grafana là các phần mềm Open-Source, các bạn hoàn toàn có thể cài nó trên k8s, cài trên Docker hoặc trên OS service đều được cả. Trong phạm vi bài viết này mình sẽ giới thiệu sơ qua về Prometheus/Grafana và cách cài đặt nó lên Kubernetes Cluster.
Prometheus là gì
Prometheus là một phần mềm giám sát mã nguồn mở, và đang trở nên ngày một phổ biến hơn. Prometheus rất mạnh và lại đặc biệt phù hợp để dùng cho việc giám sát các dịch vụ trên Kubernetes vì nó hỗ trợ sẵn rất nhiều các bộ template giám sát với các service opensource, giúp việc triển khai và cấu hình giám sát nhanh chóng và hiệu quả. Đi kèm với Prometheus (đóng vai trò giám sát) thì cần có thêm Alart Manager (đóng vai trò cảnh báo) để người quản trị có thể phát hiện được một vấn đề xảy ra sớm nhất có thể.
Cách thức hoạt động của Prometheus trên Kubernetes
Cách thức hoạt động của Prometheus khá trong sáng. Nó sẽ định kỳ lấy các thông tin metrics từ các “target, lưu thông tin metric đó và DB. HTTP API Server thực hiện lắng nghe các request từ client (ví dụ Prometheus Dashboard hay Grafana) để lấy thông tin từ DB và trả về kết quả cho client hiển thị lên dashboard.
Prometheus cho phép bạn cấu hình các quy tắc sinh cảnh báo (rule), khi các giá trị thỏa mãn các điều kiện đó thì cảnh báo sẽ được sinh ra và gửi tới Alert Manager. Tại Alert Manager sẽ tiếp tục là nơi xử lý gửi cảnh báo tới các nơi nhận, gọi là “receiver“, ví dụ như Email, Telegram…
Cấu hình hoạt động của Prometheus gồm các tham số chính:
- global: Các tham số chung về hoạt động của Prometheus, ví dụ là khoảng thời gian định kì pull dữ liệu metric về chẳng hạn
- alerting: Thông tin kết nối tới Alert Manager. Bạn có thể cấu hình một hoặc nhiều Alert Manager tùy vào mục đích sử dụng.
- rule_files: Đây là phần quan trọng trong xử lý các báo. Rule file quy định các điều kiện để sinh ra một cảnh báo từ thông tin metric đầu vào. Ví dụ đặt rule RAM của Node > 80% thì đặt cảnh báo cao tải RAM.
- scrape_configs: Đây là phần cấu hình liên quan tới kết nối tới các target để lấy metric. Ví dụ bạn cần lấy performance của các K8S Node, và lấy thêm metric của database đang được cài trên K8S chẳng hạn thì bạn cần cài 2 exporter cho 2 target trên, và cấu hình scrape_configs để lấy thông tin từ exporter đó export ra.
Grafana là gì
Grafana là phần mềm open-source dùng để phân tích và hiển thị trực quan dữ liệu. Nó giúp việc xử lý hiển thị dữ liệu trên các dashboard với khả năng tùy biến hoàn hảo, hỗ trợ rất lớn cho việc theo dõi phân tích dữ liệu theo thời gian. Nó lấy nguồn dữ liệu từ nguồn như Prometheus, Graphite hay ElasticSearch…
Cài đặt Prometheus và Grafana trên K8S bằng Helm
Nhắc lại một chút trong series bài viết này mình dựng lab K8S gồm 03 Master và 03 Worker. Mình sử dụng 1 node để cài CICD (vtq-cicd) và đồng thời dùng nó là nơi lưu các cấu hình cài đặt các phần mềm lên K8S để dễ quản lý.
Trong bộ cài mình giới thiệu dưới đây đã bao gồm sẵn cả bộ công cụ gồm Prometheus, Alert Manager và Grafana luôn, rất tiện dùng và cài đặt cực kỳ đơn giản.
Các bước thực hiện là
- Tải helm-chart về
- Tạo file config và tùy biến các tham số cấu hình:
- Đổi pass login mặc định
- Cấu hình ingress cho Alert Manager
- Cấu hình ingress cho Grafana
- Cấu hình ingress cho Prometheus
- Cài đặt, kiểm tra kết nối lấy dữ liệu metric trên dashboard
Tạo thư mục quản lý manifest cho dự án.
mkdir -p /home/prometheus
cd /home/prometheus
Thêm Helm repo https://prometheus-community.github.io/helm-charts.
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories
Và repo https://charts.helm.sh/stable.
$ helm repo add stable https://charts.helm.sh/stable
"stable" has been added to your repositories
Cập nhật lại danh sách repo sau khi thêm.
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "nginx-stable" chart repository
...Successfully got an update from the "prometheus-community" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈Happy Helming!⎈
Tìm repo liên quan đến Prometheus.
$ helm search repo prometheus |egrep "stack|CHART"
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/kube-prometheus-stack 41.7.3 0.60.1 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/prometheus-stackdriver-exp... 4.1.0 0.12.0 Stackdriver exporter for Prometheus
stable/stackdriver-exporter 1.3.2 0.6.0 DEPRECATED - Stackdriver exporter for Prometheus
Tải nó về.
helm pull prometheus-community/kube-prometheus-stack --version 34.9.0
Giải nén file vừa tải về.
tar -xzf kube-prometheus-stack-34.9.0.tgz
Copy file values.yaml và chỉnh sửa nó.
cp kube-prometheus-stack/values.yaml values-prometheus.yaml
Giờ thì ngó qua file values mặc định của bộ helm-chart này sẽ thấy nó đã mặc định cấu hình Rule cho các thành phần của K8S từ etcd, kube-api.. Và Alert Manager cũng dc cài mặc định trong bộ này luôn.
defaultRules:
create: true
rules:
alertmanager: true
etcd: true
configReloaders: true
general: true
k8s: true
kubeApiserver: true
kubeApiserverAvailability: true
kubeApiserverSlos: true
kubelet: true
kubeProxy: true
kubePrometheusGeneral: true
kubePrometheusNodeRecording: true
kubernetesApps: true
kubernetesResources: true
kubernetesStorage: true
kubernetesSystem: true
kubeScheduler: true
kubeStateMetrics: true
network: true
node: true
nodeExporterAlerting: true
nodeExporterRecording: true
prometheus: true
prometheusOperator: true
Và Alert Manager cũng dc cài mặc định trong bộ này luôn, nếu bạn không muốn cài chung trong bộ này thì có thể sửa enabled: false để tự cài Alert Manager và cấu hình tích hợp với Prometheus sau. Mình thì dùng luôn đỡ mất công cấu hình:
alertmanager:
enabled: true
annotations: {}
apiVersion: v2
Cấu hình tạo ingress cho Alert Manager để kết nối từ bên ngoài vào bằng hostname là alertmanager.hoanghd.com
alertmanager:
enabled: true
ingress:
enabled: true
ingressClassName: nginx
hosts:
- alertmanager.hoanghd.com
Đổi password mặc định khi login và web Grafana theo ý của bạn, ở đây mình đặt là “Hoanghd164“. Cấu hình ingress cho Grafana để kết nối vào từ bên ngoài qua hostname grafana.hoanghd.com
grafana:
enabled: true
adminPassword: Hoanghd164
ingress:
enabled: true
ingressClassName: nginx
hosts:
- grafana.hoanghd.com
Cấu hình ingress cho Prometheus để kết nối vào từ bên ngoài qua hostname prometheus.hoanghd.com
prometheus:
enabled: true
ingress:
enabled: true
ingressClassName: nginx
hosts:
- prometheus.hoanghd.com
Do mình sẽ espose các ứng dụng này qua Nginx-Ingress nên tất cả các cấu hình service mình sẽ để mặc định là loại clusterIP.
Sau khi tùy biến file values.yaml rồi thì ta thực hiện triển khai.
$ kubectl create ns monitoring
namespace/monitoring created
$ helm -n monitoring install prometheus-grafana-stack -f values-prometheus.yaml kube-prometheus-stack
NAME: prometheus-grafana-stack
LAST DEPLOYED: Fri Nov 4 07:36:28 2022
NAMESPACE: monitoring
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
kubectl --namespace monitoring get pods -l "release=prometheus-grafana-stack"
Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.
Dùng lệnh dưới để xác nhận triển khai dịch vụ đã triển khai thành công hay chưa.
$ kubectl -n monitoring get all
NAME READY STATUS RESTARTS AGE
pod/alertmanager-prometheus-grafana-stack-k-alertmanager-0 2/2 Running 0 61m
pod/prometheus-grafana-stack-5f68d94fd-xf44j 3/3 Running 0 69m
pod/prometheus-grafana-stack-k-operator-bf6cbdbd8-n4pgl 1/1 Running 0 69m
pod/prometheus-grafana-stack-kube-state-metrics-57476c879f-7t9fn 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-5zl5b 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-9tpng 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-df8lt 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-k5k8s 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-nthnf 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-pz6v8 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-tpgkj 1/1 Running 0 69m
pod/prometheus-grafana-stack-prometheus-node-exporter-zz5c7 1/1 Running 0 69m
pod/prometheus-prometheus-grafana-stack-k-prometheus-0 2/2 Running 0 61m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 68m
service/prometheus-grafana-stack ClusterIP 10.103.64.59 <none> 80/TCP 69m
service/prometheus-grafana-stack-k-alertmanager ClusterIP 10.105.5.105 <none> 9093/TCP 69m
service/prometheus-grafana-stack-k-operator ClusterIP 10.107.129.129 <none> 443/TCP 69m
service/prometheus-grafana-stack-k-prometheus ClusterIP 10.101.251.91 <none> 9090/TCP 69m
service/prometheus-grafana-stack-kube-state-metrics ClusterIP 10.109.171.142 <none> 8080/TCP 69m
service/prometheus-grafana-stack-prometheus-node-exporter ClusterIP 10.102.246.61 <none> 9100/TCP 69m
service/prometheus-operated ClusterIP None <none> 9090/TCP 68m
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/prometheus-grafana-stack-prometheus-node-exporter 8 8 8 8 8 <none> 69m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/prometheus-grafana-stack 1/1 1 1 69m
deployment.apps/prometheus-grafana-stack-k-operator 1/1 1 1 69m
deployment.apps/prometheus-grafana-stack-kube-state-metrics 1/1 1 1 69m
NAME DESIRED CURRENT READY AGE
replicaset.apps/prometheus-grafana-stack-5f68d94fd 1 1 1 69m
replicaset.apps/prometheus-grafana-stack-k-operator-bf6cbdbd8 1 1 1 69m
replicaset.apps/prometheus-grafana-stack-kube-state-metrics-57476c879f 1 1 1 69m
NAME READY AGE
statefulset.apps/alertmanager-prometheus-grafana-stack-k-alertmanager 1/1 68m
statefulset.apps/prometheus-prometheus-grafana-stack-k-prometheus 1/1 68m
Lấy thông tin Ingress
$ kubectl get ingress -n monitoring -owide
NAME CLASS HOSTS ADDRESS PORTS AGE
prometheus-grafana-stack nginx grafana.hoanghd.com 192.168.13.239 80 61m
prometheus-grafana-stack-k-alertmanager nginx alertmanager.hoanghd.com 192.168.13.239 80 61m
prometheus-grafana-stack-k-prometheus nginx prometheus.hoanghd.com 192.168.13.239 80 61m
Như vậy ta đã cài đặt xong bộ Prometheus + Alert Manager + Grafana. Giờ ta thực hiện khai host trên client và kết nối vào web để kiểm tra.
Đầu tiên phải phải trỏ domain về máy host.
$ cat /etc/hosts | grep hoanghd
192.168.13.239 prometheus.hoanghd.com
192.168.13.239 grafana.hoanghd.com
192.168.13.239 alertmanager.hoanghd.com
Kiểm tra kết nối đến máy host
$ ping prometheus.hoanghd.com
PING prometheus.hoanghd.com (192.168.13.239): 56 data bytes
64 bytes from 192.168.13.239: icmp_seq=0 ttl=64 time=0.499 ms
64 bytes from 192.168.13.239: icmp_seq=1 ttl=64 time=0.570 ms
64 bytes from 192.168.13.239: icmp_seq=2 ttl=64 time=0.468 ms
64 bytes from 192.168.13.239: icmp_seq=3 ttl=64 time=0.593 ms
64 bytes from 192.168.13.239: icmp_seq=4 ttl=64 time=0.472 ms
--- prometheus.hoanghd.com ping statistics ---
5 packets transmitted, 5 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.468/0.520/0.593/0.052 ms
Giao diện của Prometheus, xem thông tin “node_memory_MemTotal_bytes” của các node:
Kiểm tra kết nối vào Alert Manager
Kiểm tra kết nối vào Grafana
Lúc này bạn đã cài đặt xong bộ công Prometheus/AlertManager/Grafana và các kèm với đó là các Node Exporter của K8S. Giờ là lúc dùng các thông tin metric lấy được từ Prometheus để hiển thị lên Grafana.
Hãy lựa chọn 1 Dashboard mà bạn muốn xem, ta có thành quả như hình dưới.
Sau khi cài tới đây thì cơ bản lấy được thông tin của K8S và hiển thị dc lên dashboard của Grafana.
Chúc các bạn thành công