Nội dung

  • Giới thiệu
  • Prometheus
  • Prometheus Operator
  • Grafana
  • Installation
  • Kết luận
  • Tài liệu tham khảo

Giới thiệu

Để bắt đầu với nội dung bài viết này, chắc hẳn bạn đã có kiến thức cơ bản về Kubernetes rồi, và nếu bạn chưa từng nghe về Kubernetes thì xin mời bạn tìm hiểu về K8s ở bài viết trước Tại đây.
Hiểu được tất cả các thành phần cũng như cách vận hành của K8s quả là khó và bạn cần thời gian, vì K8s được xây dựng để phục vụ hệ thống lớn. Với một hệ thống lớn hàng chục server với nhiều ứng dụng chạy trên đó, để luôn có thể giám sát, cảnh báo và phát hiện kịp thời tình trạng sức khoẻ của hệ thống, việc này sẽ trở nên nhẹ nhàng cho Devops/Operator/System Admin nếu có 1 hệ thống monitoring-alert như vậy.
Có nhiều bộ công cụ để monitoring hệ thống. Chẳng hạn như FEK (Fluentd Elasticsearch Kibana) Stack, Prometheus - Grafana Stack v.v. Lần này mình sẽ giới thiệu đến các bạn bộ công cụ kết hợp với K8s để monitoring chính là Prometheus - Grafana.
Monitoring k8s sẽ giúp team những việc sau:

  • Giám sát hệ thống 1 cách chủ động
  • Tầm nhìn toàn diện hệ thống và khả năng lập kế hoặch triển khai
  • Tạo cảnh báo khi hệ thống có vấn đề
  • Hiển thị biểu đồ các số liệu mong muốn (Disk/CPU/Memory vv)

Dĩ nhiên Prometeus và Grafana không chỉ dành riêng cho K8s mà còn monitoring được cho nhiều hệ thống khác. Thời gian gần đây thì Coreos đã cho ra mắt Prometheus-Operator giúp cho việc set up Prometeus và Grafana trên K8s trở nên dễ dàng hơn rất nhiều.

Prometheus

Là một bộ công cụ giám sát và cảnh báo hệ thống mã nguồn mở ban đầu được xây dựng bởi công ty SoundCloud. Kể từ khi thành lập vào năm 2012, nhiều công ty và tổ chức đã áp dụng Prometheus vào hệ thống và dự án này có một cộng đồng người dùng và nhà phát triển rất tích cực.
Prometheus bây giờ đã trở thành một dự án mã nguồn mở độc lập và được duy trì độc lập với bất kỳ công ty nào. Prometheus đã tham gia vào tổ chức Cloud Native Computing Foundation vào năm 2016 với tư cách là dự án được ưu tiên phát triển thứ2 sau Kubernetes(k8s).

Một số tính năng của Prometheus

  • Mô hình dữ liệu đa chiều - time series được xác định bởi tên của số liệu (metric) và cặp key-value
  • Ngôn ngữ truy vấn linh hoạt
  • Hỗ trợ nhiều biểu đồ
  • Dễ dàng cấu hình cảnh báo
  • Chỉ cần 1 máy chủ là có thể hoạt động được
  • Hỗ trợ Push các time-series thông quan 1 gateway trung gian.
  • Prometheus sử dụng Alertmanager để lý và gửi cảnh báo đi
  • Prometheus cung cấp giao diện đơn giản đề tạo truy vấn và hiển thị biểu đồ
  • Kết hợp với Grafana để hiện thị dữ liệu dưới dạng nhiều kiểu biểu đồ khác nhau.

Kiến trúc Prometheus

uc?id=13Ruax7YniVkiEW4u18rIuYEGM7hd7rSi&export=download
https://prometheus.io/docs/introduction/overview/

Thành phần Prometheus

  • Prometheus server đảm nhận việc lấy và lưu trữ dữ liệu time-series
  • Client libraries cho code ứng dụng
  • Push gateway hỗ trở các short-lived jobs
  • Exporter đa dạng hỗ trợ giám sát các dịch vụ hệ thống và gửi về Prometheus theo chuẩn Prometheus mong muốn.
  • Alertmanager: xử lý việc cảnh báo (gửi về mail, slack, hipchat vv)

Prometheus Operator

