Prometheus と Cloud Monitoring を使用した複数の GKE クラスタで実行されているアプリのモニタリング

このチュートリアルでは、ハイブリッド環境で実行されている複数の Google Kubernetes Engine(GKE)クラスタに Prometheus サーバーをデプロイする方法を説明します。次に、これらのクラスタで実行されているアプリから指標を収集し、Cloud Monitoring に送信して一元的に監視できるようにする方法を紹介します。

Prometheus は、Google の内部モニタリング システムである Borgmon の影響を受けたモニタリングとアラートのためのオープンソースのツールキットです。Borg が Kubernetes のオープンソース プロジェクトに影響を与え、Borgmon が Prometheus に影響を与えました。ツールは互いにうまく機能します。

Prometheus を使用すると、構成可能な間隔で行われるクエリ(つまり取得)の対象となる取得ターゲットを構成して、多数のマシンを調べてそこに存在する指標を検出して pull できます。取得ターゲットは通常、アプリケーションから公開される HTTP エンドポイントで、1 行に 1 つの指標がある明確な表示形式を使用します。取得ターゲットのデフォルトの転送メカニズムとして HTTP を使用すると、さまざまな言語とエンドポイントの指標を公開できます。取得ターゲットから収集された指標は、Prometheus の時系列データベースに保存されます。

本番環境では、ローカルの Prometheus データベースから Cloud Monitoring のようなより堅牢なモニタリング ソリューションにエクスポートします。Cloud Monitoring は、サービス、コンテナ、アプリ、インフラストラクチャを対象とした、Google が管理するモニタリングおよび管理ソリューションです。Cloud Monitoring では、指標、ログ、トレース、イベントに関する堅牢なストレージ ソリューションを利用できます。また、ダッシュボード、レポート、アラート、その他多くの機能を備えた観測用ツールスイートも提供されます。

このチュートリアルでは、複数の Kubernetes クラスタにインストールされた Prometheus サーバーを使用して、アプリ(PostgreSQL)から指標を取得します。prometheus コンテナとともに実行されている prometheus-stackdriver-sidecar コンテナを使用して、指標を認証し Monitoring に送信します。指標はここに保存され、分析およびアラートに使用されます。ここで示すサイドカー方式は、モニタリング対象のワークロードから指標を分離できるため、ベスト プラクティスとみなされています。このアプローチでは、指標の取得とモニタリングのプロセスが互いに干渉せず、どちらにも必要なリソースが割り当てられます。

このソリューションでは、Google Cloud プロジェクトに次のアーキテクチャを構築します。

アーキテクチャの図。

目標

  • GKE クラスタを 2 つ作成します。そのうちの 1 つは Google Cloud ではない Kubernetes クラスタ(オンプレミスで実行される Kubernetes クラスタなど)をシミュレートします。このチュートリアルでは、どちらのクラスタも GKE クラスタです。
  • 両方のクラスタに Prometheus サーバーをインストールします。
  • 両方のクラスタで prometheus-stackdriver エクスポータ サイドカーを構成します。サイドカーは、指標の認証と Monitoring への送信を担当します。
  • 両方のクラスタにアプリをインストールします。このチュートリアルでは、アプリの一例として PostgreSQL を使用しますが、このアプローチは、Prometheus 指標をエクスポートするように構成されたすべてのアプリに対して有効です。
  • 両方のクラスタからエクスポートされた指標を Monitoring でモニタリングします。

費用

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

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

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

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

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

  3. Google Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. GKE and Monitoring API を有効にします。

    API を有効にする

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

環境設定

このチュートリアルでは、Cloud Shell からすべてのターミナル コマンドを実行します。

リポジトリのクローンを作成する

  1. Cloud Shell を開きます。

    Cloud Shell を開く

  2. このチュートリアルで必要なファイルをダウンロードするには、次のリポジトリのクローンを作成します。リポジトリ フォルダを作業フォルダ($WORKDIR))に設定します。このチュートリアルに関連するすべての作業は、作業フォルダから行います。

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/prometheus-stackdriver-gke
    cd $HOME/prometheus-stackdriver-gke
    WORKDIR=$(pwd)
    

