Theo dõi Calico bằng Prometheus-Operator

Link bài viết gốc: https://fuckcloudnative.io/posts/monitoring-calico-with-prometheus-operator/

Thành phần cốt lõi nhất trong hệ thống Calico là Felix, chịu trách nhiệm cấu hình bảng định tuyến và các quy tắc ACL để đảm bảo kết nối mạng cho các endpoint trên máy chủ này hoạt động bình thường. Ngoài ra, Felix còn thu thập dữ liệu về trạng thái mạng (ví dụ như báo cáo lỗi xảy ra khi cấu hình máy chủ) và lưu trữ thông tin này vào etcd để các thành phần khác trong mạng và người vận hành có thể truy cập.

Do đó, việc giám sát Calico chủ yếu tập trung vào việc giám sát Felix, vì Felix chính là bộ não của Calico. Bài viết này sẽ hướng dẫn cách sử dụng Prometheus-Operator để giám sát Calico.

Bài viết không đề cập chi tiết đến quá trình cài đặt Calico và Prometheus-Operator. Nếu bạn chưa biết cách triển khai chúng, hãy tham khảo tài liệu chính thức và các blog liên quan.

  1. Cấu hình Calico để bật metric

Theo mặc định, các metric từ Felix bị tắt. Để bật chúng, bạn cần chỉnh sửa cấu hình Felix thông qua công cụ dòng lệnh calicoctl. Trước tiên, cần cài đặt công cụ quản lý:

$ wget https://github.com/projectcalico/calicoctl/releases/download/v3.15.0/calicoctl -O /usr/local/bin/calicoctl
$ chmod +x /usr/local/bin/calicoctl

Tiếp theo, thiết lập tệp cấu hình cho calicoctl (mặc định nằm tại /etc/calico/calicoctl.cfg). Nếu backend của Calico sử dụng Kubernetes API, nội dung tệp cấu hình sẽ như sau:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "/root/.kube/config"

Nếu dùng etcd làm backend, cấu hình sẽ như sau:

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "etcdv3"
  etcdEndpoints:  https://192.168.57.51:2379,https://192.168.57.52:2379 ,https://192.168.57.53:2379
  etcdKeyFile: /opt/kubernetes/ssl/server-key.pem
  etcdCertFile: /opt/kubernetes/ssl/server.pem
  etcdCACertFile: /opt/kubernetes/ssl/ca.pem

Bạn cần thay đổi đường dẫn chứng chỉ tương ứng với môi trường thực tế.

Sau khi cấu hình xong calicoctl, bạn có thể kiểm tra hoặc chỉnh sửa cấu hình Calico. Dưới đây là cấu hình mặc định của Felix:

$ calicoctl get felixConfiguration default -o yaml

apiVersion: projectcalico.org/v3
kind: FelixConfiguration
metadata:
  creationTimestamp: "2020-06-25T14:37:28Z"
  name: default
  resourceVersion: "269031"
  uid: 52146c95-ff97-40a9-9ba7-7c3b4dd3ba57
spec:
  bpfLogLevel: ""
  ipipEnabled: true
  logSeverityScreen: Info
  reportingInterval: 0s

Trong cấu hình mặc định không có tính năng bật metric, cần cập nhật thủ công bằng lệnh sau:

$ calicoctl patch felixConfiguration default  --patch '{"spec":{"prometheusMetricsEnabled": true}}'

Felix sẽ cung cấp các metric trên cổng 9091. Kiểm tra bằng lệnh sau để xác nhận:

$ ss -tulnp|grep 9091
tcp    LISTEN     0      4096   [::]:9091               [::]:*                   users:(("calico-node",pid=13761,fd=9))

$ curl -s http://localhost:9091/metrics
# HELP felix_active_local_endpoints Số lượng endpoint hoạt động trên máy chủ này.
# TYPE felix_active_local_endpoints gauge
felix_active_local_endpoints 1
# HELP felix_active_local_policies Số lượng chính sách hoạt động trên máy chủ này.
# TYPE felix_active_local_policies gauge
felix_active_local_policies 0
# HELP felix_active_local_selectors Số lượng bộ chọn hoạt động trên máy chủ này.
# TYPE felix_active_local_selectors gauge
felix_active_local_selectors 0
...

  1. Thu thập metric từ Felix bằng Prometheus

Sau khi bật metric cho Felix, bạn có thể bắt đầu thu thập dữ liệu thông qua Prometheus-Operator. Khi triển khai, Prometheus-Operator tạo ra 5 loại CRD: Prometheus, PodMonitor, ServiceMonitor, AlertManager, và PrometheusRule. Trong đó, Prometheus đại diện cho server Prometheus, còn PodMonitorServiceMonitor là các abstraction giúp cung cấp điểm cuối lấy metric mà Prometheus sẽ pull từ đó.