The mission of the Prometheus Operator is to make running Prometheus on top of Kubernetes as easy as possible, while preserving configurability as well as making the configuration Kubernetes native. https://coreos.com/operators/prometheus/docs/latest/user-guides/getting-started.html

Prometheus Operator cũng cấp việc monitoring K8s service và deployment một cách dễ dàng bên cạnh việc quản lý các cấu hình của Prometheus, Alertmanager và Grafana.

Mô hình hoạt động của Prometheus Operator

uc?id=14AXpJi--sRqn0JfGC9W2TnoQXayKhxLv&export=download
https://coreos.com/operators/prometheus/docs/latest/user-guides/getting-started.html

Grafana

https://grafana.com/
Grafana là công cụ giám sát và trực quan nguồn mở, dữ liệu tích hợp với dữ liệu phức tạp từ các nguồn như Prometheus, InfluxDB vv. Cơ bản thì Grafana là một dashboard app cho phép ta tạo các dashboard từ các nguồn dữ liệu time-series. Prometheus sử dụng grafana là một dashboard chính thức, nên việc sử dụng grafana với Prometheus rất đơn giản.
Một số hình ảnh dashboard của Grafana:
uc?id=1jkf0C_3fNHLJTUfmBTAl61wy02eVfUVY&export=download
uc?id=1V5CtOb6QSKHlye1f28KIVqa5NNz26uvA&export=download

Installation

Yêu cầu:

  • Kubernetes cluster đang chạy
  • Helm đã được cài đặt và hoạt động

Cài đặt

Tham khảo: https://github.com/helm/charts/tree/master/stable/prometheus-operator

helm install stable/prometheus-operator --name prometheus-operator --namespace monitoring

Nếu chúng ta muốn cài đặt và overwrite lại một số gía trị default thì tham khảo phần cài đặt ở link phía trên. (cách overwrite các giá trị mặc định ở cuối bài viết)
Bây giờ chúng ta kiểm tra xem phần cài đặt đã ổn chưa

$ kubectl get pods  -n monitoring
NAME                                                      READY     STATUS    RESTARTS   AGE
alertmanager-prometheus-operator-alertmanager-0           2/2       Running   0          6h
prometheus-operator-grafana-7859656fc4-h58x4              3/3       Running   15         6h
prometheus-operator-kube-state-metrics-6f86fdd84b-bkpvq   1/1       Running   0          6h
prometheus-operator-operator-69c54d7ffc-jpk9t             1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-4c5z6        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-4rb8d        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-5d6gm        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-c48mr        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-c49p9        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-fx6f9        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-kt784        1/1       Running   0          6h
prometheus-operator-prometheus-node-exporter-tx6rh        1/1       Running   0          6h
prometheus-prometheus-operator-prometheus-0               3/3       Running   1          6h

Có vẻ như phần cài đặt của chúng ta không có vấn đề gì.

Run Prometheus dashboard

Để khởi chạy Prometheus dashboard chúng ta sẽ tạo 1 service type NodePort

  1. Kiểm tra pod prometheus-prometheus-operator-prometheus-0 đang chạy ở Node nào (tạm gọi nó là {operator-prometheus IP})
  2. Tạo service
# create file prom-service.yml
apiVersion: v1
kind: Service
metadata:
  name: prom-service
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
    - port: 9090
      nodePort: 30090
  selector:
    app: prometheus
# run service
$ kubectl apply -f prom-service.yml -n monitoring
service "prom-service" created
  1. Truy cập http://{operator-prometheus IP}:30090/graph
    uc?id=1JPRPB2qstLCvHXh-zQtVIWGH3SoJeTMv&export=download

Run Grafana dashboard

Mặc dù Prometheus đã có sẵn expression browser để cho mục đích debuging rồi, tuy nhiên hãy sử dụng Grafana để có có giao diện đẹp mắt, nó đã được cấu hình sẵn nơi để lấy dữ liệu từ Prometheus.

  1. Kiểm tra pod prometheus-operator-grafana..... đang chạy ở Node nào (tạm gọi nó là {grafana IP})
  2. Tạo service
# create file grafana-service.yml
apiVersion: v1
kind: Service
metadata:
  name: grafana-service
  labels:
    app: grafana
spec:
  type: NodePort
  ports:
    - port: 3000
      nodePort: 30300
  selector:
    app: grafana
