こんにちは!技術担当の鳥飼です。
突然ですが、OpenShift環境の監視、皆さんはどのように行っていますか? ログ監視、メトリクス監視、トレース監視… 様々な手法がありますね。 「これからコンテナワークロードの利用を検討しているけれど、ベアメタルや仮想マシンよりも複雑なコンテナ環境の監視は大変そう…」と不安を感じている方もいらっしゃるかもしれません。
そこでこの連載では、OpenShift環境における監視について、特にメトリクス監視に焦点を当ててご紹介していきます。OpenShiftにはデフォルトで強力な監視機能が組み込まれていますが、今回は特定のアプリケーションやサービス向けに、PrometheusとGrafanaを用いた独自のメトリクス監視環境を構築する手順を実際に試してみましょう。
【メトリクス監視とは?】
近年、"オブザーバビリティ"という言葉をよく耳にするようになりました。 オブザーバビリティとは日本語で"可観測性"と訳され、システムの状態を外部からどれだけ推測・把握できるかの度合いを指します。トラブルシューティングや性能改善のために、システム内部で何が起きているかを深く理解するために非常に重要な概念です。
オブザーバビリティは主に「メトリクス」「トレース」「ログ」の3つの柱で構成されており、これらを統合して利用することで、システムの可観測性を高めることができます。
・メトリクス(Metrics): CPU使用率やメモリ使用量、リクエスト数、エラー率など、一定時間ごとに収集される数値データです。システムの健全性を定常的に監視し、異常の兆候を素早く検知するのに適しています。
・トレース(Traces): 単一のリクエストが複数のサービスをまたいで処理される過程を追跡するデータです。マイクロサービス間のボトルネック特定や、分散システムのパフォーマンス解析に役立ちます。
・ログ(Logs): アプリケーションやシステムが出力するイベントの記録です。トラブル発生時に、具体的なエラーメッセージや処理の流れを詳細に把握し、原因を特定するのに不可欠です。
【メトリクス監視のデファクトスタンダード】
メトリクス監視のデファクトスタンダードとして広く利用されているのが、Prometheusと呼ばれるオープンソースの監視システムです。Prometheusは、時系列データを効率的に収集・保存し、強力なクエリ言語(PromQL)を提供します。
OpenShiftでは、クラスター全体の監視のために、このPrometheusが標準で組み込まれて利用されています。
また、Prometheusで収集したメトリクスを分かりやすく可視化するために、Grafanaというダッシュボードツールが併せて利用されることが一般的です。Grafanaは様々なデータソースに対応しており、Prometheusもその一つです。
この連載では、以下のような概要図で示すように、アプリケーションのメトリクスを取得し、Grafanaで可視化する流れを扱います。
まずは、Prometheus OperatorとGrafana Operatorをインストールし、PrometheusサーバとGrafanaのインスタンスを作成するところから始めてみましょう。
【実施手順】
前提と注意点:
・本手順は、OpenShiftの標準監視とは別に、特定のアプリケーション用にPrometheusとGrafanaをデプロイするものです。クラスター全体の監視には影響しません。
・以下のコマンドはOpenShift CLI (oc) を使用します。
・本検証ではOpenShift Container Platform v4.16を用いました。
1. Prometheus OperatorとGrafana Operatorをインストールするプロジェクトを作成します。
特定のアプリケーションを監視するための分離された環境として、新しいプロジェクトを作成します。
```shell
$ oc new-project test-monitoring
```
2. 作成したプロジェクトにPrometheus Operatorをインストールします。
OpenShiftコンソールからOperatorHubにアクセスし、「Prometheus Operator」を検索してtest-monitoringプロジェクトにインストールします。または、YAMLを適用してインストールすることも可能です。
・OperatorHubからのインストール手順 :
1. OpenShiftコンソールにログインし、「OperatorHub」に移動します。
2. Prometheus Operator」を検索し、詳細画面を開きます。
3. 「インストール」ボタンをクリックし、test-monitoringプロジェクトを選択してインストールを実行します。
3. Prometheus Operatorのインストール後、Prometheusインスタンスを作成します。
Prometheus Operatorが提供するカスタムリソース(CR)であるPrometheusオブジェクトを作成します。これにより、PrometheusサーバのPodがデプロイされます。
・Prometheusインスタンス作成の手順 :
1. OpenShiftコンソールでtest-monitoringプロジェクトに切り替えます。
2. 「Operators」→「インストール済みOperator」に移動し、「Prometheus Operator」をクリックします。
3. 「Prometheus」タブを選択し、「Prometheusの作成」をクリックして、必要な設定(例:ストレージ容量など)を行い、インスタンスを作成します。
4. Prometheusが特定の対象を監視できるよう、必要なRoleとRoleBindingを作成します。
Prometheusは、ServiceMonitorやPodMonitorといったカスタムリソースを通じて監視対象を検出します。これらのリソースをPrometheusが読み取れるように、適切な権限を付与する必要があります。
注意: 以下のYAMLは一般的な例であり、OpenShiftのバージョンやOperatorのバージョンによっては調整が必要です。また、test-monitoringプロジェクト内で監視対象を検出するための権限に限定してください。
▼prometheus-role-for-monitor.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: prometheus-service-monitor
namespace: test-monitoring
rules:
- apiGroups: ["monitoring.coreos.com"] # ServiceMonitor, PodMonitorなどのAPIグループ
resources: ["servicemonitors", "podmonitors"]
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: prometheus-service-monitor-binding
namespace: test-monitoring
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: prometheus-service-monitor
subjects:
- kind: ServiceAccount
name: prometheus-k8s # Prometheus Operatorが作成するService Account名。
# 環境によって異なる場合があるので、実際の名前に合わせてください。
namespace: test-monitoring
```shell
$ oc apply -f prometheus-role-for-monitor.yaml
```
補足: 通常、Prometheus Operatorが作成するPrometheusインスタンスには、そのインスタンスが稼働するプロジェクト内でServiceMonitorやPodMonitorを発見するためのデフォルトのRoleが既に付与されています。この手順は、もし追加の権限が必要な場合や、より厳密にスコープを定義したい場合に考慮してください。
5. 1.のプロジェクトにGrafana Operatorをインストールします。
Prometheusと同様に、OperatorHubから「Grafana Operator」を検索し、test-monitoringプロジェクトにインストールします。
・OperatorHubからのインストール手順 :
1. OpenShiftコンソールにログインし、「OperatorHub」に移動します。
2. 「Grafana Operator」を検索し、詳細画面を開きます。
3.「インストール」ボタンをクリックし、test-monitoringプロジェクトを選択してインストールを実行します。
6. Grafana Operatorのインストール後、Grafanaインスタンスを作成します。
Grafana Operatorが提供するカスタムリソース(CR)であるGrafanaオブジェクトを作成します。これにより、GrafanaのPodがデプロイされます。
・Grafanaインスタンス作成の手順 (概要):
1. OpenShiftコンソールでtest-monitoringプロジェクトに切り替えます。
2. 「Operators」→「インストール済みOperator」に移動し、「Grafana Operator」をクリックします。
3. 「Grafana」タブを選択し、「Grafanaの作成」をクリックして、インスタンスを作成します。
7. GrafanaのService Accountの認証トークンを取得します。
```shell
$ oc create token prometheus-k8s -n test-monitoring
xxxxxxxyyyyyyyyy
```
8. Grafanaへのアクセスとログイン
GrafanaのPodが起動したら、OpenShiftコンソールからRouteを確認してアクセスします。 デフォルトのログイン情報は通常、Grafana Operatorによって自動生成されるシークレットに格納されています。
・デフォルトユーザー名とパスワードの取得方法(例):
1. Grafanaカスタムリソースのdescribeでログイン情報を確認します。
$ oc describe grafana -n test-monitoring
```
Spec:
Config:
Auth:
disable_login_form: false
Log:
Mode: console
Security:
admin_password: start
admin_user: root
```
2. oc get route grafana -n test-monitoring でGrafanaのURLを取得し、ブラウザでアクセスします。
3. a.で取得したユーザとパスワードでログインします。
9. Grafanaの設定でPrometheusのデータソースを作成します。
Grafanaにログイン後、以下の手順でPrometheusをデータソースとして追加します。
・データソース設定の手順(概要):
1.Grafanaのサイドメニューから「Connections」→「Data sources」を選択します。
2. 「Add new data source」をクリックし、「Prometheus」を選択します。
3. Name: Prometheus-test-monitoring など分かりやすい名前を入力。
4. Prometheus server URL: http://prometheus-k8s.test-monitoring.svc:9090 のように、test-monitoringプロジェクトにデプロイされたPrometheus ServiceのURLを指定します。 (正確なService名を確認するには $ oc get svc -n test-monitoring | grep prometheus を実行してください)
5. Auth:
・「With authentication」を有効にし、Auth ProviderでBearer Tokenを選択します。
・ Bearer Token欄に、手順7で取得したトークンの値を貼り付けます。
6. 「Save & Test」ボタンをクリックして接続をテストします。
有効なエンドポイントとトークンであれば、問題なく"Data source is working"と表示されるはずです。Saveに失敗する場合は、Prometheus Serviceのエンドポイントやトークン、またはPrometheus Podが正常に稼働しているかを確認してください。
次回は、Prometheusのスクレイピング設定(監視対象の追加方法)や、Grafanaのダッシュボードカスタマイズについて詳しく解説します!お楽しみに~!
担当者紹介
担当者:鳥飼
コメント
コンテナ、Kubernetes、クラウド領域の業務に従事しています。
保有資格
Certified Kubernetes Administrator