Helm、kubectx、kubens をインストールする

  1. Cloud Shell で、Helm$WORKDIR フォルダにインストールします。

    HELM_VERSION=v2.13.0
    HELM_PATH="$WORKDIR"/helm-"$HELM_VERSION"
    wget https://storage.googleapis.com/kubernetes-helm/helm-"$HELM_VERSION"-linux-amd64.tar.gz
    tar -xvzf helm-"$HELM_VERSION"-linux-amd64.tar.gz
    mv linux-amd64 "$HELM_PATH"
    rm $WORKDIR/helm-"$HELM_VERSION"-linux-amd64.tar.gz
    

    Helm は、Kubernetes アプリを構成してデプロイできるパッケージ マネージャです。このインストールにより、インストール済みの他の Helm 環境が影響を受けることはありません。

  2. kubectxkubens をインストールします。

    git clone https://github.com/ahmetb/kubectx $WORKDIR/kubectx
    export PATH=$PATH:$WORKDIR/kubectx
    

    これらのツールを使用すると、コンテキストと Namespace を簡単に切り替えられるため、複数の GKE クラスタを簡単に操作できます。

Pgbench をインストールする

このチュートリアルでは、Prometheus モニタリング用のサンプルアプリとして PostgreSQL を使用します。Prometheus サーバーが指標を収集できるように PostgreSQL へのトラフィックを生成するには、pgbench という簡単なプログラム ツールを使用して、PostgreSQL でベンチマーク テストを実行します。

  • Cloud Shell で、pgbench をインストールします。

    sudo apt-get install postgresql-contrib
    

IAM を構成する

Prometheus サイドカー コンテナに権限を委任し、Monitoring に指標データを書き込むことができるように、Identity and Access Management(IAM)サービス アカウントを作成します。

  1. Cloud Shell で、Prometheus Monitoring サイドカーで使用する Google Cloud サービス アカウントを作成します。

    gcloud iam service-accounts create prometheus --display-name prometheus-service-account
    
  2. 後のコマンドで使用するために、サービス アカウントのメールアドレスと現在のプロジェクト ID を環境変数に格納します。

    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    PROMETHEUS_SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:prometheus-service-account" \
        --format='value(email)')
    
  3. Prometheus サービス アカウントに monitoring.metricWriter ロールをバインドします。

    gcloud projects add-iam-policy-binding ${PROJECT_ID} --role roles/monitoring.metricWriter --member serviceAccount:${PROMETHEUS_SA_EMAIL}
    

    monitoring.metricWriter ロールにより、Prometheus サイドカー コンテナは Monitoring に指標データを書き込めるようになります。Monitoring はこれらの指標を保存し、ダッシュボードやアラートで使用します。

  4. サービス アカウント キーを作業ディレクトリにダウンロードします。

    gcloud iam service-accounts keys create $WORKDIR/prometheus-service-account.json --iam-account ${PROMETHEUS_SA_EMAIL}
    

Prometheus サイドカー コンテナは、サービス アカウント キーをシークレットとして Cloud Monitoring API への認証に使用します。

GKE クラスタでは、これらの鍵を手動で構成する必要はありません。GKE で実行されている Pod(およびコンテナ)は、Compute Engine インスタンス メタデータにアクセスし、Prometheus サーバーが実行されている GKE ノード(または Compute Engine インスタンス)に接続されたサービス アカウント情報を取得できます。GKE クラスタの場合、Prometheus サイドカー コンテナは、インスタンス メタデータ サービスのサービス アカウント情報を使用して、Cloud Monitoring API への認証を行います。

オンプレミスのデータセンターで実行されているクラスタなど、GKE 以外のクラスタは、Google Cloud サービス アカウントにアクセスできません。これらのクラスタは、手動で構成されたサービス アカウント キーを使用して Cloud Monitoring API に対して自己を認証します。

このチュートリアルでは、gke という GKE クラスタが Compute Engine インスタンスのメタデータを使用して Cloud Monitoring API への認証を行い、指標を書き込みます。onprem という 2 番目の GKE クラスタは、Monitoring API にアクセスして指標を書き込めない GKE クラスタをシミュレートするため、サービス アカウント キーの使用が求められます。

GKE クラスタの作成と構成

GKE ノードは Compute Engine マネージド インスタンス グループです。このようなインスタンスはすべて、ID があります。Compute Engine インスタンスの ID は、作成時に関連付けられた Google Cloud サービス アカウントです。

そのサービス アカウントに関連付けられた IAM のロールと権限によって、そのインスタンスに関連付けられた権限も決まります。GKE クラスタの作成時に明示的にサービス アカウントを定義しない場合、プロジェクトのデフォルトのサービス アカウントを使用してクラスタが作成されます。クラスタ内で実行される Pod は、ノード(Compute Engine インスタンス)のメタデータ サービスにアクセスし、関連付けられたサービス アカウントを使用して、Cloud Monitoring API などのさまざまな Google Cloud サービスにアクセスできます。デフォルトのサービス アカウントとデフォルトの GKE スコープには、Cloud Monitoring API に指標を書き込む権限があります。

