share facebook facebook facebook twitter twitter menu hatena pocket slack

2021.07.19 MON

Compute Logging and Monitoring でメトリクスを取れるようにしてみました

Shimpei Chiba

WRITTEN BY Shimpei Chiba

Google Cloudには、Compute Engine、Kubernetes、CloudRunなどのコンピューティング関連のリソースが多数あります。
ここでは、ロギングエージェントとモニタリングエージェントをNginxサーバーを実行しているVMにインストールして、メトリックを簡単に表示できるようにします。
また、Kubernetesクラスターをセットアップし、デプロイされたアプリケーションを監視します。

全体の流れ

①VMとGKEクラスターをセットアップします。

②ComputeEngineのロギングおよびモニタリングエージェントをインストールして使用します。

③GKEクラスターにサービスを追加し、そのログとメトリックを調べます。

①VMとGKEクラスターをセットアップ

VMをセットアップする

コンソールの左上隅で、Compute Engineのリンクをクリック。

新しいVMインスタンスを作成します。
名前をweb-server-vmにし、[Allow HTTP Taffic]チェックボックスをオンにします。作成して、次のステップに進みます。

GKEクラスターを作成する

ロギングとモニタリングの方法でGoogleKubernetes Engineが提供する機能の一部を調べるために、デフォルトでロギングとモニタリングが有効になっているクラスタを追加しましょう。

[Navigation]メニューを使用して、[Kubernetes Engine] > [Cluster]ページに移動します。

[CREATE]を選択し、[Standard]ボタンをクリックします。

Nameをgke-clusterとし、その後、左側のFeaturesを選択します。

Enable Cloud Operations for GKEがオンになっていることと、ドロップボックスの選択肢が[System and Workload and monitoring]に設定されていることを確認してから、[CREATE]を押します。

クラスターの作成が開始されたら、次の手順に進みます。

Nginxをインストール

Compute Engineに戻り、web-server-vmにSSHで接続します。

APTを使用してNginxをインストールします。

$ sudo apt-get update
$ sudo apt-get install nginx

Nginxがインストールされ、実行されていることを確認します。

$ sudo nginx -v

Compute Engineに戻り、HTTPアクセスファイアウォールルールを有効にした場合は、外部IPをクリックできるはずです。
そうして、Nginxサーバーが稼働していることを確認します。URLをサーバーにコピーします。

CloudShellターミナルウィンドウに変更します。URL環境変数を作成し、サーバーへのURLと同じに設定します。

$ URL=URL_to_your_server_IP

bashwhileループを使用して、サーバーに負荷をかけます。Welcome to nginx応答が表示されていることを確認してください。

$ while true; do curl -s $URL | grep -oP "<title>.*</title>"; \
sleep .1s;done

②ComputeEngineのロギングおよびモニタリングエージェントをインストールして使用

ログを調べて、含まれていないデータを確認します

Googleの標準のDebianLinuxイメージには、ロギングエージェントまたはモニタリングエージェントがインストールされていないため、googleapis.com/nginx/からの次のようなメトリックにアクセスできません。

connections/accepted_count
connections/current
connections/handled_count
request_count

Googleコンソールウィンドウに切り替えて、Monitoring-Overviewに移動します。
監視ワークスペースが作成されるのを待ってから、メトリクスエクスプローラーに移動します。

Metrics explorerを設定します。

Resource type=VM Instance
メトリック=CPU Utilization
Filterにインスタンス名=web-server-vm

大きな負荷ではないため、負荷を適用したときにスパイクが表示されない場合がありますが、メトリックにはアクセスできます。

フィルタとメトリックを削除します。

metricボックスを選択し、nginxと入力し、Requestsを選択する。

しかし、データは表示されません。なぜかは以下で追っていきます。

ComputeEngineインスタンスにロギングエージェントとモニタリングエージェントをインストールします

ロギングエージェントとモニタリングエージェントがインストールされていない場合、Nginxのデータは取れません。
詳細を確認したい場合は、エージェントをインストールして有効にする必要があります。

[Navigation]メニューを使用して、[Compute Engine] > [VM Instance]に移動します。

web-server-vmのSSHリンクをクリックします

ロギングエージェントがインストール/実行されているかどうかを確認します。

$ sudo service google-fluentd status
$ sudo service stackdriver-agent status

当然のことながら、サービスは見つかりませんでした。ロギングとモニタリングを実行するために必要なスコープがあることを確認してください。

$ curl --silent --connect-timeout 1 -f -H "Metadata-Flavor: Google" \
http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/scopes

応答では、logging.writeとmonitoring.writeスコープに注意してください。

スクリプトをダウンロードし、監視エージェントリポジトリをaptに追加して、エージェントをインストールします。

$ curl -sSO https://dl.google.com/cloudagents/add-monitoring-agent-repo.sh
$ sudo bash add-monitoring-agent-repo.sh
$ sudo apt-get update
$ sudo apt-get install stackdriver-agent

監視エージェントを起動します。

$ sudo service stackdriver-agent start

ロギングエージェントをインストールします。

$ curl -sSO https://dl.google.com/cloudagents/install-logging-agent.sh
$ sudo bash install-logging-agent.sh