# run service
$ kubectl apply -f grafana-service.yml -n monitoring
service "grafana-service" created
  1. Truy cập http://{grafana IP}:30300/

uc?id=1_cIx4dQI_Q5h_us76IjS0v7DJvqAJlMi&export=download
Grafana — Kubernetes dashboards
uc?id=1KvojsZVIRBlWGQtPutih5i04k2xLofqV&export=download
Grafana — Kubernetes node planning dashboard

Run Alertmanager

The Alertmanager handles alerts sent by client applications such as the Prometheus server. It takes care of deduplicating, grouping, and routing them to the correct receiver integration such as email, PagerDuty, or OpsGenie. It also takes care of silencing and inhibition of alerts.

Chúng ta cũng thực hiện tương tự như Grafana.

  1. Kiểm tra pod alertmanager-prometheus-operator-alertmanager-0 đang chạy ở Node nào (tạm gọi nó là {alertmanager IP})
  2. Tạo service
# create file alertmanager-service.yml
apiVersion: v1
kind: Service
metadata:
  name: alertmanager-service
  labels:
    app: alertmanager
spec:
  type: NodePort
  ports:
    - port: 9093
      nodePort: 30093
  selector:
    app: alertmanager
# run service
$ kubectl apply -f alertmanager-service.yml -n monitoring
service "alertmanager-service" created
  1. Truy cập http://{alertmanager IP}:30093/

uc?id=172F9bp_Eq0KAbHlw_-60n0nETZxX2Kbk&export=download

Create Dashboards

Như phía trên mình có đề cập về cách cài Prometheus với một số value do mình tự định nghĩa.

helm install stable/prometheus-operator --name prometheus-operator --namespace monitoring -f values1.yaml,values2.yaml

Ở đây mình có thể sử dụng file value.yaml mặc định.
Khi thay đổi file value.yaml thì chúng ta sẽ chạy lệnh sau để upgrade

helm upgrade --install prometheus-operator stable/prometheus-operator --namespace monitoring -f values.yml 

Disk Usage Dashboard

Đầu tiên ở giao diện Grafana chúng ta sẽ tạo 1 Dashboard thông số sử dụng đĩa của các Node trong K8s.
Từ giao diện của Grafana -> Create -> Dashboard, chọn biểu đồ Graph
Tại Panel Title -> chọn edit để nhập câu lệnh truy vấn PROMQL
uc?id=1CEw7nuwQqjvcYbialpdIwh1YFDWqheuf&export=download

Nhập câu truy vấn sau đây

sum( (node_filesystem_size{mountpoint="/"} - node_filesystem_free{mountpoint="/"}) * 100 / node_filesystem_size{mountpoint="/"}  )
BY (instance)

Legend format: {{instance}}
Chạy Query Inspector
uc?id=1NLtxjb4NEfvI6tP5J65gwATVt8l7VRdm&export=download

Vậy là chung ta đã có được một Dashboard thể hiện disk usage của tất cả các node trong K8s. Bây giờ giả sử chúng ta xoá cài đặt prometheus-operator đương nhiên là dashboard của chúng ta tạo cũng biến mất luôn. Để có thể được tạo lại các dashboard chúng ta làm như sau:

  1. Lưu lại file JSON của Dashboard ta vừa tạo bằng cách chọn Setting ở góc trên bên phải -> chọn JSON Model
    Coppy nội dung file JSON và lưu tạm.
  2. Tham khảo https://github.com/helm/charts/tree/master/stable/grafana#sidecar-for-dashboards.
    tạo config-map có tên disk-usage-dashboard.yml
    https://github.com/phongnx1/prometheus-grafana/blob/master/disk-usage-dashboard.yml
  3. Chạy thực thi config-map
$ kubectl apply -f disk-usage-dashboard.yml

Create Alert rule

Vì lỗi Network trong k8s cluster của mình, nên hiện tại mình chưa lấy được demo về Alert. Hẹn mọi người trong phần tiếp theo.

Source

Github: https://github.com/phongnx1/prometheus-grafana

Tài liệu tham khảo

  1. https://prometheus.io/
  2. https://github.com/helm/charts/tree/master/stable/grafana#sidecar-for-dashboards
  3. https://github.com/helm/charts/tree/master/stable/prometheus-operator