GNU/Linux >> LINUX-Kenntnisse >  >> Cent OS

So überwachen Sie Kubernetes mit Prometheus

Einführung

Prometheus ist ein Open-Source-Instrumentierungsframework. Prometheus kann jede Sekunde riesige Datenmengen absorbieren, wodurch es sich gut für komplexe Workloads eignet.

Verwenden Sie Prometheus, um Ihre Server, VMs und Datenbanken zu überwachen, und nutzen Sie diese Daten, um die Leistung Ihrer Anwendungen und Infrastruktur zu analysieren.

In diesem Artikel wird erläutert, wie Sie die Prometheus-Überwachung in einem Kubernetes-Cluster einrichten.

Voraussetzungen

  • Ein Kubernetes-Cluster
  • Ein vollständig konfiguriertes kubectl Befehlszeilenschnittstelle auf Ihrem lokalen Rechner

Kubernetes-Cluster mit Prometheus überwachen

Prometheus ist ein Pull-basiertes System. Es sendet einen HTTP-Request, einen sogenannten scrape , basierend auf der in der Bereitstellungsdatei definierten Konfiguration . Die Antwort auf diesen scrape Die Anfrage wird im Speicher zusammen mit den Metriken für das Scraping selbst gespeichert und geparst.

Der Speicher ist eine benutzerdefinierte Datenbank auf dem Prometheus-Server und kann einen massiven Datenzufluss bewältigen. Es ist möglich, Tausende von Maschinen gleichzeitig mit einem einzigen Server zu überwachen.

Die Daten müssen entsprechend exponiert und formatiert werden, damit Prometheus sie erfassen kann. Prometheus kann direkt aus den Client-Bibliotheken der App oder mithilfe von Exportern auf Daten zugreifen.

Exporteure werden für Daten verwendet, über die Sie keine vollständige Kontrolle haben (z. B. Kernel-Metriken). Ein Exporter ist eine Software, die neben Ihrer Anwendung platziert wird. Sein Zweck besteht darin, HTTP-Anforderungen von Prometheus anzunehmen, sicherzustellen, dass die Daten in einem unterstützten Format vorliegen, und dann die angeforderten Daten an den Prometheus-Server zu übermitteln.

Alle Ihre Anwendungen sind jetzt so ausgestattet, dass sie Daten an Prometheus liefern können. Wir müssen Prometheus noch mitteilen, wo nach diesen Daten gesucht werden soll. Prometheus entdeckt mithilfe von Service Discovery Ziele, von denen abgekratzt werden kann .

Ihr Kubernetes-Cluster verfügt bereits über Labels und Anmerkungen und einen hervorragenden Mechanismus, um Änderungen und den Status seiner Elemente nachzuverfolgen. Daher verwendet Prometheus die Kubernetes-API, um Ziele zu erkennen.

Die Erkennungen des Kubernetes-Dienstes, die Sie Prometheus offenlegen können, sind:

  • Knoten
  • Endpunkt
  • Dienst
  • pod
  • Ingress

Prometheus ruft Metriken auf Maschinenebene getrennt von den Anwendungsinformationen ab. Die einzige Möglichkeit, Speicher-, Speicherplatz-, CPU-Auslastungs- und Bandbreitenmetriken offenzulegen, ist die Verwendung eines Knotenexportprogramms . Darüber hinaus müssen auch Metriken zu Kontrollgruppen offengelegt werden.

Glücklicherweise ist der cAdvisor-Exporter bereits auf der Kubernetes-Knotenebene eingebettet und kann problemlos verfügbar gemacht werden.

Sobald das System die Daten erfasst hat, können Sie mit der PromQL-Abfragesprache darauf zugreifen, sie in grafische Oberflächen wie Grafana exportieren oder sie zum Senden von Warnungen mit dem Alertmanager verwenden.

Prometheus-Überwachung auf Kubernetes installieren

Die Prometheus-Überwachung kann auf einem Kubernetes-Cluster installiert werden, indem ein Satz von YAML-Dateien (Yet Another Markup Language) verwendet wird. Diese Dateien enthalten Konfigurationen, Berechtigungen und Dienste, die es Prometheus ermöglichen, auf Ressourcen zuzugreifen und Informationen abzurufen, indem die Elemente Ihres Clusters gescrappt werden.

YAML-Dateien lassen sich leicht nachverfolgen, bearbeiten und unbegrenzt wiederverwenden. Die in diesem Tutorial vorgestellten Dateien sind in Online-Repositories wie GitHub leicht und frei verfügbar.

Überwachungs-Namespace erstellen

Alle Ressourcen in Kubernetes werden in einem Namespace gestartet. Wenn kein Namespace angegeben ist, verwendet das System den Standardnamensraum. Um eine bessere Kontrolle über den Cluster-Überwachungsprozess zu haben, werden wir einen Überwachungs-Namespace angeben.

Der Name des Namespace muss eine mit DNS kompatible Bezeichnung sein. Der Einfachheit halber nennen wir den Namespace:monitoring .

Es gibt zwei Möglichkeiten, einen Monitoring-Namespace zum Abrufen von Metriken aus der Kubernetes-API zu erstellen.