2つのエージェントを再度テストし、両方がアクティブであることを確認します。
「無限の値を取ることはできません」という警告が表示された場合は無視し、ステータスがアクティブ(実行中)の場合は、Crtl + cを押して次の手順に進みます。

$ sudo service google-fluentd status
$ sudo service stackdriver-agent status

サーバーを完全に統合するには、構成ファイルをNginx構成ディレクトリに追加して、Nginxでステータス情報ハンドラーを有効にします。

$ (cd /etc/nginx/conf.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/nginx/conf.d/status.conf)

Nginxサービスをリロードします。

$ sudo service nginx reload

Nginxモニタリングプラグインを有効にします。

$ (cd /opt/stackdriver/collectd/etc/collectd.d/ && sudo curl -O https://raw.githubusercontent.com/Stackdriver/stackdriver-agent-service-configs/master/etc/collectd.d/nginx.conf)

監視エージェントを再起動します。

$ sudo service stackdriver-agent restart
メトリックを再検討して、新しいデータを確認します

エージェントがインストールされ、Nginxプラグインが追加されたので、前に調べたNginxメトリックを再テストします。

Cloud Shellウィンドウをチェックして、テストループがまだ実行されていること、および応答を受信して??いることを確認します。

metric explorerへ移動します。

Resource typeをVMインスタンスに設定し、Select a metricボックスにnginxと入力して、[リクエスト]を選択します。

数分待ってページを更新する必要があるかもしれませんが、すぐにNginxからメトリックデータが届くはずです。
監視エージェントは正常に機能しています。

③GKEクラスターにサービスを追加し、そのログとメトリックを調べます

前半で、ロギングとモニタリングを有効にしてGKEクラスターを作成しました。
次に、HelloLoggingNodeJSアプリケーションをロードし、ロードバランサーサービスの背後に配置して、クラスターのいくつかのメトリックを表示します。

Cloud Shellコンソールに切り替えるか、再度開きます。CTRL + Cで実行中のテストループを解除します。

Cloud BuildAPIを有効にします。

https://github.com/haggman/HelloLoggingNodeJS.gitリポジトリのクローンを作成します。
$ gcloud services enable cloudbuild.googleapis.com 
$ git clone https://github.com/haggman/HelloLoggingNodeJS.git

このリポジトリには、テストに使用される基本的なNode.jsWebアプリケーションが含まれています。

$ cd HelloLoggingNodeJS
$ less index.js
$ less package.json

依存関係を含むことと、Dockerfileを生成してGKEにデプロイするんだなあということも確認してください。

DockerfileをGoogleのクラウドビルドに送信してコンテナを生成し、コンテナレジストリに保存します。

$ gcloud builds submit --tag gcr.io/$DEVSHELL_PROJECT_ID/hello-logging-js .
$ less k8sapp.yaml

k8sapp.yamlファイルを開き、Kubernetesへ3つのhello-loggingポッドを作成させ、LoadBalancerサービスを介してそれらを公開することをを内容から確認してください。

$ vi k8sapp.yaml

k8sapp.yamlの中の、$GCLOUD_PROJECTを実際のプロジェクトIDと入れ替えてください。

ナビゲーションメニューを使用して、KubernetesEngineに移動します。
クラスタのトリプルドットアイコンをクリックして、[Connect]を選択します。kubectl~というコマンドラインをコピーして構成します。

Cloud Shellに戻り、コマンドを実行します。

kubectlk8sapp.yamlを使用します。

$ kubectl apply -f k8sapp.yaml

サービスのリストを取得します。
hello-logging-serviceが表示され、外部IPを取得するまでに1?2分かかる場合があります。

$ kubectl get services

サービスが外部IPとともに表示されたら、外部IP値をコピーします。

ブラウザでタブを開き、IPを貼り付けます。Hello Worldメッセージが表示されていることを確認してください。

ブラウザからページのURLをコピーし、CloudShellに切り替えます。
URL環境変数を更新し、whileループを再開します。Hello World応答が表示されていることを確認してください。

$ URL=url_to_k8s_app
$ while true; do curl -s $URL -w "\n"; sleep .1s;done

Monitoring-Dashboadsへ移動し、GKEのダッシュボードを表示します。

上のGKEダッシュボードのためのGKE-クラスタの水平スクロールやチャートを参照してください。
すべての小さなグラフがデータなしを読み取っている場合は、CPUとメモリ使用率の読み取り値が表示されるまでページを更新します。データの自動更新を有効にするには、オフからオンに切り替えることもできます。

さまざまなクラスターノードを調べる場合は、[Node]タブを水平方向にスクロールして、3つのhello-logging-js-deploymentsがノード全体に分散していることを確認できます。このタブは、クラスターからノード、ポッドまで、どこで実行されているかに焦点を当てています。

[Workload]タブに切り替えます。これは、名前空間ごとにグループ化された、デプロイされたワークロードに焦点を当てています。

最後に、[ Kubernetes service]タブまでスクロールして、hello-logging-serviceを展開します。
このビューは、サービスがポッドにどのように関連しているかについての詳細です。

いずれのビューでも、hello-logging-js-containersのいずれかに行くと、右側のウィンドウに詳細が表示されます。
インシデント、メトリクス、およびログを調査します。

元記事はこちら

https://qiita.com/namely_/items/f97ba73749941d5636ea

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。