Cloud Bigtable と GKE の OpenTSDB を使用した時系列データのモニタリング

このガイドでは、Google Kubernetes Engine(GKE)Bigtable で実行されている OpenTSDB を使用して、Google Cloud で時系列データを収集、記録、監視する方法について説明します。

時系列データは、傾向分析、モニタリング、機械学習などのさまざまなアプリケーションで使用できる、非常に価値のあるアセットです。時系列データを生成できるソースには、サーバー インフラストラクチャ、アプリケーション コードなどが含まれます。OpenTSDB では、大量の時系列データを極めて細かい粒度で収集し、保持できます。

このガイドでは、ソフトウェア エンジニアとアーキテクトを対象として、GKE を使用して時系列データ用のスケーラブルな収集レイヤを作成する方法を説明します。また、Bigtable を使用して収集されたデータの処理方法も示します。このガイドでは、Kubernetes と Bigtable の知識があることを前提としています。

次の図に、このガイドで説明するアーキテクチャの概要を示します。

Bigtable に保存された時系列データのソース。

上図は、GKE にデプロイされた OpenTSDB を使用して Bigtable に保存される複数の時系列データ(IoT イベントやシステム指標など)のソースを示しています。

目標

  • このガイドで使用するコンテナ イメージを Cloud Build でビルドします。
  • Artifact Registry を使用して、これらのコンテナ イメージを管理します。
  • Bigtable インスタンスを作成します。
  • GKE クラスタを作成する。
  • OpenTSDB を GKE クラスタにデプロイする。
  • OpenTSDB に時系列指標を送信する。
  • OpenTSDB と Grafana を使用して指標を可視化する。

料金

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

始める前に

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. Bigtable, Bigtable Admin, GKE, Compute Engine, Cloud Build, and Artifact Registry API を有効にします。

    API を有効にする

  4. コンソールで [ダッシュボード] ページに移動します。

    ダッシュボードに移動

    後の手順で使用するため、プロジェクト ID をメモしておきます。

  5. コンソールで Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

Bigtable インスタンスを作成する

このガイドでは、収集した時系列データを Bigtable に保存します。そのため、Bigtable インスタンスを作成する必要があります。

Bigtable は、キー / ワイドカラム型のストアであり、時系列データに適しています。Bigtable では、HBase API をサポートしており、OpenTSDB などの Apache HBase と連携するように設計されたソフトウェアを使用できます。OpenTSDB が使用する HBase スキーマの詳細については、HBase スキーマをご覧ください。

OpenTSDB のキー コンポーネントは、AsyncHBase クライアントです。このクライアントにより、完全非同期、非ブロッキング、スレッドセーフという形で HBase に対する一括書き込みを行うことができます。OpenTSDB を Bigtable で使用する場合、AsyncHBase は AsyncBigtable クライアントとして実装されます。

このガイドでは、単一ノードクラスタによる Bigtable インスタンスを使用します。本番環境に移行する場合は、大規模なクラスタによる Bigtable インスタンスの使用を検討してください。クラスタサイズの選択の詳細については、Bigtable のパフォーマンスについてをご覧ください。

  1. Cloud Shell で、Bigtable クラスタと GKE クラスタを作成する Google Cloud ゾーンの環境変数と、Bigtable クラスタのインスタンス識別子を設定します。

    export BIGTABLE_INSTANCE_ID=BIGTABLE_INSTANCE_ID
    export ZONE=ZONE
    

    次のように置き換えます。

    • BIGTABLE_INSTANCE_ID: Bigtable インスタンスの識別子。
    • ZONE: Bigtable クラスタと GKE クラスタが作成されるゾーン。

    コマンドは次の例のようになります。

    export BIGTABLE_INSTANCE_ID=bt-opentsdb
    export ZONE=us-central1-f
    
  2. Bigtable インスタンスを作成します。

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

OpenTSDB のデプロイとテストに使用するイメージを作成する

