Auf dieser Seite wird beschrieben, wie Sie einen Nutzercluster für GKE auf VMware konfigurieren, damit benutzerdefinierte Logs und Messwerte von Nutzeranwendungen an Cloud Logging und Cloud Monitoring gesendet werden.
Sie können Ihre Arbeitslasten auch mit Google Cloud Managed Service for Prometheus überwachen. Dies ist der vollständig verwaltete Speicher- und Abfragedienst von Google Cloud für Prometheus-Messwerte. Aktivieren Sie Managed Service for Prometheus und Cloud Logging, um dieses Feature zu verwenden. Führen Sie dazu die folgenden Schritte aus.
Managed Service for Prometheus für Nutzeranwendungen aktivieren
Die Konfiguration für Managed Service for Prometheus wird in einem Stackdriver-Objekt namens stackdriver
gespeichert.
Öffnen Sie das Objekt
stackdriver
zum Bearbeiten:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
Ersetzen Sie USER_CLUSTER_KUBECONFIG durch den Pfad der kubeconfig-Datei des Nutzerclusters.
Legen Sie unter
spec
den WertenableGMPForApplications
auftrue
fest:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableGMPForApplications: true enableVPC: ... optimizedMetrics: true
Schließen Sie die bearbeitete Datei. Dadurch werden von Google verwaltete Prometheus-Komponenten (GMP) im Cluster ausgeführt.
Prüfen Sie die Komponenten mit dem folgenden Befehl:
kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace gmp-system get pods
Die Ausgabe dieses Befehls sieht wie folgt aus:
NAME READY STATUS RESTARTS AGE collector-abcde 2/2 Running 1 (5d18h ago) 5d18h collector-fghij 2/2 Running 1 (5d18h ago) 5d18h collector-klmno 2/2 Running 1 (5d18h ago) 5d18h gmp-operator-68d49656fc-abcde 1/1 Running 0 5d18h rule-evaluator-7c686485fc-fghij 2/2 Running 1 (5d18h ago) 5d18h
Managed Service for Prometheus unterstützt die Regelauswertung und Benachrichtigungen. Informationen zum Einrichten der Regelauswertung finden Sie unter Regelauswertung.
Beispielanwendung ausführen
In diesem Abschnitt erstellen Sie eine Anwendung, die Prometheus-Messwerte ausgibt, und verwenden von Google verwaltete Prometheus, um die Messwerte zu erfassen. Weitere Informationen finden Sie unter Google Cloud Managed Service for Prometheus.
Beispielanwendung bereitstellen
Erstellen Sie den Namespace
gmp-test
für Ressourcen, die Sie als Teil der Beispielanwendung erstellen:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG create ns gmp-test
Der verwaltete Dienst stellt ein Manifest für eine Beispielanwendung bereit, die Prometheus-Messwerte am
metrics
-Port ausgibt. Die Anwendung verwendet drei Replikate.Führen Sie den folgenden Befehl aus, um die Beispielanwendung bereitzustellen:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/example-app.yaml
PodMonitoring-Ressource konfigurieren
Zur Aufnahme der von der Beispielanwendung ausgegebenen Messwertdaten verwenden Sie Ziel-Scraping. Der verwaltete Dienst verwendet zum Konfigurieren von Ziel-Extraktion und Messwert-Aufnahme benutzerdefinierte PodMonitoring. Sie können Ihre vorhandenen Prometheus-Operator-Ressourcen in PodMonitoring-CRs konvertieren.
Eine PodMonitoring-CR scrapt Ziele nur in dem Namespace, in dem die CR bereitgestellt wird. Wenn Sie Ziele in mehreren Namespaces scrapen möchten, stellen Sie in jedem Namespace dieselbe PodMonitoring-CR bereit. Mit dem folgenden Befehl können Sie prüfen, ob die PodMonitoring-Ressource im gewünschten Namespace installiert ist:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get podmonitoring -A
Eine Referenzdokumentation zu allen CRs für Managed Service for Prometheus finden Sie in der Referenz zu prometheus-engine/doc/api.
Das folgende Manifest definiert die PodMonitoring-Ressource prom-example
im Namespace gmp-test
. Die Ressource findet alle Pods im Namespace mit dem Label app
mit dem Wert prom-example
. Die übereinstimmenden Pods werden an einem Port mit dem Namen metrics
alle 30 Sekunden über den /metrics
-HTTP-Pfad extrahiert.
apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: prom-example spec: selector: matchLabels: app: prom-example endpoints: - port: metrics interval: 30s
Führen Sie folgenden Befehl aus, um diese Ressource anzuwenden:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG -n gmp-test apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.4.1/examples/pod-monitoring.yaml
Managed Service for Prometheus extrahiert jetzt übereinstimmende Pods.
Messwertdaten abfragen
Ob Ihre Prometheus-Daten exportiert werden, lässt sich am einfachsten mit PromQL-Abfragen im Metrics Explorer in der Google Cloud Console prüfen.
So führen Sie eine PromQL-Abfrage aus:
Rufen Sie in der Google Cloud Console die Seite Monitoring auf oder klicken Sie auf die folgende Schaltfläche:
Wählen Sie im Navigationsbereich Metrics Explorer aus.
Verwenden Sie Prometheus Query Language (PromQL), um die Daten anzugeben, die im Diagramm angezeigt werden sollen:
Wählen Sie in der Symbolleiste des Bereichs Messwert auswählen die Option Code-Editor aus.
Wählen Sie im Menü Sprache die Ein/Aus-Schaltfläche PromQL aus. Die Ein-/Aus-Schaltfläche für die Sprache befindet sich unten im Codeeditor.
Geben Sie die Abfrage in den Abfrageeditor ein. Verwenden Sie beispielsweise die folgende Abfrage, um die durchschnittliche Anzahl von Sekunden darzustellen, die CPUs in den einzelnen Modi in der letzten Stunde verbracht haben:
avg(rate(kubernetes_io:anthos_container_cpu_usage_seconds_total {monitored_resource="k8s_node"}[1h]))
Weitere Informationen zur Verwendung von PromQL finden Sie unter PromQL in Cloud Monitoring.
Der folgende Screenshot zeigt ein Diagramm mit dem Messwert anthos_container_cpu_usage_seconds_total
:
Wenn Sie viele Daten erfassen, können Sie exportierte Messwerte filtern, um die Kosten niedrig zu halten.
Cloud Logging für Nutzeranwendungen aktivieren
Die Konfiguration für Logging wird in einem Stackdriver-Objekt namens Stackdriver gespeichert.
Öffnen Sie das Objekt
stackdriver
zum Bearbeiten:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
Ersetzen Sie USER_CLUSTER_KUBECONFIG durch den Pfad der kubeconfig-Datei des Nutzerclusters.
Legen Sie unter
spec
den WertenableCloudLoggingForApplications
auftrue
fest:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableCloudLoggingForApplications: true enableVPC: ... optimizedMetrics: true
Schließen Sie die bearbeitete Datei.
Beispielanwendung ausführen
In diesem Abschnitt erstellen Sie eine Anwendung, die benutzerdefinierte Logs schreibt.
Speichern Sie das folgende Deployment-Manifest in eine Datei mit dem Namen
my-app.yaml
.apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Erstellen Sie das Deployment:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
Anwendungslogs ansehen
Console
Rufen Sie in der Google Cloud Console den Log-Explorer auf.
Klicken Sie auf Ressource. Wählen Sie unter ALL_RESOURCE_TYPES die Option
Kubernetes Container
aus.Wählen Sie unter CLUSTER_NAME den Namen Ihres Nutzerclusters aus.
Wählen Sie unter NAMESPACE_NAME die Option
default
aus.Klicken Sie auf Hinzufügen und dann auf Abfrage ausführen.
Unter Abfrageergebnisse sehen Sie die Logeinträge des Deployment
monitoring-example
. Beispiel:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud
Führen Sie folgenden Befehl aus:
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
Ersetzen Sie PROJECT_ID durch die ID Ihres Logging-Monitoring-Projekts.
In der Ausgabe sehen Sie die Logeinträge des Deployments
monitoring-example
. Beispiel:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
Anwendungslogs filtern
Die Filterung von Anwendungslogs kann die Abrechnung für das Anwendungs-Logging und den Netzwerk-Traffic vom Cluster zu Cloud Logging reduzieren. Wenn ab GKE on VMware-Version 1.15.0 enableCloudLoggingForApplications
auf true
gesetzt ist, können Sie Anwendungslogs nach den folgenden Kriterien filtern:
- Pod-Labels (
podLabelSelectors
) - Namespaces (
namespaces
) - Reguläre Ausdrücke für Loginhalt (
contentRegexes
)
GKE on VMware sendet nur die Filterergebnisse an Cloud Logging.
Anwendungslogfilter definieren
Die Konfiguration für Logging wird in einem Stackdriver-Objekt mit dem Namen stackdriver
angegeben.
Öffnen Sie das Objekt
stackdriver
zum Bearbeiten:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ edit stackdriver stackdriver
Ersetzen Sie USER_CLUSTER_KUBECONFIG durch den Pfad zur kubeconfig-Datei Ihres Nutzerclusters.
Fügen Sie dem
spec
einenappLogFilter
-Abschnitt hinzu:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: enableCloudLoggingForApplications: true projectID: ... clusterName: ... clusterLocation: ... appLogFilter: keepLogRules: - namespaces: - prod ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes ruleName: drop-logs
Speichern und schließen Sie die bearbeitete Datei.
(Optional) Wenn Sie
podLabelSelectors
verwenden, starten Sie das DaemonSetstackdriver-log-forwarder
neu, damit Ihre Änderungen so schnell wie möglich wirksam werden:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG --namespace kube-system \ rollout restart daemonset stackdriver-log-forwarder
Normalerweise werden
podLabelSelectors
nach 10 Minuten wirksam. Wenn Sie das DaemonSetstackdriver-log-forwarder
neu starten, werden die Änderungen schneller wirksam.
Beispiel: ERROR
- oder WARN
-Logs nur in den Namespace prod
einfügen
Das folgende Beispiel zeigt, wie ein Anwendungslogfilter funktioniert. Sie definieren einen Filter, der einen Namespace (prod
), einen regulären Ausdruck (.*(ERROR|WARN).*
) und ein Pod-Label (disableGCPLogging=yes
) verwendet. Prüfen Sie dann, ob der Filter funktioniert, indem Sie einen Pod im Namespace prod
ausführen, um diese Filterbedingungen zu testen.
So definieren und testen Sie einen Anwendungsprotokollfilter:
Geben Sie im Stackdriver-Objekt einen Anwendungslogfilter an:
Im folgenden
appLogFilter
-Beispiel werden nurERROR
- oderWARN
-Logs im Namespaceprod
beibehalten. Alle Logs für Pods mit dem LabeldisableGCPLogging=yes
werden gelöscht:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: ... appLogFilter: keepLogRules: - namespaces: - prod contentRegexes: - ".*(ERROR|WARN).*" ruleName: include-prod-logs dropLogRules: - podLabelSelectors: - disableGCPLogging=yes # kubectl label pods pod disableGCPLogging=yes ruleName: drop-logs ...
Stellen Sie einen Pod im Namespace
prod
bereit und führen Sie ein Skript aus, das die Logeinträge vom TypERROR
undINFO
generiert:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG run pod1 \ --image gcr.io/cloud-marketplace-containers/google/debian10:latest \ --namespace prod --restart Never --command -- \ /bin/sh -c "while true; do echo 'ERROR is 404\\nINFO is not 404' && sleep 1; done"
Die gefilterten Logs sollten nur die
ERROR
-Einträge enthalten, nicht dieINFO
-Einträge.Fügen Sie dem Pod das Label
disableGCPLogging=yes
hinzu:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG label pods pod1 \ --namespace prod disableGCPLogging=yes
Das gefilterte Log sollte keine Einträge für den Pod
pod1
mehr enthalten.
API-Definition für Anwendungslogfilter
Die Definition für den Anwendungslogfilter wird in der benutzerdefinierten Stackdriver-Ressourcendefinition deklariert.
Führen Sie den folgenden Befehl aus, um die benutzerdefinierte Ressourcendefinition von Stackdriver abzurufen:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get crd stackdrivers.addons.gke.io \
--namespace kube-system -o yaml
Logging und Monitoring für Nutzeranwendungen aktivieren (Legacy)
Hinweis: Es wird dringend empfohlen, die oben genannten enableGMPForApplications
und enableCloudLoggingForApplications
zu verwenden, um Monitoring und Logging für Nutzeranwendungen zu aktivieren.
Die folgenden Schritte funktionieren zwar weiterhin, werden aber nicht empfohlen. Lesen Sie dieses bekannte Problem, bevor Sie die folgenden Schritte ausführen.
In diesem Abschnitt wird beschrieben, wie Sie Logging und Monitoring aktivieren, wenn Sie Managed Service for Prometheus nicht verwenden.
Die Konfiguration für Logging und Monitoring wird in einem Stackdriver-Objekt namens stackdriver
gespeichert.
Öffnen Sie das Objekt
stackdriver
zum Bearbeiten:kubectl --kubeconfig=USER_CLUSTER_KUBECONFIG --namespace kube-system edit stackdriver stackdriver
Ersetzen Sie USER_CLUSTER_KUBECONFIG durch den Pfad der kubeconfig-Datei des Nutzerclusters.
Legen Sie unter
spec
den WertenableStackdriverForApplications
auftrue
fest:apiVersion: addons.gke.io/v1alpha1 kind: Stackdriver metadata: name: stackdriver namespace: kube-system spec: projectID: ... clusterName: ... clusterLocation: ... proxyConfigSecretName: ... enableStackdriverForApplications: true enableVPC: ... optimizedMetrics: true
Schließen Sie die bearbeitete Datei.
Arbeitslasten annotieren
Wenn Sie die Erfassung benutzerdefinierter Messwerte aus einer Anwendung aktivieren möchten, fügen Sie die Annotation prometheus.io/scrape: "true"
dem Dienst- oder Pod-Manifest der Anwendung hinzu oder fügen Sie sie dem Abschnitt spec.template
im Deployment- oder DaemonSet-Manifest hinzu, damit sie an die zugehörigen Pods übergeben wird.
Um die automatische Speicherbereinigung von Messwerten zu vermeiden, empfehlen wir, das Extraktionsintervall für Messwerte auf eine Minute festzulegen.
Beispielanwendung ausführen
In diesem Abschnitt erstellen Sie eine Anwendung, die benutzerdefinierte Logs schreibt und einen benutzerdefinierten Messwert bereitstellt.
Speichern Sie die folgenden Dienst- und Deployment-Manifeste in einer Datei mit dem
my-app.yaml
-Namen. Der Dienst hat dieprometheus.io/scrape: "true"
-Annotation:kind: Service apiVersion: v1 metadata: name: "monitoring-example" namespace: "default" annotations: prometheus.io/scrape: "true" spec: selector: app: "monitoring-example" ports: - name: http port: 9090 --- apiVersion: apps/v1 kind: Deployment metadata: name: "monitoring-example" namespace: "default" labels: app: "monitoring-example" spec: replicas: 1 selector: matchLabels: app: "monitoring-example" template: metadata: labels: app: "monitoring-example" spec: containers: - image: gcr.io/google-samples/prometheus-dummy-exporter:latest name: prometheus-example-exporter imagePullPolicy: Always command: - /bin/sh - -c - ./prometheus-dummy-exporter --metric-name=example_monitoring_up --metric-value=1 --port=9090 resources: requests: cpu: 100m
Erstellen Sie das Deployment und den Dienst:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG apply -f my-app.yaml
Anwendungslogs ansehen
Console
Rufen Sie in der Google Cloud Console den Log-Explorer auf.
Klicken Sie auf Ressource. Wählen Sie unter ALL_RESOURCE_TYPES die Option
Kubernetes Container
aus.Wählen Sie unter CLUSTER_NAME den Namen Ihres Nutzerclusters aus.
Wählen Sie unter NAMESPACE_NAME die Option
default
aus.Klicken Sie auf Hinzufügen und dann auf Abfrage ausführen.
Unter Abfrageergebnisse sehen Sie die Logeinträge des Deployment
monitoring-example
. Beispiel:{ "textPayload": "2020/11/14 01:24:24 Starting to listen on :9090\n", "insertId": "1oa4vhg3qfxidt", "resource": { "type": "k8s_container", "labels": { "pod_name": "monitoring-example-7685d96496-xqfsf", "cluster_name": ..., "namespace_name": "default", "project_id": ..., "location": "us-west1", "container_name": "prometheus-example-exporter" } }, "timestamp": "2020-11-14T01:24:24.358600252Z", "labels": { "k8s-pod/pod-template-hash": "7685d96496", "k8s-pod/app": "monitoring-example" }, "logName": "projects/.../logs/stdout", "receiveTimestamp": "2020-11-14T01:24:39.562864735Z" }
gcloud
Führen Sie folgenden Befehl aus:
gcloud logging read 'resource.labels.project_id="PROJECT_ID" AND \ resource.type="k8s_container" AND resource.labels.namespace_name="default"'
Ersetzen Sie PROJECT_ID durch die ID Ihres Logging-Monitoring-Projekts.
In der Ausgabe sehen Sie die Logeinträge des Deployments
monitoring-example
. Beispiel:insertId: 1oa4vhg3qfxidt labels: k8s-pod/app: monitoring-example k8s- pod/pod-template-hash: 7685d96496 logName: projects/.../logs/stdout receiveTimestamp: '2020-11-14T01:24:39.562864735Z' resource: labels: cluster_name: ... container_name: prometheus-example-exporter location: us-west1 namespace_name: default pod_name: monitoring-example-7685d96496-xqfsf project_id: ... type: k8s_container textPayload: | 2020/11/14 01:24:24 Starting to listen on :9090 timestamp: '2020-11-14T01:24:24.358600252Z'
Anwendungsmesswerte in der Google Cloud Console aufrufen
Ihre Beispielanwendung stellt einen benutzerdefinierten Messwert namens example_monitoring_up
bereit.
Die Werte dieses Messwerts finden Sie in der Google Cloud Console.
Rufen Sie in der Google Cloud Console den Metrics Explorer auf.
Wählen Sie als Ressourcentyp
Kubernetes Pod
oderKubernetes Container
aus.Wählen Sie als Messwert die Option
external.googleapis.com/prometheus/example_monitoring_up
aus.Im Diagramm sehen Sie, dass
example_monitoring_up
einen wiederkehrenden Wert von 1 hat.