Möglichkeit 1:

Geben Sie diesen einfachen Befehl in Ihre Befehlszeilenschnittstelle ein und erstellen Sie die Überwachung Namespace auf Ihrem Host:

kubectl create namespace monitoring

Option 2:

Erstellen Sie eine .yml-Datei und wenden Sie sie an:

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring

Diese Methode ist praktisch, da Sie dieselbe Datei in zukünftigen Instanzen bereitstellen können. Wenden Sie die Datei auf Ihren Cluster an, indem Sie den folgenden Befehl in Ihr Befehlsterminal eingeben:

kubectl -f apply namespace monitoring.yml

Unabhängig von der verwendeten Methode listen Sie vorhandene Namespaces mit diesem Befehl auf:

kubectl get namespaces

Prometheus-Bereitstellungsdatei konfigurieren

Der folgende Abschnitt enthält die notwendigen Elemente, um das Prometheus-Scraping erfolgreich auf Ihrem Kubernetes-Cluster und seinen Elementen einzurichten.

Die Abschnitte können als einzelne .yml implementiert werden Dateien nacheinander ausgeführt. Nachdem Sie jede Datei erstellt haben, kann sie angewendet werden, indem Sie den folgenden Befehl eingeben:

kubectl -f apply [name_of_file].yml

In diesem Beispiel werden alle Elemente in einer einzigen .yml-Datei platziert Datei gespeichert und gleichzeitig angewendet.

Die prometheus.yml Datei in unserem Beispiel weist die kubectl an um eine Anfrage an den Kubernetes-API-Server zu senden. Die Datei enthält:

  1. Berechtigungen, die Prometheus erlauben, auf alle Pods und Knoten zuzugreifen.
  2. Die Prometheus-configMap das definiert, welche Elemente verschrottet werden sollen.
  3. Prometheus-Bereitstellungsanweisungen.
  4. Ein Dienst, der Ihnen Zugriff auf die Prometheus-Benutzeroberfläche gibt.

Clusterrolle, Dienstkonto und Clusterrollenbindung

Namespaces sind so konzipiert, dass sie die Berechtigungen von Standardrollen einschränken, wenn wir clusterweite Daten abrufen möchten, die wir benötigen, um Prometheus Zugriff auf alle Ressourcen dieses Clusters zu gewähren. Eine grundlegende Prometheus-.yml-Datei, die clusterweiten Zugriff bietet, hat die folgenden Elemente:

1. Clusterrolle definieren

Die Verben in jeder Regel definieren die Aktionen, die die Rolle für die apiGroups ausführen kann.

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups:
  - extensions
  resources:
  - ingresses
  verbs: ["get", "list", "watch"]

2. Dienstkonto erstellen

Außerdem müssen wir ein Dienstkonto erstellen, um diese Rolle auf Folgendes anzuwenden:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus
  namespace: monitoring

3. ClusterRoleBinding anwenden

Schließlich müssen wir ein ClusterRoleBinding anwenden . Diese Aktion bindet das Dienstkonto an die zuvor erstellte Clusterrolle.

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus
  namespace: monitoring

Indem wir diese Ressourcen zu unserer Datei hinzugefügt haben, haben wir Prometheus clusterweiten Zugriff von der Überwachung gewährt Namensraum.

Prometheus-Konfigurationskarte

Dieser Abschnitt der Datei enthält Anweisungen für den Scraping-Prozess. Spezifische Anweisungen für jedes Element des Kubernetes-Clusters sollten an Ihre Überwachungsanforderungen und Ihre Cluster-Einrichtung angepasst werden.

1. Globale Scraping-Regeln

apiVersion: v1
data:
  prometheus.yml: |
    global:
      scrape_interval: 10s

2. Scrape-Knoten

Diese Diensterkennung legt die Knoten offen, aus denen Ihr Kubernetes-Cluster besteht. Das Kubelet läuft auf jedem einzelnen Knoten und ist eine Quelle wertvoller Informationen.

2.1 Scrape-Kubelet

    scrape_configs:
    - job_name: 'kubelet'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required with Minikube.

2.2 Scrape cAdvisor (Informationen auf Containerebene)

Das Kubelet liefert nur Informationen über sich selbst und nicht über die Container. Um Informationen von der Containerebene zu erhalten, müssen wir einen Exporter verwenden. Der cAdvisor ist bereits eingebettet und benötigt nur einen metrics_path : /metrics/cadvisor für Prometheus zum Sammeln von Containerdaten:

    - job_name: 'cadvisor'
      kubernetes_sd_configs:
      - role: node
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required with Minikube.
      metrics_path: /metrics/cadvisor

3. Scrape APIServer

Verwenden Sie die Endpoints-Rolle, um auf jede Anwendungsinstanz abzuzielen. Dieser Abschnitt der Datei ermöglicht es Ihnen, API-Server in Ihrem Kubernetes-Cluster zu scrapen.

    - job_name: 'k8apiserver'
      kubernetes_sd_configs:
      - role: endpoints
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true  # Required if using Minikube.
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      relabel_configs:
   - source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
        action: keep
        regex: default;kubernetes;https