Bigtable ストレージ バックエンドで OpenTSDB をデプロイしてデモするために、このガイドでは GKE にデプロイされた一連の Docker コンテナ イメージを使用します。付属の GitHub リポジトリのコードを使用して、Cloud Build でいくつかのイメージをビルドします。インフラストラクチャを GKE にデプロイするときに、コンテナ リポジトリが使用されます。このガイドでは、Artifact Registry を使用してこれらのコンテナ イメージを管理します。

  1. Cloud Shell で、Artifact Registry リポジトリを作成する Google Cloud ゾーンの環境変数を設定します。

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

    次のように置き換えます。

    • PROJECT_ID: プロジェクト ID
    • REGION: Artifact Registry リポジトリが作成されるリージョン
    • AR_REPO: Artifact Registry リポジトリの名前

    コマンドは次の例のようになります。

    export PROJECT_ID=bt-opentsdb-project-id
    export REGION=us-central1
    export AR_REPO=opentsdb-bt-repo
    
  2. Artifact Registry リポジトリを作成する

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

OpenTSDB のデプロイとデモに使用するイメージの作成と管理を行う

このガイドでは 2 つの Docker コンテナ イメージを使用します。最初のイメージは、OpenTSDB 用の 1 回限りの Bigtable データベース設定の実行と、OpenTSDB デプロイメント用の読み書きサービス コンテナのデプロイという 2 つの目的で使用されます。2 つ目のイメージは、OpenTSDB のデプロイを示すサンプル指標データの生成に使用されます。

コンテナ イメージのビルドジョブを Cloud Build に送信すると、ビルド後に Artifact Registry に保存されるようにイメージにタグが付けられます。

  1. Cloud Shell で、付属のコードを含む GitHub リポジトリのクローンを作成します。

    git clone https://github.com/GoogleCloudPlatform/opentsdb-bigtable.git
    
  2. サンプルコードのディレクトリに移動します。

    cd opentsdb-bigtable
    
  3. ストレージ バックエンドとして Bigtable を使用する OpenTSDB サーバー イメージの環境変数を設定します。

    export SERVER_IMAGE_NAME=opentsdb-server-bigtable
    export SERVER_IMAGE_TAG=2.4.1
    
  4. Cloud Build を使用してイメージをビルドします。

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

    イメージに適切なタグが付いているため、ビルドが完了すると、イメージは Artifact Registry リポジトリによって管理されます。

  5. デモ時系列データ生成イメージの環境変数を設定します。

    export GEN_IMAGE_NAME=opentsdb-timeseries-generate
    export GEN_IMAGE_TAG=0.1
    
  6. Cloud Build を使用してイメージをビルドします。

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

GKE クラスタを作成する

GKE は、マネージド Kubernetes 環境を提供します。GKE クラスタを作成したら、そのクラスタに Kubernetes Pod をデプロイできます。このガイドでは、GKE と Kubernetes のポッドを使用して OpenTSDB を実行します。

OpenTSDB は、ストレージがアプリケーション層から分離されているため、複数のインスタンスに同時にデプロイできます。OpenTSDB では、このように並行実行することによって大量の時系列データを処理できます。

  1. Cloud Shell で、Bigtable クラスタと GKE クラスタを作成する Google Cloud ゾーンの環境変数と、GKE クラスタとその名前、ノードタイプ、バージョンを設定します。

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

    GKE_CLUSTER_NAME を GKE クラスタの名前に置き換えます。

    コマンドは次の例のようになります。

    export GKE_CLUSTER_NAME=gke-opentsdb
    export GKE_VERSION=1.20
    export GKE_NODE_TYPE=n1-standard-4
    
  2. GKE クラスタを作成します。

    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"
    

    このオペレーションには数分かかることがあります。GKE クラスタにスコープを追加すると、OpenTSDB コンテナが Bigtable および Container Registry とやり取りできるようになります。

    このガイドの残りの部分では、Artifact Registry によって管理されるビルドしたコンテナを使用します。コンテナを作成するために使用する Dockerfile および entrypoint スクリプトは、このガイドのリポジトリの build フォルダに格納されています。

  3. GKE クラスタに接続できるように認証情報を取得します。

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

構成の詳細を含む ConfigMap を作成する