このチュートリアルでは、2 つのクラスタ(gkeonprem)の作成時にデフォルトのサービス アカウントを使用します。gke クラスタのみが Compute Engine インスタンス メタデータ サービスを使用し、デフォルトのサービス アカウントを使用して Monitoring に指標を書き込みます。onprem クラスタはデフォルトのサービス アカウントを使用しません。代わりに、Prometheus Google Cloud サービス アカウント キーを使用して Monitoring にアクセスします。

GKE クラスタを作成する

  1. 最初のクラスタ gkeus-west2-a ゾーンに作成し、そのクラスタで GKE の Cloud Monitoring を有効にします。

    gcloud beta container clusters create gke \
        --zone us-west2-a \
        --num-nodes 3 \
        --machine-type n1-standard-2 \
        --enable-stackdriver-kubernetes \
        --verbosity=none --async
    
  2. 2 つ目のクラスタ onpremus-east4-a ゾーンに作成します。

    gcloud container clusters create onprem \
        --zone us-east4-a \
        --num-nodes 3 \
        --machine-type n1-standard-2 \
        --verbosity=none
    
  3. 両方のクラスタが作成されるまで数分かかります。クラスタが実行されていることを確認します。

    gcloud container clusters list
    

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

    NAME    LOCATION    MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
    onprem  us-east4-a  1.11.8-gke.6    <external IP>   n1-standard-2  1.11.8-gke.6  3          RUNNING
    gke     us-west2-a  1.11.8-gke.6    <external IP>   n1-standard-2  1.11.8-gke.6  3          RUNNING
    

クラスタ接続とアクセスを構成する

  1. 両方のクラスタに接続して、kubeconfig ファイルにエントリを生成します。

    gcloud container clusters get-credentials gke --zone us-west2-a --project ${PROJECT_ID}
    gcloud container clusters get-credentials onprem --zone us-east4-a --project ${PROJECT_ID}
    

    kubeconfig ファイルは、クラスタごとにユーザーとコンテキストを作成することによって、クラスタに対する認証を作成するために使用されます。kubeconfig ファイルを作成した後、クラスタ間でコンテキストをすばやく切り替えることができます。

  2. 便宜上、kubectx を使用してコンテキスト名を変更します。

    kubectx gke=gke_${PROJECT_ID}_us-west2-a_gke
    kubectx onprem=gke_${PROJECT_ID}_us-east4-a_onprem
    
  3. クラスタで管理者レベルのタスクが行えるように、Google ID に両方のクラスタの cluster-admin 権限を付与します。

    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin \
        --user=$(gcloud config get-value account) \
              --context gke
    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin \
        --user=$(gcloud config get-value account) \
        --context onprem
    

Prometheus サーバーのインストールと構成

Prometheus サーバーを構成するワークフローは、GKE クラスタと非 GKE クラスタで異なります。混乱を避けるため、このチュートリアルでは両方の設定について説明します。

GKE クラスタに Prometheus をインストールする(GKE ワークフロー)

