Monitoring von Zeitachsendaten mit OpenTSDB in Bigtable und GKE

Last reviewed 2022-01-12 UTC

In dieser Anleitung wird beschrieben, wie Sie Zeitreihendaten in der Google Cloud mithilfe von OpenTSDB, das auf der Google Kubernetes Engine (GKE) läuft, und Bigtable sammeln, aufzeichnen und überwachen.

Zeitachsendaten sind sehr wertvoll und können auf vielerlei Art genutzt werden, zum Beispiel für die Erkennung von Trends, Monitoring und maschinelles Lernen. Sie können Zeitachsendaten aus der Serverinfrastruktur, dem Anwendungscode und anderen Quellen generieren. Mit OpenTSDB lassen sich große Mengen von Zeitachsendaten mit einem hohen Detaillierungsgrad erfassen und speichern.

In dieser Anleitung erfahren Softwareentwickler und -architekten, wie Sie mithilfe von GKE eine skalierbare Sammlungsebene für Zeitachsendaten erstellen. Außerdem erfahren Sie, wie Sie mit den erfassten Daten mit Bigtable arbeiten. In dieser Anleitung wird davon ausgegangen, dass Sie mit Kubernetes und Bigtable vertraut sind.

Das folgende Diagramm zeigt die allgemeine Architektur dieser Anleitung.

Quellen von Zeitachsendaten, die in Bigtable gespeichert sind.

Das obige Diagramm zeigt mehrere Quellen von Zeitachsendaten, wie z. B. IoT-Ereignisse und Systemmesswerte, die mithilfe von OpenTSDB, bereitgestellt auf GKE, in Bigtable gespeichert werden.

Ziele

  • In dieser Anleitung verwendete Container-Images mit Cloud Build erstellen
  • Diese Container-Images mithilfe von Artifact Registry verwalten
  • Bigtable-Instanz erstellen.
  • Einen GKE-Cluster installieren
  • OpenTSDB im GKE-Cluster bereitstellen
  • Zeitachsenmesswerte an OpenTSDB senden
  • Messwerte mit OpenTSDB und Grafana visualisieren

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

  1. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  2. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  3. Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry APIs aktivieren.

    Aktivieren Sie die APIs

  4. Rufen Sie in der Google Cloud Console die Seite Willkommen auf.

    Zur Seite „Willkommen“

    Notieren Sie sich die Projekt-ID, da sie in einem späteren Schritt benötigt wird.

  5. Aktivieren Sie Cloud Shell in der Google Cloud Console.

    Cloud Shell aktivieren

Bigtable-Instanz erstellen

In dieser Anleitung werden die von Ihnen erhobenen Zeitachsendaten in Bigtable gespeichert. Sie müssen also eine Bigtable-Instanz erstellen.

Bigtable ist ein schlüssel- bzw. spaltenorientierter Speicher, der sich gut für Zeitachsendaten eignet. Bigtable unterstützt die HBase API. Daher können Sie Software verwenden, die für Apache HBase entwickelt wurde, wie OpenTSDB. Weitere Informationen zum von OpenTSDB verwendeten HBase-Schema finden Sie unter HBase-Schema.

Eine wichtige Komponente von OpenTSDB ist der AsyncHBase-Client, mit dem Massenschreibvorgänge in HBase vollständig asynchron, nicht blockierend und threadsicher ausgeführt werden können. Wenn Sie OpenTSDB mit Bigtable verwenden, wird AsyncHBase als AsyncBigtable-Client implementiert.

In dieser Anleitung wird eine Bigtable-Instanz mit einem Cluster mit einem einzelnen Knoten verwendet. Erwägen Sie beim Wechsel zu einer Produktionsumgebung die Verwendung von Bigtable-Instanzen mit größeren Clustern. Weitere Informationen zum Auswählen einer Clustergröße finden Sie unter Informationen zur Leistung in Bigtable.

  1. Legen Sie in Cloud Shell die Umgebungsvariablen für die Google Cloud-Zone fest, in der Sie den Bigtable-Cluster und den GKE-Cluster erstellen, sowie die Instanz-ID für den Bigtable-Cluster.

    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    export ZONE=ZONE
    

    Dabei gilt:

    • BIGTABLE_INSTANCE_ID: Die ID für Ihre Bigtable-Instanz.
    • ZONE: Die Zone, in der der Bigtable-Cluster und der GKE-Cluster erstellt werden.

    Der Befehl sollte in etwa wie das folgende Beispiel aussehen:

    export BIGTABLE_INSTANCE_ID=bt-opentsdb
    export ZONE=us-central1-f
    
  2. Erstellen Sie die Bigtable-Instanz:

    gcloud bigtable instances create ${BIGTABLE_INSTANCE_ID} \
        --cluster-config=id=${BIGTABLE_INSTANCE_ID}-${ZONE},zone=${ZONE},nodes=1 \
        --display-name=OpenTSDB
    