Kubernetes では、アプリケーションの移植性を高めるため、ConfigMap を使用して構成の詳細がコンテナ イメージから切り離されます。OpenTSDB の構成は、opentsdb.conf ファイルで指定されます。サンプルコードには、opentsdb.conf ファイルを含む ConfigMap が含まれています。

以降の手順では、GNU envsubst ユーティリティを使用して、YAML テンプレート ファイル内の環境変数 プレースホルダをデプロイのそれぞれの値に置き換えます。

  • 更新された opentsdb-config.yaml ファイルから ConfigMap を作成します。

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

Bigtable で OpenTSDB テーブルを作成する

OpenTSDB を使用してデータを読み書きするには、そのデータを格納するために Bigtable でテーブルを作成する必要があります。 テーブルを作成するには、Kubernetes ジョブを作成します。

  1. Cloud Shell で Job を起動します。

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

    ジョブが完了するまでに 1 分以上かかることがあります。Job が正常に完了したことを確認します。

    kubectl describe jobs
    

    Pods Statuses1 Succeeded を示している場合の出力は、1 つのジョブが成功したことを示しています。

  2. テーブル作成 Job のログを確認します。

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

    出力は次のようになります。

    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
    

    作成された各テーブルが出力に表示されます。このジョブは、create TABLE_NAME の形式を使用する、複数のテーブル作成コマンドを実行します。0 row(s) in TIME seconds の形式で出力された場合、そのテーブルは正常に作成されています。

    • TABLE_NAME: Job が作成するテーブルの名前
    • TIME: テーブルの作成にかかった時間

データモデル

作成したテーブルは、OpenTSDB からデータポイントを格納します。後のステップで、これらのテーブルに時系列データを書き込みます。時系列データポイントは、次のように編成されて保存されます。

項目 必須 説明
metric 必須 測定中の項目(デフォルトキー) sys.cpu.user
timestamp 必須 測定の Unix エポックタイム 1497561091
tags タグを指定してください 測定をクエリできるようにします hostname=www cpu=0 env=prod
value 必須 測定値 89.3

指標、タイムスタンプ、タグ(タグキーとタグ値)が行キーを形成します。行に含まれるデータポイントが多くなりすぎないように、タイムスタンプは 1 時間に正規化されます。詳細については、HBase スキーマをご覧ください。

OpenTSDB をデプロイする

次の図は、GKE 上でサービスを実行し、ストレージ バックエンドとして Bigtable を使用する、OpenTSTB のデプロイ アーキテクチャを示しています。

2 つの OpenTSDB Kubernetes デプロイ。

このガイドでは、2 つの OpenTSDB Kubernetes デプロイを使用します。1 つのデプロイは Bigtable に指標を送信し、もう 1 つのデプロイはそこから読み取りを行います。2 つのデプロイを使用することで、長時間実行される読み取りオペレーションと書き込みオペレーションが互いにブロックすることがなくなります。それぞれの deployment 内の Pod は、同じコンテナを使用します。各コンテナ内では、OpenTSDB が提供する tsd というデーモンが実行されます。1 つの tsd プロセスで、高スループットのイベントを次々に処理できます。負荷を分散するために、このガイドでは各デプロイで読み取りと書き込み Pod の 3 つのレプリカを作成します。

  1. Cloud Shell で、指標を書き込むためのデプロイを作成します。

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

    書き込みデプロイの構成情報は、ガイドのリポジトリの deployments フォルダ内の opentsdb-write.yaml.tpl ファイルにあります。

  2. 指標を読み取るためのデプロイの作成

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

    読み取りデプロイの構成情報は、ガイドのリポジトリの deployments フォルダ内の opentsdb-read.yaml.tpl ファイルにあります。

本番環境デプロイでは、実行する tsd Pod の数を手動または Kubernetes の自動スケーリングで増やすことができます。同様に、GKE クラスタのインスタンス数を手動で、またはクラスタ オートスケーラーを使って増やすことができます。

OpenTSDB サービスを作成する