このセクションでは、Prometheus を使用して gke クラスタを構成します。GKE クラスタを実行している場合は、すべてのクラスタに関してこのワークフローに従います。

  1. Cloud Shell で、gke クラスタに Prometheus 専用の Namespace を作成します。

    kubectl create namespace prometheus --context gke
    
  2. Prometheus Kubernetes サービス アカウント、ClusterRole ロール、クラスタのロール バインディングを作成します。

    cd $WORKDIR
    kubectl apply -f prometheus-service-account.yaml --context gke
    

    このクラスタのロールは、すべての Namespace で実行されている Deployment から指標を取得する権限を付与します。クラスタのロール バインディングは、このロールを Prometheus サービス アカウントに割り当てます。

  3. gke クラスタで実行されているアプリから指標を取得する Prometheus configmap を作成します。

    kubectl apply -f prometheus-configmap.yaml --context gke
    

    Prometheus の構成ファイルの詳細については、Prometheus のドキュメントをご覧ください。

    次のタスクは、Prometheus サーバーの Deployment の作成です。次のステップのマニフェストは、1 つの Pod で Prometheus の Deployment を作成します。Pod は、Prometheus サーバー コンテナと Monitoring サイドカーの 2 つのコンテナで構成されます。Prometheus サーバー コンテナは、Prometheus 指標をエクスポートする GKE クラスタ内の Pod から指標を収集します。サーバーは Monitoring サイドカー コンテナを使用して、Monitoring に指標を push します。

  4. Prometheus の Deployment マニフェストで使用される環境変数を定義します。

    export KUBE_NAMESPACE=prometheus
    export KUBE_CLUSTER=gke
    export GCP_REGION=us-west2-a
    export GCP_PROJECT=$(gcloud info --format='value(config.project)')
    export DATA_DIR=/prometheus
    export DATA_VOLUME=prometheus-storage-volume
    export SIDECAR_IMAGE_TAG=release-0.3.2
    
  5. 定義済みの環境変数を使用して、Prometheus の Deployment マニフェストを適用します。

    envsubst < gke-prometheus-deployment.yaml | kubectl --context gke apply -f -
    
  6. しばらく待ち、Prometheus Pod が動作していることを確認します。

    kubectl get pods -n prometheus --context gke
    

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

    NAME                                     READY     STATUS    RESTARTS   AGE
    prometheus-deployment-6b5df7b5ff-ghqb2   2/2       Running   0          20s
    

    Prometheus Pod では 2 つのコンテナが実行されていることに注意してください。

  7. コンテナ イメージを確認します。

    kubectl --context gke get pods -n prometheus -o json | jq '.items[].spec.containers[].image'
    

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

    "prom/prometheus:v2.6.1"
    "gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:release-0.3.2"
    

    Prometheus サーバーと stackdriver-prometheus-sidecar コンテナが Pod 内で実行中であることがわかります。

  8. gke クラスタで実行されている Prometheus サーバー UI へのポート転送を設定します。

    export PROMETHEUS_POD_GKE=$(kubectl get pods --namespace prometheus -l "app=prometheus-server" \
        -o jsonpath="{.items[0].metadata.name}" \
        --context gke)
    kubectl --context gke port-forward --namespace prometheus $PROMETHEUS_POD_GKE 9090:9090 >> /dev/null &
    

    次のステップでは、Prometheus UI を開きます。

  9. Cloud Shell で [ウェブでプレビュー] をクリックし、[ポートを変更] をクリックします。

    1. [ポート番号] に「9090」と入力します。
    2. [変更してプレビュー] をクリックします。Prometheus サーバーの UI が表示されます。

    Prometheus サーバー UI。ポート 9090 へ変更。

gke クラスタで Prometheus を検査する

Prometheus は、Prometheus Kubernetes サービス アカウントを使用して、GKE クラスタ内で実行されているリソースを検出します。これらのリソースの一部は、すでに Prometheus の指標をエクスポートするように構成されています。

  1. Prometheus UI で、[ステータス] > [Service Discovery] の順にクリックします。リストには、Prometheus が検出した Kubernetes リソースが表示されます。

    Prometheus が検出した Kubernetes リソース。

    Service Discovery
    kubernetes-apiservers (1/16 active targets)
    kubernetes-cadvisor (3/3 active targets)
    kubernetes-nodes (3/3 active targets)
    kubernetes-pods (0/42 active targets)
    kubernetes-service-endpoints (0/16 active targets)
    
  2. [ステータス] > [ターゲット] の順にクリックします。

    [ターゲット] は、Prometheus 指標を定期的にエクスポートするリソースで定義される HTTP(S) エンドポイントです。/metrics HTTPS エンドポイントから指標をエクスポートする Kubernetes API サーバーなど、指標をエクスポートするさまざまな Kubernetes リソースが表示されます。

gke クラスタに PostgreSQL をインストールする