4. Scrape-Pods für Kubernetes-Dienste (außer API-Server)

Löschen Sie die Pods, die alle Kubernetes-Dienste unterstützen, und ignorieren Sie die API-Servermetriken.

- job_name: 'k8services'
      kubernetes_sd_configs:
      - role: endpoints
      relabel_configs:
      - source_labels:
          - __meta_kubernetes_namespace
          - __meta_kubernetes_service_name
        action: drop
        regex: default;kubernetes
      - source_labels:
          - __meta_kubernetes_namespace
        regex: default
        action: keep
      - source_labels: [__meta_kubernetes_service_name]
        target_label: job

5. Pod-Rolle

Ermitteln Sie alle Pod-Ports mit den Namensmetriken, indem Sie den Containernamen als Auftragsbezeichnung verwenden.

- job_name: 'k8pods'
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_container_port_name]
        regex: metrics
        action: keep
      - source_labels: [__meta_kubernetes_pod_container_name]
        target_label: job
kind: ConfigMap
metadata:
  name: prometheus-config

6. ReplicaSet konfigurieren

Definieren Sie die Anzahl der benötigten Replikate und eine Vorlage, die auf den definierten Satz von Pods angewendet werden soll.

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: prometheus
spec:
  selector:
    matchLabels:
      app: prometheus
  replicas: 1
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      serviceAccountName: prometheus
      containers:
      - name: prometheus
        image: prom/prometheus:v2.1.0
        ports:
        - containerPort: 9090
          name: default
        volumeMounts:
        - name: config-volume
          mountPath: /etc/prometheus
      volumes:
      - name: config-volume
        configMap:
         name: prometheus-config

7. NodePort definieren

Prometheus wird derzeit im Cluster ausgeführt. Hinzufügen des folgenden Abschnitts zu unserer prometheus.yml Datei wird uns Zugriff auf die Daten geben, die Prometheus gesammelt hat.

kind: Service
apiVersion: v1
metadata:
  name: prometheus
spec:
  selector:
    app: prometheus
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 9090
    targetPort: 9090
    nodePort: 30909

Prometheus.yml-Datei anwenden

Die in der Datei definierte Konfigurationszuordnung gibt jedem Pod in der Bereitstellung Konfigurationsdaten:

kubectl apply -f prometheus.yml

Verwenden Sie die individuelle Node-URL und den in der prometheus.yml definierten nodePort Datei, um von Ihrem Browser aus auf Prometheus zuzugreifen. Zum Beispiel:

http://192.153.99.106:30909

Durch Eingabe der URL oder IP Ihres Knotens und Angabe des Ports aus der yml-Datei haben Sie erfolgreich Zugriff auf Prometheus Monitoring erhalten.

Wie überwache ich Kube-State-Metriken? (Optional)

Sie sind jetzt in der Lage, Ihre Kubernetes-Infrastruktur sowie Ihre Anwendungsinstanzen vollständig zu überwachen. Dies schließt jedoch keine Metriken zu den Informationen ein, die Kubernetes über die Ressourcen in Ihrem Cluster hat.

Die kube-state-metrics ist ein Exportprogramm, das es Prometheus ermöglicht, diese Informationen ebenfalls zu kratzen. Erstellen Sie eine YAML-Datei für den Exporter für kube-state-metrics:

---
apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: kube-state-metrics
spec:
  selector:
    matchLabels:
      app: kube-state-metrics
  replicas: 1
  template:
    metadata:
      labels:
        app: kube-state-metrics
    spec:
      serviceAccountName: prometheus
      containers:
      - name: kube-state-metrics
        image: quay.io/coreos/kube-state-metrics:v1.2.0
        ports:
        - containerPort: 8080
          name: monitoring
---
kind: Service
apiVersion: v1
metadata:
  name: kube-state-metrics
spec:
  selector:
    app: kube-state-metrics
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

Wenden Sie die Datei an, indem Sie den folgenden Befehl eingeben:

kubectl apply -f kube-state-metrics.yml

Sobald Sie die Datei angewendet haben, greifen Sie auf Prometheus zu, indem Sie die Knoten-IP/URL und den definierten Knotenport wie zuvor definiert eingeben.


Cent OS
  1. So verwenden Sie Ansible zum Einrichten der Systemüberwachung mit Prometheus

  2. So installieren Sie Kubernetes mit Minikube unter Ubuntu 20.04

  3. So überwachen Sie ein System mit Sysstat auf Centos

  4. So überwachen Sie die Ressourcennutzung Ihres Servers mit Munin unter CentOS 6

  5. So überwachen Sie die Sicherheit von Linux-Servern mit Osquery

So richten Sie Kubernetes 1.5 mit kubeadm unter CentOS ein

So überwachen Sie Remote-Linux-Systeme mit dem Nagios Monitoring Tool

So installieren Sie Prometheus unter CentOS 8

So richten Sie die Redis-Replikation (mit deaktiviertem Cluster-Modus) in CentOS 8 ein – Teil 1

So zeigen Sie Kubernetes-Pod-Protokolle mit Kubectl an

So überwachen Sie Ihre Linux-Server mit Checkmk