OpenShiftを使い始める
金融系システムをコンテナアプリケーションサービス化する検証プロジェ
クトに
OpenShift管理チームのメンバーとして参加させていただきました(2018
年~)
開発速度の向上や、開発/運用の低コスト化 etc
OpenShift(ver3.11)
開発機能
CI/CD
テンプレート
自動ビルド
監視機能
ログ集約(EFK)
ステータス監視
分散トレーシン
グ
ミドルウェア
DB仮想化
メッセージング機
能
ルールエンジン
コンテナアプリケーションサービス
システム管
理
OpenShiftチーム
管理範囲
OpenShiftについて、わからないことばかり
何を調べたら良いかもわからない状況から、
コンテナ監視にたどり着くまで沢山の壁がありました
1st OpenShiftのしくみがわからな
い
2nd Prometheusの機能がわからな
い
3rd なにを監視したらいいの?
4th 設定カスタマイズができない
OpenShiftについて知る
RedHat社が提供するコンテナオーケストレーションツール
Kubernetesをベースに使用していて、機能に互換性あり
PaaS機能
CI/CD機能
Kubernetesとの
互換性
管理コンソール
Open Hybrid
Cloud
対応インストーラ
エンタープライズ
サポート
③サポート①使いやすさ
②コンテナ
開発/運用機能
1st OpenShiftのしくみがわからな
い
[root@ip-172-31-43-203 ~]# oc apply -f test.yaml
deploymentconfig.apps.openshift.io/frontend created
[root@ip-172-31-43-203 ~]# oc get po -w
NAME READY STATUS RESTARTS AGE
frontend-2-5kldg 0/1 ContainerCreating 0 21s
frontend-2-deploy 1/1 Running 0 31s
frontend-2-n2zrx 0/1 ContainerCreating 0 21s
frontend-2-5kldg 1/1 Running 0 64s
frontend-2-n2zrx 1/1 Running 0 64s
frontend-2-deploy 0/1 Completed 0 75s
Manifest
test.yaml
OpenShiftがなんだかよくわからないまま、コンテナのYAMLファイルをつくってコマンド
実行したら
コンテナが増えて、STATUSは「Running」だし何だかすごい!!
でもひとたびエラーが起こると、何をしたらいいのか全くわかりません
コントローラスケジューラ
ぜんぶ
おまじないの
世界
Cluster
KubernetesやOpenShiftのしくみを学びつつ、コンテナを動かし続け…
沢山のエラーと出会いました
WorkerノードMasterノード
コントローラスケジューラ
CLI /
API Internet
Podが
動かない!!
Manifest
Nodeの
ステータス異常?
API実行
エラー? リソース不足?
ヘルスチェックの
失敗?
OpenShiftで問題があったらすぐ知りた
い
何が原因か調査、対処したい
スケジューラの
エラー?
openshift-monitoring
OpenShiftのステータス監視
OpenShiftでは、PromethuesやGrafanaなどの監視機能をもつコンテナによっ
て
クラスタや個々のオブジェクトの状態、リソースの使用状況などを確認します
メトリクス収集 アラート設定 ダッシュボード
(例)Podステータスの
メトリクスを収集
Podの異常を
管理者へ通知 監視データをグラフで可視
化
OpenShiftの状態を確認
kube-state-metrics
Pod
OpenShift4以降は、デフォルトで「openshift-monitoring」が導入されます
Webコンソールからコンポーネントのステータスやリソースの確認もできるよ
うに!
まずはPrometheusWebコンソール画面へ…
この画面から
何したらいいです
か??
PrometheusやGrafanaには、クラスタ監視のためのデフォルト設定が入っていま
すが
初見では全く理解できませんでした
そこで、公式ドキュメントや技術書を頼りに、ツールの機能や設定内容の理解を
深めました
2nd Prometheusの機能がわからな
い
Promethuesとは
CNCFプロジェクトに含まれるオープンソースの監視ツール
プラグインによってKubernetesのリソースを
ダイナミックに監視できます
主な機能
• メトリクス収集(ServiceDiscovery)
どのコンポーネントからどんなメトリクスを
収集するかを設定します
• ルール設定
クエリ(PromQL)を使用して、アラートルールやレコードを設定します
• アラート設定
アラートルールの閾値を超えた際に、アラート通知方法やタイミングを設
定します
Prometheusの監視対象
OpenShiftでは、Exporterと呼ばれるメトリクスを配信するためのコンテナや、
Prometheusメトリクス対応のコンテナからデータを取得します
Any Project
openshift-monitoring
node-exporter
Pod
kube-state-metrics
Pod
Promethues Pod
kubelet
Pod
default router
Pod
api-server
Pod ・・・
対象コンポーネントから
メトリクスをPULL
メトリクス収集設定
(ServiceDiscovery)
kubernetes_sd_configs
metric_relabel_configs
relabel_configs
メトリクス収集設定
Prometheus設定ファイルの「scrape_config」にアクセス先を設定します
「kubernetes_sd_configs」を使用すると、IPアドレスを指定しなくても
OpenShiftの
オブジェクトを特定してアクセス先に設定することができますscrape_configs:
- job_name: openshift-monitoring/node-exporter/0
scrape_interval: 30s
scrape_timeout: 10s
metrics_path: /metrics
scheme: https
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- openshift-monitoring
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
tls_config:
ca_file: /etc/prometheus/configmaps/serving-certs-ca-bundle/service-ca.crt
~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~
30秒おきにメトリクスを収集
node-exporterのエンドポイントへアクセスするための証明書設
定
「openshift-monitoring」プロジェクトに定義されている
エンドポイントをターゲットにする
Prometheusメトリクスの特徴
メトリクスには複数のラベルが付与されていて、そのメトリクスの値が何をあ
らわすのか
ラベルによってより詳細に特定することができます
node-exporter
Pod
node_cpu_seconds_total{cpu="0",mode="idle"} 15848.23
Promethues
Pod
node_cpu_seconds_total{cpu=“0”,endpoint=“https”,instance=“10.0.128.16
3:9100”,job=“node-exporter”,mode=“idle”,namespace=“openshift-
monitoring”,pod=“node-exporter-b5sf5”,service=“node-exporter”}
15848.23
kubernetes_sd_configsで、Kubernetesの構成情報メタデータのラベルも追加
PrivateIP「10.0.128.163」ノードの、1つ目のCPUの、idleの値
↓
15848.23
メトリクスのラベル設定
「relabel_configs」では、ターゲットからメトリクスを取得する前に、ターゲッ
トに関する
ラベル設定を操作して、取得対象を変更したり、絞り込んだりすることができる
scrape_configs:
- job_name: openshift-monitoring/node-exporter/0
~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_k8s_app]
separator: ;
regex: node-exporter
replacement: $1
action: keep
- source_labels: [__meta_kubernetes_endpoint_port_name]
separator: ;
regex: https
replacement: $1
action: keep
~~~~~~~~~~~~~~~~~~~~~~~省略~~~~~~~~~~~~~~~~~~~~~~~~~~~~
サービス名をあらわすラベルが「node-exporter」である
メトリクスだけを取得する
サービスのエンドポイント名が「https」であるメトリクス
だけを取得する
kubernetes_sd_configs
metric_relabel_configs
relabel_configs
「openshift-monitoring」プロジェクトのエンドポイント
サービス名のラベルが「node-exporter」
サービスのエンドポイント名のラベルが「https」
scrape-configによるターゲットの変更
35つのエンドポイントがHit(Discovered)
2つのエンドポイントがHit(Targets)
「metrics_relabel_configs」では、ターゲットから取得するメトリクスを調整
不要なメトリクスを破棄すれば、リソースの負荷を軽減することも可能です
2つのエンドポイントをscrapeのターゲットとします
scrape-configを設定した結果を確認
ServiceDiscoveryは
「kubernetes_sd_configs」やラベル設定を踏まえ
て
最終的に対象としているアクセス先のラベルを表示
対象にアクセスできているか確認
Targetsは
ServiceDiscoveryのアクセス先からの
メトリクスを取得状況を表示
メトリクスが取得できない場合、認証エラーやネット
ワークエラーなどのメッセージが「Error」に表示さ
れます
Prometheusのデータ参照
Prometheusメトリクスのラベルをベースとしたクエリ(PromQL)を実行して、
監視対象のデータを参照します
PromQLは、Operator(算術、比較、論理、集計などの演算子)を使ってデータの計
算を行うこともできます
“Instance”ラベルごとに
CPU使用率を表示するクエリ
Prometheus レコードルール設定
設定ファイルの「roules」に、 PromQLを指定してアラートルールや
レコードを設定します
クエリをレコードとして定義すると、そのクエリの計算結果を「レコード名」
から参照できるようになります
複雑な計算も、レコードを組み合わせるこ
とで
シンプルなクエリで表現できる
アラート設定
ルール設定
アラートルー
ル
ルール設定
レコードルール
rules(PromQL)
ダッシュボー
ド設定
PromQL
PrometheusデータとPromQL
メトリクス収集設定
(ServiceDiscovery)
kubernetes_sd_configs
metric_relabel_configs
relabel_configs
Prometheus アラートルール設定
比較演算を使用したPromQLで、監視対象の状態を判断するルールを設定し、
クエリの計算結果に基いてアラートを発砲します
条件に合致する場合
アラート状態(status FIRING)となる
Prometheus アラート設定
ルールのステータスが変化した場合、Alertmanagerによってアラートを通知します
Alertmanagerは、通知方法や通知間隔、再通知、通知抑制、回復通知などの設定を
アラートルールのグループごとに設定することができます
Promethues Pod
Alertmanager
Fluentd
Pod
整形後
Text
別システムの
監視基盤へ
アラートログを連
携
Webhook
Json形式の
アラートログ
アラートの出力フォーマットはPrometheus
では変更できないため、スクリプトで整形
Grafanaとは
CNCFプロジェクトに含まれるオープンソースのデータ可視化ツール
Prometheusをデータソースとして設定し、PromQLを使用した柔軟なデータ操
作を
行うことができます。
主な機能
• ダッシュボード作成(線グラフ、棒グラフ、円グラフ、メーター、表など)
• CSVデータ取得
Grafanaはパネルごとに取得する必要があるため、ダッシュボード全体のデータ取得には手間がかか
ります
メトリクスデータの抽出を行う場合は、PrometheusAPIを使っていました
• ダッシュボード設定のインポート/エクスポート
Configmapで作成したダッシュボード設定はWebUIから変更不可のため
設定変更の際には、WebUIでコピー&変更したダッシュボードのJsonをエクスポートして毎回
Configmap化
Grafanaダッシュボードごとにフィルタリング設定
ダッシュボードには、データソースから取得できる特定のラベルの値を「Pull
Down」や「チェックリスト」として表示し、その値をダッシュボードのフィル
ターとして使用することができます
Pull Down
Grafanaダッシュボードの失敗…
1. Javaアプリケーションコンテナのダッシュボードを作りたい!
2. ラベルの値を「Pull Down」や「チェックリスト」として表示する機能を追加
しよう!
3. 「Pod」ラベルのリストを作りたいけど、Java以外のPod名もたくさん表示さ
れる…
4. PrometheusのJava用のScrape設定に「java_pod 」ラベルを追加
5. フィルタリングに合わせて、ダッシュボード内全パネルのPromQLに
「java_pod」追加
6. こんなことしなくても、「regex」と「query: query_result()」をくみあわせ
て、JavaPodだけ表示する「Pull Down」や「チェックリスト」を作れる
scrape-config設定
Javaのジョブ:java_podラベルあり
kube-state-metricsのジョブ:java_podラベルなし
ダッシュボード機能の理解不足
ダッシュボード設定
PromQL「java_pod」でフィルタリング
「java_pod」ラベルのないメトリクスがダッ
シュボード内に混在するとPromQLの設定が
複雑に…
ラベル設定の考慮不足
3rd なにを監視したらいいの?
「openshift-monitoring」のデフォルト設定を確認
• メトリクス収集
• アラートルール設定
• ダッシュボード設定
基本構成のProject以外は
監視対象外の設定もあり
OpenShiftのCluster管理コンポーネントを
監視するための基本的な設定
アプリケーションコンテナ
や
ユーザが導入したM/Wなど
も監視したい
障害切り分けに必要な情報の整理
OpenShiftで何か問題が起こったときに、何によって気が付くことができるか
何を調べたら原因を特定することができるのか、想定されるパターンを整理す
る
(例)APPコンテナのネットワーク接続エラー時に確認すること 対象 確認方法
接続先の情報は正しいか アプリ Git
コネクションプールが枯渇していないか コンテナ Prometheus
networkpolicyの設定は正しいか OpenShift JenkinsJob
ネットワークにドロップ/エラーが発生していないか コンテナ Prometheus
ipfailoverPODやルータPODは正常に稼働しているか(接続が
ルータ経由である場合)
OpenShift Prometheus
ネットワークインターフェースが正常に稼働しているか ノード JenkinsJob
コンテナ標準エラー出力確認 コンテナ Elasticsearch
【コンテナステータス監視】
• Project:
openshift-.*、kube-.*、default、logging
【クラスタリソース監視】
• ノード
リソース:
CPU,メモリ,ディスク,ネットワーク,etc
• コンテナ
リソース:
CPU,メモリ,PV
Project:
openshift-.*、kube-.*、default、logging
【コンポーネントごとのメトリクス監視】
• api-serverコンテナ
• etcdコンテナ
• メトリクス対応オペレータコンテナ
• default-router
• default-dns
などなど
【コンテナステータス監視】
• Project:
ユーザが追加したProject
【クラスタリソース監視】
• コンテナ
リソース:
CPU,メモリ,ネットワーク,ディスク,PV
対象Project:
ユーザが追加したProject
【コンポーネントごとのメトリクス監視】
(ユーザが追加したコンポーネント例)
• Javaアプリケーションコンテナ
• Istio
• AMQStreams
などなど
デフォルト監視項目 追加したい監視項目
管理系コンテナの
エラー検知
ノードのリソース
使用状況
管理系コンテナの
リソース使用状況
APIサーバやetcd
のエラー
【コンテナステータス監視】
• Project:
openshift-.*、kube-.*、default、logging
【クラスタリソース監視】
• ノード
リソース:
CPU,メモリ,ディスク,ネットワーク,etc
• コンテナ
リソース:
CPU,メモリ,PV
Project:
openshift-.*、kube-.*、default、logging
【コンポーネントごとのメトリクス監視】
• api-serverコンテナ
• etcdコンテナ
• メトリクス対応オペレータコンテナ
• default-router
• default-dns
などなど
デフォルト監視項目
などなど
PromQLやアラート通知、ダッシュボードで
確認可能
【コンテナステータス監視】
• Project:
ユーザが追加したProject
【クラスタリソース監視】
• コンテナ
リソース:
CPU,メモリ,ネットワーク,ディスク,PV
対象Project:
ユーザが追加したProject
【ノード死活監視】
• ICMP(ping)
【コンポーネントごとのメトリクス監視】
(ユーザが追加したコンポーネント例)
• Javaアプリケーションコンテナ
• Istio
• AMQStreams
などなど
追加したい監視項目
PrometheusやGrafanaの設定変更
「openshift-monitoring」に監視したい設定を追加しようとしたら、
できませんでした
※ドキュメント確認不足
openshift-monitoring
Promethues
コンテナ
PromethuesOperator
コンテナ
cluster-monitoring Operator
Pod
4th 設定カスタマイズができない
GrafanaPod
「openshift-monitoring」で変更できないこと
監視設定のサポート(OpenShift公式ドキュメントを参照)
変更できること
• アラート設定
変更できない
• メトリクス(ServiceDiscovery)設定
• ルール設定
• ダッシュボード設定
許可されない設定変更は、
Operatorによって元に戻されてしまいます
構成管理
監視設定の変更対応
OpenShift3.11の環境では、インストーラではなく手動でPrometheusや
Grafana、
Exproterなどの監視コンポーネントをデプロイしました(サポート対象外)
メトリクス(ServiceDiscovery)設定
ノード死活監視やコンポーネントごとの
メトリクス監視のためのscrape設定を
追加
ルール設定
重要なコンポーネントのエラーや
リソース不足などのアラートルールを
追加
ダッシュボード設定
アプリケーションコンテナごとの
ダッシュボードを追加
custom-openshift-monitoring
Promethues
Pod
PromethuesOperator
Pod
GrafanaPod
node-exporter
Pod
kube-state-metrics
Pod
black-box-exporter
Pod
AMQStreamsコンテナの監視設定例
jmx-exporterを使用して、KafkaブローカやZookeeperなどの状態を監視しま
す
• AMQStreamsのカスタムリソースにて、メトリクスを有効化
• AMQStreams設定のサンプルを参考に、ブローカ間の冗長化(データ同期)
状況や、レプリカ不足など、ストリーミング機能提供に大きく影響するス
テータス監視をアラート設定に追加
Kafkaブローカ
Pod
CR設定
(exporter設定)
jmx-exporter
Promethues
Pod
GrafanaPod
Zookeeper
Pod
jmx-exporter
strimzi Operator
アラート設定追加
• コンテナclushloopback
• コンテナステータス
NotRady
• ブローカレプリカ不足
• アクティブコントローラ
数
• ISR以下パーティション
数
• Zookeeperリクエスト数
• Zookeeper応答時間
etc...
ダッシュボード設定追加
• コンテナリソース使用率
• Java Heap使用率
• ブローカレプリカ不足
• アクティブコントローラ
数
• トピック送受信レート
• ISR以下パーティション
数
• Zookeeperリクエスト数
• Zookeeper応答時間
etc...
Javaアプリケーションコンテナの監視設定例
jmx-exporterを使用して、Javaアプリケーションの状態を監視します
• パフォーマンスやステータス確認が無効化されている場合、 Java実行環
境設定(XMLなど)を変更して、データ取得を有効化
• コンテナのベースイメージにjmx-exporterが対応していない場合、
Exporterをコンテナイメージへ追加
• アプリケーションのパフォーマンス監視のため、JVMのHeapやスレッド
プールの使用状況をダッシュボードへ追加
Java AppPod
XML設定
(poststartで適用)
jmx-exporter
Promethues
Pod
GrafanaPod
アラート設定追加
• コンテナclushloopback
• コンテナステータス
NotRady
• JVM Heap使用率
etc...
ダッシュボード設定追加
• コンテナリソース使用率
• JVM Heap使用率
• スレッド使用状況
• コネクションプール
etc...
OpenShift cluster-monitoringのポイント
OpenShiftやアプリケーションコンテナ監視の網羅性
障害発生時の対応や障害防止のために十分なデータを監視できるよう、
OpenShift運用状況から監視項目の再検討を繰り返し行います
PromethuesやGrafanaの設定は、複雑化しないように注意する
仕様をちゃんと理解せずに設定をおし進めると、PromQLが使いづらくなっ
たり
なんども設定エラーを出してはログ確認を繰り返したりと様々な問題が発生
しました
OpenShift4.3以降の監視設定拡張機能
「techPreviewUserWorkload/enabled」を有効化することによって、監視設
ご清聴くださり
ありがとうございまし
た!
より効率的にコンテナ監視を行えるよう
モニタリングツールについて幅広く勉強を
続けていきたいです
• Commons-London-OpenShift-Container-Platform-4.3-Roadmap.pdf
• OpenShift_Anwender_Keynote_OpenShift_What_is_New.pdf
• QueryingPromehtues