Images erstellen, die zum Bereitstellen und Testen von OpenTSDB verwendet werden

Zum Bereitstellen und Demonstrieren von OpenTSDB mit einem Bigtable-Speicher-Backend wird in dieser Anleitung eine Reihe von Docker-Container-Images verwendet, die in GKE bereitgestellt werden. Sie erstellen mehrere dieser Images über Cloud Build mit Code aus einem zugehörigen GitHub-Repository. Beim Bereitstellen der Infrastruktur in GKE wird ein Container-Repository verwendet. In dieser Anleitung verwenden Sie Artifact Registry zur Verwaltung dieser Container-Images.

  1. Legen Sie in Cloud Shell die Umgebungsvariablen für Ihre Google Cloud-Zone fest, in der Sie Ihr Artifact Registry-Repository erstellen möchten:

    export PROJECT_ID=PROJECT_ID
    export REGION=REGION
    export AR_REPO=AR_REPO
    

    Dabei gilt:

    • PROJECT_ID: Ihre Projekt-ID
    • REGION: Die Region, in der Ihr Artifact Registry-Repository erstellt wird
    • AR_REPO: Der Name Ihres Artifact Registry-Repositorys

    Der Befehl sollte in etwa wie das folgende Beispiel aussehen:

    export PROJECT_ID=bt-opentsdb-project-id
    export REGION=us-central1
    export AR_REPO=opentsdb-bt-repo
    
  2. Erstellen Sie ein Artifact Registry-Repository:

    gcloud artifacts repositories create ${AR_REPO} \
        --repository-format=docker  \
        --location=${REGION} \
        --description="OpenTSDB on bigtable container images"
    

Images erstellen und verwalten, die zum Bereitstellen und Demonstrieren von OpenTSDB verwendet werden

In dieser Anleitung werden zwei Docker-Container-Images verwendet. Das erste Image wird für zwei Zwecke verwendet: zur einmaligen Einrichtung der Bigtable-Datenbank für OpenTSDB und zum Bereitstellen der Lese- und Schreibdienstcontainer für das OpenTSDB-Deployment. Das zweite Image wird zum Generieren von Beispielmesswertdaten verwendet, um Ihr OpenTSDB-Deployment zu demonstrieren.

Wenn Sie den Container-Image-Build-Job an Cloud Build senden, taggen Sie die Images, damit sie nach dem Erstellen in der Artifact Registry gespeichert werden.

  1. Klonen Sie in Cloud Shell das GitHub-Repository, das den zugehörigen Code enthält:

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  2. Gehen Sie zum Beispielcode-Verzeichnis:

    cd opentsdb-bigtable
    
  3. Legen Sie die Umgebungsvariablen für das OpenTSDB-Server-Image fest, das Bigtable als Speicher-Backend verwendet:

    export SERVER_IMAGE_NAME=opentsdb-server-bigtable
    export SERVER_IMAGE_TAG=2.4.1
    
  4. Erstellen Sie das Image mit Cloud Build:

    gcloud builds submit \
        --tag ${REGION}-docker.pkg.dev/${PROJECT_ID}/${AR_REPO}/${SERVER_IMAGE_NAME}:${SERVER_IMAGE_TAG} \
        build
    

    Da Sie das Image korrekt getaggt haben, wird es nach Abschluss des Builds von Ihrem Artifact Registry-Repository verwaltet.

  5. Legen Sie die Umgebungsvariablen für das Demonstrations-Image zum Generieren von Zeitachsendaten fest:

    export GEN_IMAGE_NAME=opentsdb-timeseries-generate
    export GEN_IMAGE_TAG=0.1
    
  6. Erstellen Sie das Image mit Cloud Build:

    cd generate-ts
    ./build-cloud.sh
    cd ..
    

GKE-Cluster erstellen

GKE stellt eine verwaltete Kubernetes-Umgebung zur Verfügung. Sie können für einen erstellten GKE-Cluster Kubernetes-Pods bereitstellen. In dieser Anleitung werden GKE- und Kubernetes-Pods für die Ausführung von OpenTSDB verwendet.