デプロイに一貫したネットワーク接続を提供するために、2 つの Kubernetes サービスを作成します。1 つのサービスは OpenTSDB に指標を書き込み、もう 1 つは読み取ります。

  1. Cloud Shell で、指標を書き込む Service を作成します。

    kubectl create -f services/opentsdb-write.yaml
    

    指標書き込み Service の構成情報は、ガイド リポジトリの services フォルダにある opentsdb-write.yaml ファイルに格納されています。この Service は Kubernetes クラスタ内に作成され、クラスタ内で実行される他のサービスから到達可能です。

  2. 指標を読み取るためのサービスの作成

    kubectl create -f services/opentsdb-read.yaml
    

    指標読み取りサービスの構成情報は、ガイドのリポジトリの services フォルダ内の opentsdb-read.yaml ファイルにあります。

OpenTSDB に時系列データを書き込む

OpenTSDB にデータを書き込むメカニズムはいくつかあります。サービス エンドポイントを定義すると、エンドポイントへのデータの書き込みを開始するようにプロセスに指示できます。このガイドでは、クラスタメモリ使用率memory_usage_gauge)とクラスタ CPU 使用率cpu_node_utilization_gauge)の 2 つの指標について時系列データを生成する Python サービスをデプロイします。

  • Cloud Shell で、時系列指標生成ツールをクラスタにデプロイします。

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

OpenTSDB で時系列データの例を調べる

ガイドで前にデプロイした opentsdb-read サービス エンドポイントを使用して、時系列指標をクエリできます。データは、さまざまな方法で使用できます。一般的なオプションの 1 つは、データを可視化することです。OpenTSDB には、収集した指標を可視化するための基本的なインターフェースが組み込まれています。このガイドでは Grafana を使用します。これは指標の可視化に代わる一般的な方法で、追加の機能を利用できます。

クラスタ内で Grafana を実行するには、OpenTSDB をセットアップしたときと同様のプロセスに従います。ただし、ConfigMap とデプロイを作成するだけでなく、Kubernetes クラスタ内で実行中の Grafana にアクセスできるようにするために、ポート転送も構成する必要があります。

  1. Cloud Shell で、ガイド リポジトリの configmaps フォルダ内の grafana.yaml ファイルの構成情報を使用して、Grafana ConfigMap を作成します。

    kubectl create -f configmaps/grafana.yaml
    
  2. ガイドのリポジトリの deployments フォルダ内の grafana.yaml ファイルにある構成情報を使用して、Grafana デプロイを作成します。

    kubectl create -f deployments/grafana.yaml
    
  3. クラスタ内の Grafana Pod の名前を取得し、その名前を使用してポート転送を設定します。

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

    転送が成功したことを確認します。出力は次のようになります。

    Forwarding from 127.0.0.1:8080 -> 3000
    
  4. Grafana ウェブ インターフェースに接続するには、Cloud Shell で [ウェブでプレビュー] をクリックし、[ポート 8080 でプレビュー] を選択します。

    詳細については、ウェブ プレビューの使用をご覧ください。

    新しいブラウザタブが開き、Grafana ウェブ インターフェースに接続します。しばらくすると、ブラウザには次のようなグラフが表示されます。

    クラスタ指標を示す折れ線グラフ

    Grafana のこのデプロイは、このガイド向けにカスタマイズされています。ファイル configmaps/grafana.yamldeployments/grafana.yaml は、opentsdb-read サービスに接続し、匿名認証を許可して、いくつかの基本的なクラスタ指標を表示するように、Grafana を構成します。本番環境に Grafana をデプロイする場合は、適切な認証メカニズムを実装し、より充実した時系列グラフを使用することをおすすめします。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

個々のリソースの削除

  1. Kubernetes クラスタを削除して、作成したすべてのアーティファクトを削除します。

    gcloud container clusters delete GKE_CLUSTER_NAME
    

    Kubernetes クラスタを削除するには、Y を入力して操作を確認します。

  2. Bigtable インスタンスを削除する手順は、次のとおりです。

    1. コンソールで [Bigtable] に移動します。

      Bigtable に移動

    2. 以前作成したインスタンスを選択し、[インスタンスの削除] をクリックします。

プロジェクトの削除

  1. コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