Metrics Agent
Metrics Agent ist eine Komponente von NKE, mit der Sie Ihre Anwendungen überwachen können. Metrics Agent ist der Nachfolger der bisherigen Lösung, welche auf Prometheus basiert.
Verfügbarkeit
Metrics Agent ist als optionaler Service für NKE verfügbar und kann über Cockpit auf einem bestehenden NKE-Cluster bereitgestellt werden.
Verwendung
Eine Erläuterung zur Verwendung von Metrics Agent finden Sie in den folgenden Abschnitten.
Allgemeine Informationen zur Einrichtung
Wenn ein Metrics Agent erstellt wird, wird eine neue Metrics Agent-Instanz in Ihrem NKE-Cluster im Namespace „nine-system“ bereitgestellt. Die Pods werden auf den Control-Plane-Nodes ausgeführt, sodass Ihre Nodepools vollständig für Ihre Anwendungen verfügbar bleiben.
Der Metrics Agent basiert auf Victoria Metrics.
Die Konfiguration des MetricsAgent, geschieht über die Resourcen des prometheus-operator projects. Daher können Sie die folgenden Resource Typen in ihrem Cluster nutzen um Scraping-Konfigurationen und Alert- und Recordingrules zu erstellen:
- ServiceMonitors
- PodMonitors
- PrometheusRules
Der Metrics Agent sammelt Ihre Metriken und sendet sie an unseren Metrics Cluster, der extern von Ihrem Cluster aus ausgeführt wird. Dadurch werden im Vergleich zum bisherigen Prometheus-Produkt viele Ressourcen der Control-Plane-Nodes in Ihrem NKE-Cluster freigesetzt.
Exporter und Metriken
Der Metrics Agent sammelt automatisch eine Reihe von Standardmetriken. Zusätzliche Metriken der folgenden Exporter können optional aktiviert werden:
- CertManager
- IngressNginx
- NodeExporter
- Kubelet
- Kubelet cAdvisor
- KubeStateMetrics
- Velero
Aktuell müssen Sie uns mitteilen, welchen dieser Exporter Sie nutzen möchten. Zukünftig werden Sie diese selbst im Cockpit aktivieren können.
Zugriff auf Metriken – Grafana
Der Zugriff auf die Metriken erfolgt durch unser Grafana Produkt. Die Sichtbarkeit der einzelnen Metriken wird dabei vom Projekt der Grafana Instanz bestimmt.
Wenn Sie Ihre Grafana-Instanz im Standardprojekt (gleicher Name wie Ihre Organisation) erstellen, können Sie alle Metriken Ihrer gesamten Organisation sehen.
Wenn Sie die Instanz in einem anderen Projekt erstellen, sehen Sie nur die Metriken von Resourcen des gleichen Projekts.
Instrumentierung Ihrer Anwendung
Bevor Metrics Agent Metriken aus Ihrer Anwendung scrapen kann, müssen Sie Ihre Anwendung so instrumentieren, dass sie Metriken in einem bestimmten Format exportiert. Informationen dazu finden Sie in der offiziellen Prometheus-Dokumentation.
Hinzufügen von Anwendungsmetriken zu Metrics Agent
Sobald Ihre Anwendung Metriken unterstützt, können Sie ServiceMonitors oder
PodMonitors verwenden, damit Metrics Agent die Metriken Ihrer Anwendung
erfassen kann.
ServiceMonitors
durchsuchen alle Pods, die von einem oder mehreren Services angesprochen werden. Diese Ressource
muss in den meisten Fällen verwendet werden. Sie müssen einen Label-Selektor im
ServiceMonitor definieren, der zum Auffinden aller gewünschten Services verwendet wird. Der
ServiceMonitor sollte im selben Namespace erstellt werden wie die Services, die er
auswählt. Neben dem Label-Selektor sollte Ihr ServiceMonitor auch das
Label prometheus.nine.ch/<Name Ihres Metrik-Agenten>: scrape mit dem Namen
Ihrer Metrik-Agent-Instanz enthalten. Betrachten Sie das folgende Beispiel für
die Definition von ServiceMonitor und Service:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: my-app
namespace: my-app
labels:
prometheus.nine.ch/mymetricsagent01: scrape
spec:
selector:
matchLabels:
app: my-app
endpoints:
- port: web
kind: Service
apiVersion: v1
metadata:
name: my-app-service
namespace: my-app
labels:
app: my-app
spec:
selector:
application: example-app
ports:
- name: web
port: 8080
Die angegebene ServiceMonitor-Definition wählt den Service „my-app-service“
aus, da das Label „app: my-app“ für diesen Service vorhanden ist. Der Metrics
Agent sucht dann nach allen Pods, die von diesem Service angesprochen werden, und
beginnt, sie auf Port 8080 nach Metriken zu durchsuchen (der ServiceMonitor
definiert den Port im Feld endpoints).
PodMonitors
erfasst alle Pods, die durch den angegebenen Label-Selektor ausgewählt wurden.
Die Funktionsweise ist sehr ähnlich wie bei der ServiceMonitor-Ressource (nur
ohne tatsächliche Service-Ressource). Sie können die PodMonitor-Ressource
verwenden, wenn Ihre Anwendung aus anderen Gründen keine Service-Ressource
benötigt (wie beispielsweise einige Exporter). Die Pods sollten im selben
Namespace ausgeführt werden, in dem der PodMonitor definiert ist. Hier ist ein
Beispiel für einen PodMonitor mit einem entsprechenden Pod:
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
name: my-pods
namespace: my-app
labels:
prometheus.nine.ch/mymetricsagent01: scrape
spec:
selector:
matchLabels:
application: my-app
endpoints:
- port: web
apiVersion: v1
kind: Pod
metadata:
labels:
application: my-app
name: my-app
namespace: my-app
spec:
containers:
- image: mycompany/example-app
name: app
ports:
name: web
containerPort: 8080
Basierend auf der angegebenen PodMonitor-Ressource generiert der Metrics Agent
eine Scrape-Konfiguration, die den angezeigten Pod „my-app” auf Port 8080 nach
Metriken durchsucht.
Der Metrics Agent erstellt für jede von Ihnen definierte ServiceMonitor- oder
PodMonitor-Ressource einen Job. Ausserdem fügt er allen gescrapten Metriken,
die im entsprechenden Job gesammelt wurden, ein Job-Label hinzu. Anhand dessen
lässt sich feststellen, aus welchen Services oder Pods eine bestimmte Metrik
erfasst wurde.
Verwenden Sie ScrapeConfig, um ein externes Ziel {#external-target} zu scrapen
Die ScrapeConfig CRD kann verwendet werden,
um Ziele ausserhalb des Kubernetes-Clusters zu scrapen oder Scrape-Konfigurationen zu erstellen,
die mit übergeordneten Ressourcen wie ServiceMonitor oder PodMonitor nicht möglich sind.
Derzeit unterstützt ScrapeConfig eine begrenzte Anzahl von Mechanismen zur Serviceermittlung.
Obwohl zahlreiche Optionen verfügbar sind (eine umfassende Liste finden Sie in der
API-Dokumentation),
unterstützen wir derzeit nur static_config- und http_sd-Konfigurationen. Die CRD
wird kontinuierlich weiterentwickelt (derzeit in der Phase „v1alpha1“) und regelmässig um neue Funktionen und
die Unterstützung zusätzlicher Service Discovery-Mechanismen erweitert. Wir müssen sorgfältig
abwägen, welche Felder nützlich sind und langfristig beibehalten werden sollten.
Beispiel für static_config
Das folgende Beispiel enthält eine grundlegende Konfiguration und deckt nicht alle unterstützten Optionen ab.
Um beispielsweise die Zieladresse http://metricsagent.demo.do.metricsagent.io:9090 zu scrapen,
verwenden Sie die folgende Konfiguration:
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: my-static-config
namespace: my-namespace
labels:
prometheus.nine.ch/mymetricsagent01: scrape
spec:
staticConfigs:
- labels:
job: metricsagent
targets:
- metricsagent.demo.do.metricsagent.io:9090
Das Ziel muss als Hostname und nicht als HTTP(S)-URL angegeben werden. Um beispielsweise
das Ziel unter http://metricsagent.demo.do.metricsagent.io:9090 zu scrapen,
sollten Sie metricsagent.demo.do.metricsagent.io:9090 in das Feld targets eingeben.
Weitere Informationen finden Sie in der Konfiguration und der API-Dokumentation.
Beispiel für http_sd
Die HTTP-basierte Serviceermittlung bietet eine allgemeinere Möglichkeit zur Konfiguration statischer Ziele und dient als Schnittstelle zum Einbinden benutzerdefinierter Mechanismen zur Serviceermittlung.
Sie ruft Ziele von einem HTTP-Endpunkt ab, der eine Liste mit null oder mehr static_configs enthält.
Das Ziel muss mit einer HTTP-200-Antwort antworten. Der HTTP-Header Content-Type
muss application/json sein, und der Body muss gültiges JSON sein. Die Antwort muss im
UTF-8-Format vorliegen. Wenn keine Ziele übertragen werden sollen, muss ebenfalls HTTP 200 ausgegeben werden,
mit einer leeren Liste []. Ziellisten sind ungeordnet.
Weitere Informationen finden Sie unter Anforderungen an HTTP-SD-Endpunkte.
Im Allgemeinen lautet der Inhalt der Antwort wie folgt:
[
{
"targets": [ "<host>", ... ],
"labels": {
"<labelname>": "<labelvalue>", ...
}
},
...
]
Example response body:
[
{
"targets": ["metricsagent.demo.do.metricsagent.io:9090"],
"labels": {
"job": "metricsagent",
"__meta_test_label": "test_label1"
}
}
]
Die URL zum HTTP SD gilt nicht als geheim. Die Authentifizierung und alle API-Schlüssel sollten mit den entsprechenden Authentifizierungsmechanismen übermittelt werden. Metrics Agent unterstützt TLS-Authentifizierung, Basisauthentifizierung, OAuth2 und Autorisierungsheader.
Der Endpunkt wird in regelmässigen Abständen mit dem angegebenen Aktualisierungsintervall abgefragt.
Bei jedem Scrape muss die gesamte Liste der Ziele zurückgegeben werden. Inkrementelle Aktualisierungen werden nicht unterstützt. Eine Metrics Agent-Instanz sendet ihren Hostnamen nicht und es ist für einen SD-Endpunkt nicht möglich zu erkennen, ob die SD-Anfrage die erste nach einem Neustart ist oder nicht.
Jedes Ziel hat während der
Umbenennungsphase
ein Meta-Label __meta_url.
Sein Wert wird auf die URL gesetzt, aus der das Ziel extrahiert wurde.
Ein einfaches Beispiel:
apiVersion: monitoring.coreos.com/v1alpha1
kind: ScrapeConfig
metadata:
name: my-http-sd
namespace: my-namespace
labels:
prometheus.nine.ch/mymetricsagent01: scrape
spec:
httpSDConfigs:
- url: http://my-external-api/discovery
refreshInterval: 15s
Der Metrics Agent speichert Ziellisten im Cache und verwendet weiterhin die aktuelle Liste, wenn beim Abrufen einer aktualisierten Liste ein Fehler auftritt. Die Zielliste bleibt jedoch nach einem Neustart nicht erhalten. Daher ist es wichtig, Ihre HTTP-Service-Discovery-Endpunkte (HTTP SD) auf Ausfallzeiten zu überwachen. Bei einem Neustart des Metrics Agent, der während unseres regulären Wartungsfensters erfolgen kann, wird der Cache gelöscht. Wenn zu diesem Zeitpunkt auch die HTTP SD-Endpunkte ausgefallen sind, können Sie die Endpunkt-Zielliste verlieren. Weitere Informationen finden Sie in der Dokumentation zu den Anforderungen an HTTP SD-Endpunkte.
Weitere Details finden Sie in der Konfiguration und der API-Dokumentation.
Abfragen von Metriken
Sie können PromQL verwenden, um Metriken abzufragen. Auf der offiziellen Prometheus-Seite finden Sie einige Beispiele. Abfragen können mit Grafana in der Explore-Ansicht durchgeführt werden. Achten Sie bei der Verwendung von Grafana darauf, die Datenquelle auszuwählen, die zu Ihrer Metrics Agent-Instanz passt. Der Name der Datenquelle lautet <IHR PROJEKTNAME>/.
Hinzufügen von Regeln zu Metrics Agent
Metrics Agent unterstützt zwei Arten von Regeln: Recording Rules und Alerting Rules. Beide haben eine ähnliche Syntax, aber unterschiedliche Anwendungsfälle.
Recording Rules können verwendet werden, um aus bereits vorhandenen Metriken neue Metriken zu berechnen. Dies kann nützlich sein, wenn Sie rechenintensive Abfragen in Dashboards verwenden. Um diese zu beschleunigen, können Sie eine Recording Rules erstellen, die die Abfrage in einem definierten Intervall auswertet und das Ergebnis als neue Metrik speichert. Diese neue Metrik können Sie dann in Ihren Dashboard-Abfragen verwenden.
Mit Alerting Rules können Sie Alarmbedingungen (basierend auf PromQL) definieren. Wenn diese Bedingungen zutreffen, sendet Metrics Agent einen Alarm an die verbundenen Alertmanager-Instanzen. Alertmanager sendet dann Benachrichtigungen über Alarme an die Benutzer.
Achten Sie beim Erstellen von Alert- oder Recordingrules darauf, das Label prometheus.nine.ch/<Name Ihres Metrik-Agenten>: scrape mit dem Namen Ihrer Metrik-Agent-Instanz hinzuzufügen. Dadurch wird die erstellte Regel Ihrer Metrik-Agent-Instanz zugewiesen.
Die folgende Beispiel-Alerting Rule löst einen Alarm aus, sobald ein Job die konfigurierten Pods (Ziele) nicht mehr erreichen kann:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus.nine.ch/mymetricsagent01: scrape
role: alert-rules
name: jobs-check
spec:
groups:
- name: ./example.rules
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: Critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
Diese Alerting Rule Definition löst einen Alarm aus, sobald eine up-Metrik den Wert 0 erhält. Die up-Metrik ist eine spezielle Metrik, da sie vom Metrics Agent selbst für jedes Jobziel (Pod) hinzugefügt wird. Sobald ein Pod nicht mehr gescrapt werden kann, wird die entsprechende up-Metrik auf 0 gesetzt. Wenn die up-Metrik länger als 5 Minuten (in diesem Fall) den Wert 0 hat, löst Metrics Agent eine Warnmeldung aus. Die angegebenen „Labels” und „Annotationen” können in Alertmanager verwendet werden, um Ihre Benachrichtigungen und Routing-Entscheidungen anzupassen.
Die vollständige Spezifikation für die Definition von PrometheusRule finden Sie hier.
Hier ist ein Beispiel für einer Recording Rule:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
prometheus.nine.ch/mymetricsagent01: scrape
role: recording-rules
name: cpu-per-namespace-recording
spec:
groups:
- name: ./example.rules
rules:
- record: namespace:container_cpu_usage_seconds_total:sum_rate
expr: sum(rate(container_cpu_usage_seconds_total{job="kubelet", metrics_path="/metrics/cadvisor", image!="", container!="POD"}[5m])) by (namespace)
Diese Recording Rule erstellt eine neue Metrik namens „namespace:containercpu_usage_seconds_total:sum_rate“, die die Summe der verwendeten CPU aller Container pro Namespace anzeigt. Diese Metrik kann einfach in einem Grafana-Dashboard angezeigt werden, um einen Überblick über die CPU-Auslastung aller Pods pro Namespace zu erhalten.
Das kubernetes-mixins-Projekt enthält Beispielwarnungen und -regeln für verschiedene Exporter. Es ist eine gute Quelle, um sich für Alert- oder Recordingrules inspirieren zu lassen.
Dokumentation und Links
Videoanleitung
Sehen Sie sich unsere Videoanleitungsserie für GKE Application Monitoring an. Die Videos wurden zwar mit unserem GKE-Produkt mit Prometheus erstellt, die Konzepte sind jedoch dieselben.