ServiceMonitor yêu cầu dịch vụ mục tiêu phải có Service tương ứng, trong khi PodMonitor không yêu cầu điều này. Trong bài này, ta sẽ dùng PodMonitor để thu thập metric từ Felix.

Dù không cần Service, nhưng Pod phải khai báo tên và cổng của metric. Do đó, trước tiên cần chỉnh sửa cấu hình DaemonSet calico-node để thêm cổng và tên:

$ kubectl -n kube-system edit ds calico-node

Thêm đoạn sau vào phần spec.template.spec.containers:

        ports:
        - containerPort: 9091
          name: http-metrics
          protocol: TCP

Tạo một PodMonitor tương ứng:

# prometheus-podMonitorCalico.yaml
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  labels:
    k8s-app: calico-node
  name: felix
  namespace: monitoring
spec:
  podMetricsEndpoints:
  - interval: 15s
    path: /metrics
    port: http-metrics
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: calico-node

$ kubectl apply -f prometheus-podMonitorCalico.yaml

Các tham số cần chú ý:

  • Tên của PodMonitor sẽ xuất hiện dưới dạng job_name trong cấu hình Prometheus.
  • Giá trị podMetricsEndpoints.port phải trùng khớp với tên cổng trong Pod (http-metrics).
  • namespaceSelector.matchNames phải giống với namespace chứa Pod (kube-system).
  • selector.matchLabels cần khớp với nhãn duy nhất định danh Pod.

Prometheus-Operator sẽ tự động cập nhật cấu hình Prometheus dựa trên PodMonitor để bắt đầu giám sát các Pod phù hợp. Bạn có thể kiểm tra trong giao diện Prometheus để xem các mục tiêu được giám sát.

Lưu ý rằng nhãn pod="calico-node-xxx" cho thấy nó đang giám sát một Pod cụ thể.

  1. Trực quan hóa dữ liệu metric

Sau khi đã thu thập được các metric, bạn có thể hiển thị chúng thông qua bảng điều khiển Grafana. Tuy nhiên, Grafana đi kèm với Prometheus-Operator không hỗ trợ chỉnh sửa trực tiếp bảng điều khiển và phiên bản cũng chưa phải mới nhất (phiên bản 7.0 trở lên). Vì vậy, tôi sẽ xóa Grafana tích hợp sẵn và triển khai phiên bản mới nhất qua Helm.

Di chuyển các file liên quan đến Grafana vào thư mục riêng:

$ cd kube-prometheus/manifests
$ mkdir grafana
$ mv grafana-* grafana/
$ kubectl delete -f grafana/

Triển khai Grafana mới bằng Helm:

$ helm install grafana stable/grafana -n monitoring

Mật khẩu truy cập Grafana được lưu trong Secret:

$ kubectl -n monitoring get secret grafana -o yaml

apiVersion: v1
data:
  admin-password: MnpoV3VaMGd1b3R3TDY5d3JwOXlIak4yZ3B2cTU1RFNKcVY0RWZsUw==
  admin-user: YWRtaW4=
  ldap-toml: ""
kind: Secret
metadata:
...

Giải mã mật khẩu:

$ echo -n "MnpoV3VaMGd1b3R3TDY5d3JwOXlIak4yZ3B2cTU1RFNKcVY0RWZsUw=="|base64 -d

Tên người dùng là admin. Đăng nhập vào giao diện Grafana với thông tin này.

Thêm nguồn dữ liệu Prometheus:

Calico không cung cấp dashboard riêng, nhưng có chứa nội dung JSON trong ConfigMap. Bạn cần trích xuất nội dung felix-dashboard.json và thay thế giá trị datasource thành prometheus. Có thể dùng sed hoặc chức năng tìm kiếm/thay thế toàn cục của trình soạn thảo. Nếu cần, bạn có thể dùng file JSON đã xử lý sẵn.

Sau khi chỉnh sửa xong, import JSON vào Grafana.

Cuối cùng, bạn sẽ có bảng điều khiển Felix như hình dưới đây:

Nếu bạn thích màu sắc của bảng điều khiển trong ảnh chụp màn hình, có thể tham khảo bài viết về tùy chỉnh chủ đề Grafana.

Phiên bản cài đặt Kubernetes 1.18.2 1.17.5 1.16.9 1.15.12 đã được phát hành tại http://store.lameleg.com. Vui lòng thử nghiệm. Sử dụng sealos phiên bản 3.3.6 mới nhất. Cải tiến cấu hình phân giải tên máy chủ, khắc phục vấn đề tải module IPVS khi khởi động, sửa lỗi tương thích netlink với kernel 3.10 trong lvscare, và tạo chứng chỉ dài hạn. Xem thêm tính năng tại https://github.com/fanux/sealos. Tham gia nhóm DingTalk qua mã QR bên dưới để theo dõi cập nhật.

Thẻ: calico prometheus Operator Kubernetes Grafana

Đăng vào ngày 8 tháng 9 lúc 01:44