このセクションでは、gke クラスタにアプリをインストールします。このアプリは Prometheus 指標のエクスポートを備えています。このチュートリアルでは、安定版の Helm チャートを使用して PostgreSQL をインストールします。ただし、Prometheus 指標をエクスポートするアプリはすべて、同じワークフローに従います。

  1. gke クラスタ コンテキストに切り替えます。

    kubectx gke
    
  2. Helm のサーバー側である Tiller に、gke クラスタの cluster-admin 役割を付与します。

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-admin-binding \
        --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    
  3. Helm を初期化して、gke クラスタに Tiller をインストールします。

    ${HELM_PATH}/helm init --service-account=tiller
    ${HELM_PATH}/helm repo update
    
  4. 次のコマンドを実行して、Helm が正しくインストールされていることを確認します。

    ${HELM_PATH}/helm version
    

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

    Client: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    

    Helm が正しくインストールされている場合は、クライアントとサーバーの両方に v2.13.0 が表示されます。クライアントとサーバーの両方でインストールされるまで、version コマンドを複数回実行する必要があります。

  5. 安定版 Helm リリースを使用して PostgreSQL をインストールします。

    ${HELM_PATH}/helm install --name gke --set postgresUser=user,postgresPassword=password,postgresDatabase=postgres \
        stable/postgresql --set metrics.enabled=true \
        --set postgresqlDatabase=prometheusdb
    

    PostgreSQL の初期化には数分かかります。

  6. 続行する前に、PostgreSQL が実行されていることを確認します。

    kubectl get pods
    

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

    NAME               READY     STATUS    RESTARTS   AGE
    gke-postgresql-0   2/2       Running   0          1m
    

    PostgreSQL Pod 内で実行されている 2 つのコンテナを検査します。

    kubectl --context gke get pods gke-postgresql-0 -ojson | jq '.spec.containers[].image'
    

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

    "docker.io/bitnami/postgresql:10.7.0"
    "docker.io/wrouesnel/postgres_exporter:v0.4.7"
    

    最初のコンテナは PostgreSQL コンテナです。2 つ目のコンテナは、Postgres の Prometheus 指標エクスポータです。

  7. gke で実行されている Service を検査します。

    kubectl get services
    

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

    NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP
    gke-postgresql-metrics    ClusterIP   10.23.255.97    <none>        9187/TCP   1m
    

    PostgreSQL は、gke-postgresql-metrics Service を使用して Prometheus 指標を公開します。

  8. gke-postgresql-metrics Service のアノテーションを検査します。

    kubectl --context gke get service gke-postgresql-metrics -ojson | jq '.metadata.annotations'
    

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

    {
      "prometheus.io/port": "9187",
      "prometheus.io/scrape": "true"
    }
    

    Prometheus は、Kubernetes Service レジストリを使用して Kubernetes Services を検出します。Prometheus は、Service の Kubernetes アノテーションを使用して、ターゲット構成を決定します。これらのアノテーションは、ポート、ターゲット エンドポイント、取得する Service などの Prometheus 構成を記述します。

    出力には、Prometheus 指標のポート 9187true に設定された scrape 設定の 2 つのアノテーションが表示されます。アノテーションとして定義されていない限り、デフォルトのターゲット エンドポイントは /metrics です。Prometheus Kubernetes のアノテーションと構成の詳細なリストについては、Prometheus のドキュメントをご覧ください。

  9. Prometheus UI ウィンドウで、[ステータス] > [ターゲット] ページに移動し、[kubernetes-service-endpoints] セクションまでスクロールして、kubernetes-service-endpoints リンクの横にある [もっと見る] をクリックするか更新します。

    Prometheus UI ウィンドウ。

    Prometheus がポート 9187 で PostgreSQL Pod から指標を取得し、ターゲット /metrics を取得する方法に注意してください。IP アドレスは PostgreSQL Pod の IP アドレスです。

これで、Prometheus サーバー(および Monitoring サイドカー)が GKE クラスタにインストールされました。また、Prometheus 指標をエクスポートするよう適切に構成されたアプリ(PostgreSQL)もインストールできました。Prometheus は、Kubernetes Service アノテーションを使用してこのアプリから指標を取得中です。次のセクションでは、onprem クラスタに Prometheus と PostgreSQL をインストールします。

onprorem クラスタに Prometheus をインストールする(GKE 以外のワークフロー)。

このセクションでは、Prometheus を使用して onprem クラスタを構成します。GKE 以外のクラスタの場合は、このワークフローに従います。

  1. onprem クラスタに Prometheus 専用の Namespace を作成します。

    kubectl create namespace prometheus --context onprem
    
  2. Prometheus Kubernetes Service アカウントと ClusterRole ロールを作成します。

    kubectl apply -f prometheus-service-account.yaml --context onprem
    

    ClusterRole ロールは、すべての Namespace で実行されている Deployment から指標を取得する権限を Prometheus サーバーに付与します。

  3. onprem クラスタで実行されているアプリから指標を取得する Prometheus configmap を作成します。

    kubectl apply -f prometheus-configmap.yaml --context onprem
    

次に、Prometheus の Deployment を作成します。Prometheus サーバーは、prometheus という Kubernetes Service アカウント(ステップ 2 で作成済み)を使用して、Kubernetes クラスタで実行中のアプリから指標を取得します。Prometheus サーバーは、Monitoring サイドカー コンテナを使用してこれらの指標を Monitoring に送信します。サイドカーでは、Cloud Monitoring API に対する認証と指標の push に Google Cloud サービス アカウントが必要です。onprem クラスタは非 GKE クラスタをシミュレートしているため、Compute Engine インスタンス メタデータ サービスを使用して Google Cloud サービス アカウントにアクセスできません。サイドカーを構成するには、前にダウンロードした Google Cloud サービス アカウントの JSON キーを使用します。

