フォーム読み込み中
こんにちは、ソフトバンクの劉暁晨です。
本業として、Google WorkspaceとMicrosoft 365に関する技術全般をサポートすることですが、社内副業制度を利用して、社内副業制度を利用して、AI技術を教える教育サービスAxross Recipeの開発にも同時に携わっています。
Axross Recipeのサービス基盤はKubernetes上で構築されているため、監視システムとしてGoogle Cloudが提供するGoogle Cloud Managed Service for Prometheusの導入を検討しましたので、本記事ではこちらのサービスについての利用方法、考察などについてまとめてみたいと思います。
又、同じく弊社エンジニアによる、AWSが提供するAmazon Managed Service for Prometheusについての記事もありますので、こちらの記事Amazon Managed Service for Prometheusを使ってみたも一緒にお読みいただくと、この2種類のマネージドPrometheusサービスを比較することができると思います。
Kubernetesを利用する際に、実質的にスタンダードになったOSS監視ツールPrometheusです。特徴としては:
「PromQL」という、フレキシブルなクエリー言語
などが挙げられます。
アーキテクチャ的に、Prometheusは集権的なシステムではなく、複数のコンポーネントに分けられてお互い通信しながら機能するシステムとなっているため、自然的にKubernetesのようなMicro Service前提の環境との相性がいいです。
Prometheusを構成する重要なコンポーネントとして、以下が挙げられます:
Prometheus server: 全ての監視データを収集、処理する中枢部です。
Alertmanager:メール、Slackなどに自動的にアラートを送信するコンポーネントです。
UI:監視データを可視化するためのダッシュボードサービス。この部分は本家のPrometheus UIより、3rd-partyのGrafanaの方が有名です。
Google Cloud Managed Service for Prometheus (以下GMPと略称)とは、Google Cloudが提供するPrometheusのマネージドサービスです。特徴としては、前述のPrometheusを構成する一部コンポーネントを、GCPの一部インフラに変えられたり、カスタマイズされた特殊バージョンを提供されたりして、運用負荷を下げられた形式でPrometheusを利用することができるようになります。
具体的、以下の2つのコンポーネントに変更がありました:
Prometheusの本番運用上、特に大規模なサービス監視で、一番悩みの種となるのはPrometheus serverの部分と言われています。例えば、大量のMetricsデータをストレージに書き読みする際によく発生する性能低下と故障、監視対象の多さによりサーバ処理能力の不足などが挙げられます。
GMPのアプローチは、Prometheus serverの部分を、Google自身のあらゆるサービスを支えている地球規模のモニタリングインフラMonarchに変えました。
この変更によりもたらしたメリットとしては:
ストレージ、サーバ処理能力の心配から完全に解放されます。
Cloud Monitoringで提供されたGCPインフラに関するMetricsを、設定なしでPrometheusで利用できます。
UIコンポーネントを用意しなくても、Cloud MonitoringでPromQLを使ってダッシュボードを作成できます。
必要であれば、Cloud Monitoring本来の機能、例えばMonitoring Query Language(MQL)とアラート設定なども使えます。
GMPを利用する際に、GKEクラスタ上マネージド Alertmanagerが自動的にデプロイされます。
マネージド Alertmanagerの特徴として、SlackのAPIトークンなどが書かれているAlermanagerの設定ファイルを、平文ではなく、Kubernetes Secret形式で利用するところです。若干安全性が向上するかもしれません。
注意点として、マネージド Alertmanagerは筆者が本文を作成する時点で、pre-GA状態になります(安定版ではありません)。また、従来通りに自分でPreometheus Alertmanagerをデプロイすることも可能です。
それでは、簡単にデータ収集からGrafana上でMetrics可視化、アラートルール作成まで、大まかな流れを簡単に説明したいと思います。
デプロイの前提として、GKE上でクラスタが事前に作成されていたことです。
また、今回の手順では、アプリからMetricsを取ることではなく、設定なしでも本来GCPが裏で常に取っているCloud MonitoringのMetricsをGMPで参照することを目標として設定します。
gcloud CLIのインストール、またはCloud Shellを利用する
gcloudのプロジェクトを設定(project1という名前のgcpプロジェクトを利用していると仮定):
gcloud config set project project1
GKEクラスタへの接続情報を取得:(asia-northeast1-a上、cluster1というクラスタが存在すると仮定)
gcloud container clusters get-credentials cluster1 --zone asia-northeast1-a
Kubectlのコンテキスト(接続情報)を見る:
kubectl config get-contexts
すると、接続可能なクラスタ情報一覧が表示されます。複数のKubernetesクラスタを扱う場合、複数の項目が見えます。
正しいクラスタを指定:(get-contextsで見えた利用したい接続先の名前はgke_project1_asia-northeast1-a_cluster1と仮定)
kubectl config set-context gke_project1_asia-northeast1-a_cluster1
このステップには2種類の方法があります。
従来、Kubernetes上のprometheusを構築するには、kube-prometheusなどprometheus-operatorベースのソリューションを使うことが一般的だと思いますが、既存のソリューションをほぼそのままGMPに移行することが可能です。しかしこの方法ではコンポーネントのマネジメントが必要となります。
今回は、もう1つの方法で、ゼロから完全マネージドなデータ収集コンポーネントのデプロイ手順を紹介します。
デプロイ自体は非常に簡単です。コマンド1行だけです。
gcloud container clusters update cluster1 --enable-managed-prometheus --zone asia-northeast1
次は、後ほどGrafanaなどをデプロイするためのnamespaceを作成します。(名前はmonitoringと仮定)
kubectl create ns monitoring
GMPがCloud MonitoringからMetricsを取得できるための権限設定が必要です。以下のコマンドではgmp-test-saという名前のService accountを作成し、kubernetesクラスタ上のmonitoringというnamespaceのデフォルトService accountとして設定されます。
gcloud config set project project1 \
&&
gcloud iam service-accounts create gmp-test-sa \
&&
gcloud iam service-accounts add-iam-policy-binding \
--role roles/iam.workloadIdentityUser \
--member "serviceAccount:project1.svc.id.goog[monitoring/default]" \
gmp-test-sa@project1.iam.gserviceaccount.com \
&&
kubectl annotate serviceaccount \
--namespace monitoring \
default \
iam.gke.io/gcp-service-account=gmp-test-sa@project1.iam.gserviceaccount.com
以後、このNamespaceで作成されたリソースは、デフォルトでこのgmp-test-saアカウントを利用することになる。
次に、gmp-test-saにモニタリング用の権限を付与します。
gcloud projects add-iam-policy-binding project1 \
--member=serviceAccount:gmp-test-sa@project1.iam.gserviceaccount.com \
--role=roles/monitoring.viewer
本番環境では、monitoring.viewerより絞られた権限の付与をお勧めします。
GKEのセキュリティ仕様上、Grafanaは直接GMPをデータソースに追加することができません。そのため、GMPとGrafanaの仲介役として、まずPrometheus UIを先にデプロイすることが必要です。
Googleが用意したYAMLファイルで簡単にデプロイできる。
curl https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.5.0/examples/frontend.yaml |
sed 's/\$PROJECT_ID/project1/' |
kubectl apply -n monitoring -f -
こちらも簡単にテスト用Grafanaをデプロイすることができる
kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.5.0/examples/grafana.yaml
本番環境であれば、Ingressなどを作ってServiceを公開する必要があると思いますが、今回はテスト目的のため、Port forwardを使って一時的にGrafanaのサイトを自分の端末上に転送することで利用できます。
kubectl -n monitoring port-forward svc/grafana 3000
これで自分の端末上のブラウザでhttp://localhost:3000からGrafanaを見えます。ちなみに初期usernameとpassword両方どちらでもadminです。
具体的な手順は、こちらの公式ドキュメントを参照してください。
1つだけ注意点として、データソースを追加する際に使うURLです。もし上記の手順を踏まえてGrafanaをデプロイした場合、URLは公式よりさらに短縮できます:
公式:http://frontend.monitoringi.svc:9090
短縮:http://frontend:9090
これは、GrafanaとPrometheus UIが同じnamespaceにデプロイされたため、URLのnamespaceの部分が省略できます。
以下のテストPromQLを使って、Cloud MonitoringからMetricsを取得できるかどうかをためします(GKS上NodeのCPU利用率を調べるクエリー):
rate(kubernetes_io:node_cpu_core_usage_time[1m]) * 100
もし全ての設定が正しければ、以下のようなグラフが見えるはず。
注意点としては、公式ドキュメント上記載されたのテスト用Query:
sum without(instance) (up)
は、結果を返せないはずです。これは本記事ではテスト用の監視対象Podのデプロイ手順をスキップしたためです。本記事の目的はあくまでCloud Monitoring上のデータを可視化することなので、Kubernetes上の監視については今回割愛させていただきます。
テストが成功したら、次は自分好みでダッシュボードを作成できます。
PromQLを使って、全てのCloud Monitoring Metricsを取得できますが、Metricsの名前をPromQL用に名前の変換が必要です。変換ルールはこちらの公式ドキュメントを参考にしてください。
変換が必要とはいえ、PromeQLを入力時は変換後の名前を自動補完してくれますので、心配する必要がありません。
また、全て利用可能なCloud Monitoring指標(Metrics)をまとめた公式ドキュメントはこちらになります。Kubernetes指標、Google Cloud指標辺りは一番利用頻度が高いと思います。
筆者が以下の簡単なダッシュボードを作成しました:
使用したPromeQLは:
ノードごとのCPU利用率:rate(kubernetes_io:node_cpu_core_usage_time[1m]) * 100
ノードごとのメモリ利用率:kubernetes_io:node_memory_allocatable_utilization{memory_type=\"non-evictable\"} * 100
上位5個CPU利用率が高いPod:topk(5, rate(kubernetes_io:container_cpu_core_usage_time[1m]) * 100)
上位5個メモリ利用率が高いPod:topk(5, kubernetes_io:container_memory_used_bytes / 1024 /1024)
PromeQLに詳しくない方は、公式ドキュメントを参照するか、紹介記事を検索してください。
ルール・アラートの定義は、Googleが定義したKubernetesリソースを使って設定します。
Rules、ClusterRules、GlobalRules、3種類が存在します。違いは名前の通り、適用範囲による違いなどがあります。
RulesとClusterRulesではCloud MonitoringのMetricsを参照できないため、今回はGlobalRulesを使ってルール・アラートを設定します。
例えば、以下のようなYAMLファイルを作成してください:
apiVersion: monitoring.googleapis.com/v1
kind: GlobalRules
metadata:
name: global-rules
spec:
groups:
- name: test-alert
interval: 30s
rules:
- alert: NodeHighCpuUsage
expr: rate(kubernetes_io:node_cpu_core_usage_time[1m]) > 1.5
for: 5m
labels:
severity: critical
annotations:
summary: Node {{ $labels.node_name }} has a cpu usage higher than 150%.
- alert: TestAlwaysFiringAlert
expr: vector(1)
この設定ファイルで2つのアラートを設定しました。
NodeのCPU利用率が150%以上になる場合、criticalレベルのアラートを発報する。
テスト用のアラートを常時発報する。
以上のように、Kubernetesのリソースとは言え、spec:以下の内容は、本来のprometheusのルール・アラート設定と全く同じであるため、既存のprometheusルールの移行も容易になります。作成されたYAMLファイルをkuberctl apply -fコマンドで適用することで、ルール設定が反映されます。
アラートを作成するだけでは、まだ実際にアラートをSlack通知などに出すことができません。本来では、Prometheus Alertmanagerを構築する必要がありますが、今回はGMPが提供するマネージドAlertmanagerを利用します。
マネージドAlertmanagerを利用するため、従来通りのPrometheus Alertmanagerの設定ファイルを用意し、特定の名前のkubernetes secretとして登録する必要があります。
まずは、alertmanager.yamlという名前のファイルを作成してください(ファイル名を変更しないでください):
global:
slack_api_url: '<slack_webhook_url>' # SlackのWebhook
route:
receiver: "fall-back-receiver"
group_by: [alertname]
routes:
- receiver: "slack-notifications"
matchers:
- severity="critical"
receivers:
- name: "slack-notifications"
slack_configs:
- channel: '#alert' # アラート用Slackチャンネル名
- name: "fall-back-receiver"
以上の例の設定ファイルでは、criticalレベルのアラートをSlackチャンネルに送信する設定となります。Slackへ送信に必要なWebhook URLの作成方法についてはこちらのドキュメントを参考にしてください。
Slackに送信される前に、AlertはまずマネジメントAlertmanagerに集約され、Group化、Silences設定などによって送信するかを判断するステップがありますが、残念ながらGMPの公式ドキュメントではマネジメントAlertmanagerのUIを参照する方法についての記述がありません。
しかし、GKE環境を軽く調査したところ、GKE上gmp-systemというnamespaceに自動デプロイされたAlertmanagerを見つけました。よって、以下のPort ForwardコマンドでAlertmanagerのUIを見ることができます:
kubectl -n gmp-system port-forward svc/alertmanager 9093
すると、ブラウザでhttp://localhost:9093を訪問するとAlertmanagerのWeb UIが見えるはず:
このUIを通して、発報中のアラート一覧、Silencesの設定などが便利にできると思います。
今回はGoogle Cloud Managed Service for Prometheus(GMP)について紹介しました。一番の特徴としては、やはりGoogle自身が利用する地球規模の監視インフラを使っているところの安心感と、設定なしでCloud Monitor上のMetricsを利用できるところです。
利用したことがありませんが、同じく弊社のエンジニアによるAmazon Managed Service for Prometheus(AMP)の紹介を拝読したところ、GMPの方はAMPと比べ、より高度の機能を提供している一方、設定面は独自のカストマイズが必要となるところが多いという印象がありました。
また、今回は簡略化のため、同じプロジェクトのGKEで、Cloud MonitorのMetricsの利用のみ、シナリオを絞って書きましたが、GMPは任意のKubernetesのクラスタからの接続、Exporter、App自身によるMetricsの利用もサポートしています。
Prometheusの運用負荷に課題を感じている方、是非一度GMPの利用を検討することをお勧めします。
条件に該当するページがございません