cluster-monitoringで困ったこと学んだこと

Editor's Notes

  • #2 本日は貴重なお時間をいただきありがとうございます。 株式会社IT-Oneの脇田と申します。 このような素敵なイベントでお話しさせていただくのは今日が初めてで大変緊張しております。 スピーカーとしてもOpenShift管理者としても至らない点が多く恐縮ですが あたかかくご清聴いただけましたら嬉しいです。 よろしくお願いいたします。
  • #3 はじめてOpenShiftをさわりはじめてから、コンテナ監視に取り組むなかで、 困ったことや学んだこと、反省点などをお話しさせていただきます。
  • #4 本題に入る前に改めまして、少しだけ自己紹介をさせていただきます。 2016年に新卒入社した文系出身のインフラエンジニア5年目です。 入社して初めて黒い画面やCloudサービスを触りはじめました。 Ansibleは使い始めて4年、OpenShiftは2年くらいの駆け出しエンジニアです。 ゆっくりのんびりインフラ周りや自動化技術を勉強しています。
  • #6 私は2年前、金融系システムをコンテナアプリケーション化する検証プロジェクトに参加させていただいた際に、OpenShiftを使い始めました。 当時のプロジェクトでは、現行システムの課題を解消して、開発速度の向上や、開発/運用の低コスト化などを実現するために、 エンタープライズレベルのOpenPaaS機能を提供するOpenShiftの導入を検討しました。 そして所属するチームでは、OpenShift3.11の構築や運用管理、ミドルウェアの導入、リリースフローの整備などといったOpenShift管理作業を行っていました。 私は今別のプロジェクトにおりますが、こちらのシステムは実運用に向けて実装を進められていると伺っています。
  • #7 検証が始まってからしばらく、チームの先輩の後ろについてOpenShiftの構築作業をみているばかりでしたが 画面をみてもわからないし、何を調べたらいいのかもわかりません。 そんななにも分からないなかで、一番最初に深くお世話になったのがOpenShiftの監視ツールです。 OpenShiftだけでなく、監視ツールのPrometheusについてもよくわからないし、何を監視したらいいかも、どうやって監視設定を変更するのかも、しっかり調べて理解する必要がありました。 OpenShift管理初心者がコンテナ監視運用にたどり着くまでに出会った高い壁について、少し冗長になってしまいますが、順番にお話しさせていただきます。
  • #8 まずはOpenShiftが分からなければ何ができるのかも、何を管理したらいいのかも見当がつきません。 そこで、OpenShiftについて基本の仕様を調べるところから始まりました。 OpenShiftはKubernetesをベースとしたコンテナオーケストレーションツールで、複数のコンテナやノードを運用管理のに便利な機能を提供してくれるツールです。 このスライドはOpenShift4時点の機能ですが、Kubernetesの基本的な機能に加えて、管理コンソールやコンテナビルドを行うことができるPaaS機能などOpenShift独自の機能も提供されています。
  • #9 概要を調べても、OpenShiftのしくみはまだまだ理解できません。 OpenShiftの構築が終わって、実際にコンテナを動かしたときも、 よくわからないままコマンドを実行したらコンテナが増えたしステータスはRunningだしなんだかすごい!!というような感想しか出てきませんでした。 そんなところでエラーがおこったら、何が起こっているのかもどうしたらいいのかも全くわかりません。
  • #10 openshiftもkubernetesもわからないままではいられない...ということで、仕組みをまなびつつコンテナを動かし続けるなかで沢山のエラーたちと出会いました。 これを繰り返していくうちに少しはコンテナ管理の仕組みもわかってきたかな...と思います。 そうしてOpenShiftに少しなじんだころ、OpenShift上のエラー検知や原因の調査、対処をするための監視を検討することになりました。
  • #11  OpenShift3.11では、AnsiblePlaybookのインストーラを使ってクラスタを構築しますが、その際に監視機能も一緒にインストールすることができます。 インストーラを使うと、「openshift-monitoring」というプロジェクトに、PrometheusやGrafanaといった監視機能を持つコンテナがあっという間にデプロイされます。 これらのツールでは、例えば、コンテナのステータス異常を検知して管理者にアラートを通知したり、OpenShiftの状態をダッシュボードやグラフでチェックしたりといった監視を行うことができます。
  • #12 OpenShift4以降は、インストーラのオプションを有効化しなくてもデフォルトでツールが導入されていて OpenShiftのWebコンソール画面からクラスタのステータスやリソースも確認できるようになります! 重要な情報がぱっとみてわかるので便利ですね
  • #13 でも当時の私は3.11を触っていましたので、監視ツールの最初のイメージはPrometheusのこの画面です。 この画面からいったいどうやって監視を検討したらいいのか、またわからないことが増えてしまいました。
  • #14 PrometheusやGrafanaのWebコンソールへアクセスしてみると、クラスタ監視のためのデフォルト設定がはいってましたが 初見ではやっぱり全く理解できません。 そこで、公式ドキュメントや技術書を頼りにツールや設定の理解を深めるようにいたしました。
  • #15 このスライドからは、PrometheusやGrafanaの基本的な機能について、お話しします。 メジャーなツールですので、もうご存じの方も多いかと思いますが、軽く聞き流していただけますと幸いです。
  • #16 まずは、Prometheusの機能について確認します。 PrometheusはCNCFプロジェクトに含まれるオープンソースの監視ツールで、プラグインによってKubernetesリソースをダイナミックに監視することができます。 OpenShiftのオブジェクトからも監視データを柔軟に収集することができます。 また、監視データを独自のクエリによって計算したり、アラートを設定することも可能です。
  • #17 OpenShiftでは、主にExporterと呼ばれるメトリクスを配信するためのコンテナや、Prometheusのメトリクスに対応するコンテナからデータを取得します。 そして、どのようなコンポーネントからどのようなデータを取得するかを設定しているのがServiceDiscoveryです。 このなかで、Node-exporterと呼ばれる、OpenShiftNodeのリソース監視メトリクスを配信するコンテナからデータを取得するケースについてピックアップして確認してみます。
  • #18 Prometheusは、「scrape_config」にメトリクス収集のアクセス先を設定します。 まえのスライドでもお話ししましたが、PrometheusはKubernetesのプラグインをつかうことで、IPアドレスを指定しなくてもOpenShiftのオブジェクトを特定してアクセス先に設定することができます。 このことで、コンテナが増えたり再起動したりしてIPが変わっても、設定を変更することなく監視を行うことができます。 node-exporterのせっていでは、「openshift-monitoring」プロジェクトに定義されているエンドポイントへアクセスするように設定されています。
  • #19 こうしてコンテナから取得してきたメトリクスには、複数のラベルが付与されています。 このラベルは、そのメトリクスのデータがいったいどこの何のデータにあたるのかを詳細に特定するものです。 node-exporterで配信している「CPU使用量」メトリクスの1つを見てみると、ラベルによって「1つめのCPU」の「idle」の値であることが分かります。 さらに、PrometheusからKubernetesプラグインでデータを取得した時に、kubernetesの構成情報メタデータをラベルとして付与することができます。 このようにラベルをチェックすることで、そのメトリクスがどのノードのリソース監視データであるのかを特定していきます。
  • #20 こうしたメトリクスのラベルは、同じく「scrape-config」の「relabel_configs」の設定で操作することができます。 メトリクス取得先のターゲットの変更や絞り込みなども可能で、 こちらでは、サービス名やエンドポイント名に合致するラベルを持っているターゲットにだけアクセスするような設定がされていました。
  • #21 この「scrape-config」の設定内容をたどって、Prometheusが最終的にアクセスしに行くターゲットを確認してみます 最初に、Kubernetesプラグインでエンドポイントを特定した状態では、35このエンドポイントが検出されています。 そこから、「relabel_configs」でサービス名が「node-exporter」かつエンドポイント名が「https」のラベルを持つターゲットのみKeepするよう設定がされています。 ここで、メトリクス取得さきのターゲットは2のエンドポイントに絞り込まれています。
  • #22 この設定結果は、Prometheus WebコンソールのServiceDiscoveryという項目でチェックすることができます。 Kubernetesプラグインで検出した結果が左側、relabel_configsで絞り込んだ内容が右側に表示されます。 ターゲットになっていないエンドにはDropと表示されるようになります。
  • #23 取得先のターゲットが決まったところで、実際にターゲットからメトリクスを取得できているのかといったところも PrometheusのWebから確認します。 メトリクスが取得できていなければ、認証エラーやネットワークえらーなどのメッセージが赤文字で表示されるのですが このExporterからは正常にデータを取得できているようです。
  • #24 監視データを取得できていることが分かったので、Prometheusから実際にデータを参照してみます。 この画面では、Prometheusのメトリクスに対応する、ラベルベースのクエリ、PromQLを実行してデータを計算しています。 PromQLは、算術、比較、論理、集計などの演算子を使ってデータの計算を行うことができます。 字が小さくて申し訳ないのですが、このクエリは、「Instance」ごとに集計したノードCPU使用率を計算しています。 ここまできてやっと、最初にわからなかった画面を使えるようになってきました。
  • #25 Prometheusには、このPromQLを使用して、2種類のルールを設定することができます。 そのひとつが「record」というもので、クエリをレコードとして定義すると、その結果を「レコード名」から参照することができるようになります。 レコードをうまく組み合わせれば、ワンライナーでかけないような複雑なクエリも、シンプルに表現でき、より細かい監視データの計算も可能になります。
  • #26 ここまでで、メトリクス収集のしくみと、PromQLやレコードの使い方を確認しました。 次のページから、Promethusにためこんだデータをアラートやダッシュボードから監視する方法を見てみます。
  • #27 最初にPromethusのアラート設定について 比較演算を使用したPromQLで監視対象の状態を判断するルールを設定します。 この画面では、コンテナのクラッシュループバックが起きたらアラートを発砲する、ルールを確認しています。 実際にCluster上のあるコンテナがエラー状態なので、アラートルールの状態も「Failing」になります。
  • #28 アラートが発砲状態になったら、PromethusのAlertmanagerというコンテナが設定に基いてアラートを通知します。 メールやSlackなどの通知方法を選択したり通知の間隔、再通知、通知抑制、回復通知などの設定を、アラートルールのグループごとに設定することができます。 検証プロジェクトでは、別システムの監視基盤へアラートを連携するために、FluentdへWebhookでアラートを飛ばしたり、Pythonスクリプトでフォーマットの整形をはさんだりといった実装を行ていました。
  • #29 次に、Grafanaのダッシュボードの設定について確認します。 GrafanaはPrometheusと同じくCNCFプロジェクトに含まれるオープンソースのデータ可視化ツールです。 Prometheusをデータソースとして設定し、PromQLを使用した柔軟なデータ操作を行うことができます。 ダッシュボードは様々なグラフや表を使って設定することができ、パネルごとにデータの取得も可能です。 Webコンソールから取得できて便利ではありますが、全部のデータを取得するには手間がかかるため、メトリクスデータの抽出には、PrometheusAPIを使っていました。 また、ダッシュボードの設定はJson形式でインポート/エクスポートを行うことができます。 OpenShiftのConfigmapで作成したダッシュボードはWebUIから上書きができないので、設定変更の際には、WebUIでコピー&変更したダッシュボードのJsonをエクスポートして毎回Configmap化したりしていました。 このような手間も含めて、Grafanaに関しては運用面に反省点いくつかありました。 その反省点の一つが、ダッシュボードのフィルタリング設定です。
  • #32 Prometheusの機能について学んだうえで、「openshift-monitoring」のデフォルト設定を確認してみると、「OpenShiftのCluster管理コンポーネントを監視するための基本的な設定」が含まれていました。 業務系アプリケーションコンテナやユーザが任意で導入したミドルウェアなどは監視対象に含まれていません 既存のシステムの監視項目や、「openshift-monitoring」のデフォルト設定を参考に、監視対象について検討しました。