次の手順は、gke クラスタに構成した GKE ワークフローとは異なります。

  1. Google Cloud サービス アカウントの JSON キーを使用してシークレットを作成します。

    kubectl create secret -n prometheus generic prometheus-key --from-file=$WORKDIR/prometheus-service-account.json --context onprem
    
  2. Prometheus の Deployment の作成に必要な環境変数を定義します。

    export KUBE_NAMESPACE=prometheus
    export KUBE_CLUSTER=onprem
    export GCP_REGION=us-east4-a
    export GCP_PROJECT=$(gcloud info --format='value(config.project)')
    export DATA_DIR=/prometheus
    export DATA_VOLUME=prometheus-storage-volume
    export SIDECAR_IMAGE_TAG=release-0.3.2
    
  3. Prometheus の Deployment を作成します。

    envsubst < onprem-prometheus-deployment.yaml | kubectl --context onprem apply -f -
    
  4. しばらく待ち、Prometheus Pod が動作していることを確認します。

    kubectl get pods -n prometheus --context onprem
    

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

    NAME                                     READY     STATUS    RESTARTS   AGE
    prometheus-deployment-75857dc9fc-vp5cr   2/2       Running   0          55s
    

    Prometheus Pod で 2 つのコンテナが実行されていることに注意してください。

  5. 次のコマンドを実行して、コンテナ イメージを確認します。

    kubectl --context onprem get pods -n prometheus -ojson | jq '.items[].spec.containers[].image'
    

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

    "prom/prometheus:v2.6.1"
    "gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:release-0.3.2"
    

    Prometheus サーバーと stackdriver-prometheus-sidecar コンテナが Pod 内で実行中であることがわかります。サイドカー Pod は、Cloud Monitoring API への認証にシークレット prometheus-key を使用します。Prometheus の Deployment の volumesvolumeMountsenv を検査します。

  6. Promoteheus の Deployment で volumes を検査します。

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.volumes'
    

    このコマンドでは、先ほど作成した secretName prometheus-key を使用して、prometheus-key という Volume を作成します。出力は次の抜粋のようになります。

      {
        "name": "prometheus-key",
        "secret": {
          "defaultMode": 420,
          "secretName": "prometheus-key"
        }
    
    
  7. サイドカー コンテナの volumeMounts を調べます。

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.containers[1].volumeMounts'
    

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

    {
      "mountPath": "/var/secrets/google",
      "name": "prometheus-key"
    }
    

    Volume prometheus-keystackdriver-sidecar コンテナのマウントパス /var/secrets/google にマウントされます。サービス アカウント キーは、このパス内にあります。

  8. Monitoring サイドカー コンテナに定義されている環境変数を調べます。環境変数 [GOOGLE_APPLICATION_CREDENTIALS](/docs/authentication/getting-started#setting_the_environment_variable) は、Google クライアント ライブラリが認証に使用する特別な環境変数です。この変数には、prometheus-service-account.json キーのパスを指す値が割り当てられます。Monitoring サイドカーは Google クライアント ライブラリを使用するため、この変数を使用して Cloud Monitoring API への認証を行います。

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.containers[1].env'
    

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

    [
      {
        "name": "GOOGLE_APPLICATION_CREDENTIALS",
        "value": "/var/secrets/google/prometheus-service-account.json"
      }
    ]
    
  9. onprem クラスタで実行されている Prometheus サーバー UI へのポート転送を設定します。

    export PROMETHEUS_POD_ONPREM=$(kubectl get pods --namespace prometheus -l "app=prometheus-server" \
        -o jsonpath="{.items[0].metadata.name}" --context onprem)
    kubectl --context onprem port-forward \
        --namespace prometheus $PROMETHEUS_POD_ONPREM 9091:9090 >> /dev/null &
    

    次のステップでは、Prometheus UI を開きます。

  10. Cloud Shell で [ウェブでプレビュー] をクリックし、[ポートを変更] をクリックします。

    1. [ポート番号] に「9091」と入力します。
    2. [変更してプレビュー] をクリックします。Prometheus サーバーの UI が表示されます。これにより、Prometheus サーバーが実行されていることが確認されます。

    Prometheus UI。ポート番号を 9091 へ変更。

onprem クラスタに PostgreSQL をインストールする

このセクションでは、Helm を使用して onprem クラスタに PostgreSQL をインストールします。これらの手順は、gke クラスタの PostgreSQL インストール手順と同じです。

  1. onprem コンテキストに切り替えます。

    kubectx onprem
    
  2. Helm のサーバー側である Tiller に、onprem クラスタの cluster-admin 役割を付与します。

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    
  3. Helm を初期化して、onprem クラスタに Tiller をインストールします。

    ${HELM_PATH}/helm init --service-account=tiller
    ${HELM_PATH}/helm update
    

    次のコマンドを実行して、Helm が正しくインストールされていることを確認します。

    ${HELM_PATH}/helm version
    

    Helm が正しくインストールされている場合は、クライアントとサーバーの両方に v2.13.0 が表示されます。クライアントとサーバーの両方でインストールされるまで、version コマンドを複数回実行する必要があります。

    Client: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    
  4. 安定版 Helm リリースを使用して PostgreSQL をインストールします。

    ${HELM_PATH}/helm install --name onprem \
    --set postgresUser=user,postgresPassword=password,postgresDatabase=postgres \
    stable/postgresql --set metrics.enabled=true --set postgresqlDatabase=prometheusdb
    
  5. PostgreSQL が実行されていることを確認します。

    kubectl get pods
    

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

    onprem-postgresql-0   2/2       Running   0          39s
    

    PostgreSQL Pod で実行されている 2 つのコンテナを検査します。

    kubectl --context onprem get pods onprem-postgresql-0 -ojson | jq '.spec.containers[].image'
    

    最初のコンテナは PostgreSQL コンテナです。2 つ目のコンテナは、Postgres の Prometheus 指標エクスポータです。出力は次のようになります。

    "docker.io/bitnami/postgresql:10.7.0"
    "docker.io/wrouesnel/postgres_exporter:v0.4.7"
    
  6. onprem クラスタで実行されている Service を調べます。PostgreSQL は、onprem-postgresql-metrics Service を使用して Prometheus 指標を公開します。

    kubectl get services --context onprem
    

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

    onprem-postgresql-metrics    ClusterIP   10.47.240.77    <none>        9187/TCP   1m
    
  7. onprem-postgresql-metrics Service のアノテーションを検査します。

    kubectl --context onprem get service onprem-postgresql-metrics -ojson | jq '.metadata.annotations'
    

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

    {
      "prometheus.io/port": "9187",
      "prometheus.io/scrape": "true"
    }
    
  8. Prometheus UI ウィンドウで、[ステータス] > [ターゲット] ページに移動し、[kubernetes-service-endpoints] セクションまでスクロールして、kubernetes-service-endpoints リンクの横にある [もっと見る] をクリックします。

    指標を取得する Prometheus。

    Prometheus がポート 9187 で PostgreSQL Pod から指標と取得ターゲット /metrics を取得しています。

これで、GKE 以外のクラスタ(たとえば、オンプレミスのデータセンターで実行されている Kubernetes クラスタ)に Prometheus サーバー(サイドカーを含む)が正常にインストールされました。また、クラスタに PostgreSQL がインストールされました。これは、Prometheus 指標をエクスポートするように構成できます。Prometheus は、Kubernetes Service アノテーションを使用して、PostgreSQL データベースから指標を取得しています。

次のセクションでは、Monitoring を設定して、gke クラスタと onprem クラスタの両方で実行されている PostgreSQL データベースへのトラフィックを生成し、Monitoring で指標をモニタリングします。

Monitoring の設定

このセクションでは、Monitoring で指標モニタリング用の新しいワークスペースを設定します。ワークスペースでは、Monitoring のモニタリング情報が整理されます。モニタリング ワークスペースを使用すると、リソースの場所に関係なく、重要なリソースをモニタリングできます。Google Cloud プロジェクトに対してワークスペースを作成するには、そのプロジェクトに次のいずれかの IAM ロールが必要です。

  • プロジェクト所有者
  • モニタリング編集者
  • モニタリング管理者
  • モニタリング アカウント編集者

Monitoring で指標を設定するには、次の手順を行います。

  1. Cloud Console で、[Monitoring] に移動するか、次のボタンを使用します。

    [モニタリング] に移動

  2. Monitoring リンクをクリックするのが始めての場合、新しいワークスペースが自動的に作成および初期化されます。ワークスペース名はプロジェクト ID と同じです。

  3. [ダッシュボード] をクリックします。
  4. [ダッシュボードを作成] をクリックします。
  5. [ダッシュボード名] フィールドに PostgreSQL と入力します。
  6. [グラフを追加] をクリックします。
  7. [指標] タブが選択されていることを確認します。
  8. [Find resource type and metric] とラベルの付いたボックスをクリックし、pg_stat_database_blks_read と入力します。
  9. [グループ条件] プルダウン リストで、[cluster_name] を選択します。
  10. [アグリゲータ] に sum と入力します。

    リソースタイプの検索。

    指標名に external/prometheus/ という接頭辞が付いていることに注意してください。これは、Prometheus サーバーからの指標であることを示します。グラフには、両方のクラスタからの指標が表示されます。つまり、gkeonprem の両方のクラスタで指標がエクスポートされています。

  11. [Save Chart] をクリックします。グラフに名前を付けます。
  12. [グラフを追加] をクリックします。
  13. このグラフでは、指標 pg_stat_database_blks_hit を入力します。
  14. [グループ条件] プルダウン リストで、[cluster_name] を選択します。
  15. [アグリゲータ] に sum と入力します。
  16. [Save Chart] をクリックします。グラフに名前を付けます。
  17. [ダッシュボード] をクリックし、[PostgreSQL] を選択します。このダッシュボードには 2 つのグラフがあります。
  18. リストをクリックして凡例を確認し、両方のクラスタからの指標を受信していることを確認します。

    両方のクラスタからの指標を受信していることを確認します。

    ダッシュボードで [グラフを追加] をクリックして、ダッシュボードから指標を追加することもできます。

PostgreSQL へのトラフィックの生成

このセクションでは、両方のクラスタで実行中の PostgreSQL データベースへのトラフィックを生成し、Monitoring ダッシュボードで指標をモニタリングします。トラフィックの生成には、PostgreSQL ベンチマーク ツールである pgbench を使用します。Cloud Shell ウィンドウを 2 つ使用して、両方の PostgreSQL データベースへのトラフィックを同時に生成します。

gke PostgreSQL インスタンスへのトラフィックを生成する

  1. 上部バーにある Cloud Shell タブの隣に、2 つ目の Cloud Shell タブを開きます。

    2 つ目の Cloud Shell セッションの開始。

    最初の Cloud Shell ウィンドウで、次のコマンドを実行して、gke クラスタで実行されている PostgreSQL データベースへのトラフィックを生成します。

  2. gke クラスタで PostgreSQL データベースのパスワードを取得します。

    export POSTGRES_PASSWORD_GKE=$(kubectl --context gke get secret --namespace default gke-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
    
  3. ポート転送を使用して、gke クラスタのポート 5432 で PostgreSQL データベースを公開します。

    kubectl --context gke port-forward --namespace default svc/gke-postgresql 5432:5432 >> /dev/null &
    
  4. PostgreSQL データベースにログインします。

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" psql --host 127.0.0.1 -p 5432 -U postgres -d prometheusdb
    
  5. ベンチマーク用に gketest というデータベースを作成します。

    CREATE DATABASE gketest;
    
  6. PostgreSQL データベースを終了します。

    \q
    
  7. ベンチマーク用の gketest データベースを初期化します。

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" pgbench -i -h localhost -p 5432 -U postgres -d gketest
    
  8. gke クラスタの gketest データベースでベンチマークを開始します。次のテストは、-T オプション(秒単位)で構成されているように、10 分間実行されます。

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" pgbench -c 10 -T 600 -h localhost -p 5432 -U postgres -d gketest
    

onprem PostgreSQL インスタンスへのトラフィックを生成する

2 つ目の Cloud Shell ウィンドウで、次のコマンドを実行して、onprem クラスタで実行されている PostgreSQL データベースへのトラフィックを生成します。

  1. onprem クラスタで PostgreSQL データベースのパスワードを取得します。

    export POSTGRES_PASSWORD_ONPREM=$(kubectl --context onprem get secret --namespace default onprem-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
    
  2. ポート転送を使用して、onprem クラスタのポート 5431 で PostgreSQL データベースを公開します。

    kubectl --context onprem port-forward --namespace default svc/onprem-postgresql 5431:5432 >> /dev/null &
    
  3. PostgreSQL データベースにログインします。

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" psql --host 127.0.0.1 -p 5431 -U postgres -d prometheusdb
    
  4. ベンチマーク用に onpremtest というデータベースを作成します。

    CREATE DATABASE onpremtest;
    
  5. PostgreSQL データベースを終了します。

    \q
    
  6. ベンチマーク用の onpremtest データベースを初期化します。

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" pgbench -i -h localhost -p 5431 -U postgres -d onpremtest
    
  7. onprem クラスタの onpremtest データベースでベンチマークを開始します。次のテストは 10 分間実行されます。

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" pgbench -c 10 -T 600 -h localhost -p 5431 -U postgres -d onpremtest
    

モニタリング データを確認する

テストの実行中に [Monitoring] ページに戻り、グラフを調べます。

  1. Cloud Console で、[Monitoring ] に移動します。

    [Monitoring] に移動

    複数のクラスタで実行中のアプリから Prometheus の指標を受信。

  2. [ダッシュボード] > [PostgreSQL] の順に移動します。

  3. 自動更新を有効にするには [自動更新] をクリックします。数分後、グラフにデータベースのブロック読み取りとヒットデータが表示されます。

これで、複数の Kubernetes クラスタで実行されているアプリから Monitoring に Prometheus 指標が提供されます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

プロジェクトの削除

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

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

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

次のステップ