Bei OpenTSDB sind Speicher- und Anwendungsebene voneinander getrennt. Dadurch kann es für mehrere Instanzen gleichzeitig bereitgestellt werden. Im Parallelbetrieb lassen sich bei OpenTSDB Zeitachsendaten in großem Umfang verarbeiten.

  1. Legen Sie in Cloud Shell die Umgebungsvariablen für die Google Cloud-Zone fest, in der Sie den Bigtable-Cluster und den GKE-Cluster erstellen, sowie den Namen, den Knotentyp und die Version für den GKE-Cluster:

    export GKE_CLUSTER_NAME=GKE_CLUSTER_NAME
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    

    Ersetzen Sie dabei GKE_CLUSTER_NAME durch den Namen Ihres GKE-Clusters.

    Der Befehl sollte in etwa wie das folgende Beispiel aussehen:

    export GKE_CLUSTER_NAME=gke-opentsdb
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    
  2. Erstellen Sie einen GKE-Cluster.

    gcloud container clusters create ${GKE_CLUSTER_NAME} \
        --zone=${ZONE} \
        --cluster-version=${GKE_VERSION} \
        --machine-type ${GKE_NODE_TYPE} \
        --scopes "https://www.googleapis.com/auth/cloud-platform"
    

    Dieser Vorgang kann einige Minuten dauern. Durch Hinzufügen der Bereiche zu Ihrem GKE-Cluster kann der OpenTSDB-Container mit Bigtable und Container Registry interagieren.

    Im weiteren Verlauf dieser Anleitung werden die von Ihnen erstellten Container verwendet, die von Artifact Registry verwaltet werden. Das zum Erstellen des Containers verwendete Dockerfile und das entrypoint-Skript sind im Ordner build des Repositorys der Anleitung enthalten.

  3. Rufen Sie die Anmeldedaten ab, damit Sie eine Verbindung zu Ihrem GKE-Cluster herstellen können:

    gcloud container clusters get-credentials ${GKE_CLUSTER_NAME} --zone ${ZONE}
    

ConfigMap mit Konfigurationsdetails erstellen

Kubernetes verwendet die ConfigMap, um Konfigurationsdetails aus dem Container-Image zu entkoppeln, um Anwendungen portabler zu machen. Die Konfiguration für OpenTSDB wird in der Datei opentsdb.conf angegeben. Eine ConfigMap mit der Datei opentsdb.conf ist im Beispielcode enthalten.

In diesem und den folgenden Schritten verwenden Sie das GNU-Dienstprogramm envsubst, um Platzhalter für Umgebungsvariablen in den YAML-Vorlagendateien durch die entsprechenden Werte für Ihr Deployment zu ersetzen.

  • Erstellen Sie eine ConfigMap aus der aktualisierten Datei opentsdb-config.yaml:

    envsubst < configmaps/opentsdb-config.yaml.tpl | kubectl create -f -
    

OpenTSDB-Tabellen in Bigtable erstellen

Bevor Sie Daten mit OpenTSDB lesen oder schreiben können, müssen Sie in Bigtable Tabellen erstellen, in denen diese Daten gespeichert werden. Zum Erstellen der Tabellen erstellen Sie einen Kubernetes-Job.

  1. Starten Sie in Cloud Shell den Job:

    envsubst < jobs/opentsdb-init.yaml.tpl | kubectl create -f -
    

    Die Ausführung des Jobs kann bis zu einer Minute oder länger dauern. Prüfen Sie, ob der Job erfolgreich abgeschlossen wurde:

    kubectl describe jobs
    

    Die Ausgabe zeigt, dass ein Job erfolgreich war, wenn Pods Statuses 1 Succeeded anzeigt.

  2. Sehen Sie sich die Joblogs für die Tabellenerstellung an:

    OPENTSDB_INIT_POD=$(kubectl get pods --selector=job-name=opentsdb-init \
                        --output=jsonpath={.items..metadata.name})
    kubectl logs $OPENTSDB_INIT_POD
    

    Die Ausgabe sieht etwa so aus:

    create 'tsdb-uid',
      {NAME => 'id', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'},
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 3.2730 seconds
    
    create 'tsdb',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.8440 seconds
    
    create 'tsdb-tree',
      {NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.5420 seconds
    
    create 'tsdb-meta',
      {NAME => 'name', COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF'}
    0 row(s) in 1.9910 seconds
    

    In der Ausgabe werden alle erstellten Tabellen aufgeführt. Dieser Job führt mehrere Befehle zum Erstellen von Tabellen aus. Jeder hat das Format create TABLE_NAME. Die Tabellen werden erfolgreich erstellt, wenn Sie eine Ausgabe im Format 0 row(s) in TIME seconds haben.

    • TABLE_NAME: Der Name der Tabelle, die vom Job erstellt wird
    • TIME: Die Zeit, die für das Erstellen der Tabelle benötigt wurde

Datenmodell

Die von Ihnen erstellten Tabellen speichern Datenpunkte aus OpenTSDB. In einem späteren Schritt schreiben Sie Zeitreihendaten in diese Tabellen. Datenpunkte von Zeitreihen werden so organisiert und gespeichert:

Feld Erforderlich Beschreibung Beispiel
metric Erforderlich Element, das gerade gemessen wird – der Standardschlüssel sys.cpu.user
timestamp Erforderlich Unix-Epochenzeit der Messung 1497561091
tags Geben Sie mindestens ein Tag an Qualifiziert die Messung für Abfragezwecke hostname=www cpu=0 env=prod
value Erforderlich Messwert 89.3

Der Messwert, der Zeitstempel und die Tags (Tag-Schlüssel und Tag-Wert) bilden den Zeilenschlüssel. Der Zeitstempel wird auf eine Stunde normalisiert. So wird sichergestellt, dass eine Zeile nicht zu viele Datenpunkte enthält. Weitere Informationen finden Sie unter HBase-Schema.

OpenTSDB bereitstellen

Das folgende Diagramm zeigt die Deployment-Architektur für OpenTSTB mit zugehörigen Diensten, die in GKE und mit Bigtable als Speicher-Backend ausgeführt werden:

Zwei OpenTSDB-Deployments in Kubernetes

In dieser Anleitung werden zwei OpenTSDB-Deployments verwendet: Ein Deployment sendet Messwerte an Bigtable und das andere Deployment liest daraus. Die Verwendung von zwei Deployments sorgt dafür, dass lange Lese- und Schreibvorgänge sich nicht gegenseitig blockieren. Die Pods in jedem Deployment verwenden denselben Container. OpenTSDB stellt einen Daemon mit dem Namen tsd zur Verfügung, der in jedem Container ausgeführt wird. Ein einzelner tsd-Prozess kann in jeder Sekunde eine hohe Anzahl an Ereignissen verarbeiten. Zum Verteilen der Last erstellt jedes Deployment in dieser Anleitung drei Replikate der Lese- und Schreib-Pods.

  1. Erstellen Sie in Cloud Shell eine Bereitstellung zum Schreiben von Messwerten:

    envsubst < deployments/opentsdb-write.yaml.tpl | kubectl create -f  -
    

    Die Konfigurationsinformationen für das Deployment zum Schreiben befinden sich in der Datei opentsdb-write.yaml.tpl im Ordner deployments des Repositorys dieser Anleitung.

  2. Erstellen Sie ein Deployment zum Lesen von Messwerten:

    envsubst < deployments/opentsdb-read.yaml.tpl | kubectl create -f  -
    

    Die Konfigurationsinformationen für das Deployment zum Lesen befinden sich in der Datei opentsdb-read.yaml.tpl im Ordner deployments des Repositorys der Anleitung.

In einer Produktionsbereitstellung können Sie die Anzahl der ausgeführten tsd-Pods entweder manuell oder mithilfe von Autoscaling in Kubernetes erhöhen. In gleicher Weise haben Sie die Möglichkeit, die Anzahl der Instanzen in Ihrem GKE-Cluster manuell oder mithilfe von Cluster Autoscaler zu erhöhen.

OpenTSDB-Dienste erstellen

Für eine konsistente Netzwerkverbindung zu den Bereitstellungen erstellen Sie zwei Kubernetes-Dienste: Ein Dienst schreibt Messwerte in OpenTSDB und der andere liest daraus.

  1. Erstellen Sie in Cloud Shell den Dienst zum Schreiben von Messwerten:

    kubectl create -f services/opentsdb-write.yaml
    

    Die Konfigurationsinformationen für den Dienst, der die Messwerte schreibt, befinden sich in der Datei opentsdb-write.yaml im Ordner services des Repositorys der Anleitung. Dieser Dienst wird innerhalb Ihres Kubernetes-Clusters erstellt und ist mit anderen Diensten erreichbar, die in Ihrem Cluster ausgeführt werden.

  2. Erstellen Sie den Dienst für das Lesen von Messwerten:

    kubectl create -f services/opentsdb-read.yaml
    

    Die Konfigurationsinformationen für den Dienst, der die Messwerte liest, befinden sich in der Datei opentsdb-read.yaml im Ordner services des Repositorys der Anleitung.

Zeitachsendaten in OpenTSDB schreiben

Es gibt mehrere Mechanismen, um Daten in OpenTSDB zu schreiben. Wenn Sie die Endpunkte des Dienstes definiert haben, können Sie anschließend über Prozesse Daten darin speichern. In dieser Anleitung wird ein Python-Dienst bereitgestellt, der zu Demonstrationszwecken Zeitachsendaten für zwei Messwerte ausgibt: Arbeitsspeicherauslastung des Clusters (memory_usage_gauge) und CPU-Auslastung des Clusters (cpu_node_utilization_gauge).

  • Stellen Sie in Cloud Shell den Zeitachsenmesswertgenerator in Ihrem Cluster bereit:

    envsubst < deployments/generate.yaml.tpl | kubectl create -f -
    

Beispielzeitachsendaten mit OpenTSDB untersuchen

Sie können Zeitachsenmesswerte mithilfe des Dienstendpunkts opentsdb-read abfragen, den Sie zuvor im Rahmen dieser Anleitung bereitgestellt haben. Sie können die Daten auf verschiedene Arten verwenden. Oft werden sie zur Visualisierung verwendet. OpenTSDB enthält eine einfache Schnittstelle, um die gesammelten Messwerte zu visualisieren. Im Rahmen dieser Anleitung verwenden wir Grafana, eine beliebte Alternative zur Visualisierung von Messwerten, die zusätzliche Funktionen bietet.

Für die Ausführung von Grafana in einem Cluster ist ein ähnlicher Vorgang erforderlich, mit dem Sie OpenTSDB eingerichtet haben. Zusätzlich zum Erstellen einer ConfigMap und einer Bereitstellung müssen Sie eine Portweiterleitung konfigurieren, damit Sie auf Grafana zugreifen können, während es in Ihrem Kubernetes-Cluster ausgeführt wird.

  1. Erstellen Sie in Cloud Shell die Grafana-ConfigMap mithilfe der Konfigurationsinformationen in der Datei grafana.yaml im Ordner configmaps des Repositorys der Anleitung:

    kubectl create -f configmaps/grafana.yaml
    
  2. Erstellen Sie das Grafana-Deployment mithilfe der Konfigurationsinformationen in der Datei grafana.yaml im Ordner deployments des Repositorys der Anleitung:

    kubectl create -f deployments/grafana.yaml
    
  3. Ermitteln Sie den Namen des Grafana-Pods im Cluster und verwenden Sie ihn zum Einrichten der Portweiterleitung.

    GRAFANA_PODS=$(kubectl get pods --selector=app=grafana \
                   --output=jsonpath={.items..metadata.name})
    kubectl port-forward $GRAFANA_PODS 8080:3000
    

    Überprüfen Sie, ob die Weiterleitung erfolgreich eingerichtet wurde. Die Ausgabe sieht etwa so aus:

    Forwarding from 127.0.0.1:8080 -> 3000
    
  4. Klicken Sie in Cloud Shell auf Webvorschau und wählen Sie dann Vorschau auf Port 8080 aus, um eine Verbindung zur Grafana-Weboberfläche herzustellen.

    Weitere Informationen finden Sie unter Webvorschau verwenden.

    Im Browser wird ein neuer Tab geöffnet und eine Verbindung zur Grafana-Weboberfläche hergestellt. Nach kurzer Zeit werden dann Diagramme wie diese angezeigt:

    Liniendiagramm mit Clustermesswerten

    Dieses Grafana-Deployment wurde für diese Anleitung angepasst. Mit den Dateien configmaps/grafana.yaml und deployments/grafana.yaml wird Grafana so konfiguriert, dass eine Verbindung zum Dienst opentsdb-read hergestellt, anonyme Authentifizierung zugelassen und einige grundlegende Cluster-Messwerte angezeigt werden. Für ein Grafana-Deployment in einer Produktionsumgebung empfehlen wir die Implementierung der richtigen Authentifizierungsmechanismen und die Verwendung umfangreicherer Zeitachsendaten.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Einzelne Ressourcen löschen

  1. Löschen Sie den Kubernetes-Cluster, damit alle Artefakte gelöscht werden, die Sie erstellt haben:

    gcloud container clusters delete GKE_CLUSTER_NAME
    

    Bestätigen Sie das Löschen des Kubernetes-Clusters durch Eingabe von Y.

  2. So löschen Sie die Bigtable-Instanz:

    1. Wechseln Sie in der Google Cloud Console zu Bigtable.

      Zu Bigtable wechseln

    2. Wählen Sie die zuvor erstellte Instanz aus und klicken Sie auf Instanz löschen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Nächste Schritte