Kubernetes monitoring with Prometheus

Prometheus operator tutorial(第三章)

gavin.zhou
Orangesys
32 min readFeb 19, 2019

--

前回第二章の続き、私たちは完全な「Prometheusを伴ったKubernetesモニタリング」のインストール方法を説明しています。しかし、Prometheus Operatorのフレームワークを使うということ、そしてそのCustom Resource Definitionsは手動で追加されたメトリックターゲットとサービスプロバイダにおいてすごく重要なのです。それは、大きいデプロイメントのために扱いにくくなり、完全にKubernetesのorchestratorのケーパビリティをユーティライズしません。

私たちは同じようなスタックをデプロイしますが、今回はもっと自動的で、フレキシブルな方法を用います。

前回私たちは以下の点をお話しました。

1. Prometheusを伴うKubernetesモニタリング, 基本的なコンセプトと最初のデプロイメント

2. Krometheusを伴うKubernetesモニタリング、 Alertmanager, Grafana, PushGateway

3. Prometheus Operator チュートリアル: Prometheus、 AlertmanagerとGrafanaのための完全に自動化されKubernetesデプロイメント(この記事)

4. Prometheusパフォーマンスに関する考察,高可用性,外部ストレージ、次元数の制限(ディメンショナリーリミット)

What is a Kubernetes Operator?

オペレーターはKubernetes専用のアプリケーション(ポッド)で、他のKubernetesデプロイメントを自動的にコンフィギュアしたり、管理したり、最適化してくれるアプリケーションです。カスタム・コントローラーとして実行されます。

Kubernetes operatorはアプリケーションをどのようにデプロイし、スケーリングするかを知っていて、直接APIとコミュニケーションを取りながら、アルゴリズム決定を行います。

Kubernetes Operatorは以下のことができます。

  • 適切な最初のコンフィグレーションをインストールします。自分のKubernetesクラスターのスペックに従って、自分のデプロイメントのためにサイジングします。
  • どのユーザーのリクエストしたパラメーターモディフィケーション(ホット・コンフィグ・リローディング)にも適応するようにポッドとデプロイメントのライブリロードをする
  • パフォーマンスメトリックに従い、自動的にスケールアップ、もしくはスケールダウンする。
  • バックアップ、整合性チェック、もしくはメンテナンスタスクを実行する。

基本的には、human adminによるコードとして表わされるものは、Kubernetes Operatorの中で自動化が可能です。

Kubernetes Operatorは他のKubernetes APIリソースのようにアクセスされる状況に応じたエンティティとオブジェクトを生成するためにCustom Resource Definitions (略してCRD)をとても頻繁に使うようになります。例えば、次でお話するようにPrometheusのサーバーデプロイメントの最初のコンフィグレーションとスケーリングを設定する‘Prometheus’ Kubernetes APIオブジェクトを操作できるようになります。

Prometheus Operator

KubernetesのためのPrometheus Operator のおかげで簡単にKubernetesサービスやデプロイメント、そしてPrometheusインスタンスの運用のためのモニタリングを設定できるようになります。

私たちは以下の目的で、Prometheus Operatorを使用します。

  • 初めてのインストールを実行し、完全なKubernetes-Prometheusスタックをコンフィグレーションする。
  • Prometheus サーバー
  • Alertmanager
  • Grafana
  • Host node_exporter
  • kube-state-metrics
  • ServiceMonitor エンティティを使ってメトリックのエンドポイントオートコンフィギュレーションを設定する。
  • Operator CRD とConfigMaps を使ってサービスをカスタマイズし、スケーリングする。 ConfigMapsがあれば、自分たちのコンフィグレーションを完全にポータブルに、デクレラティブにすることができる。

Operatorは以下のcustom resource definitions (CRDs)上で働く

  • Prometheus, 希望したPrometheus デプロイメントを設定する。Operator は常にリソースの設定にマッチしているデプロイメントが走っているということを確認する。
  • ServiceMonitorはどのようにサービスのグループがモニターされるかをデクレラティブに明示するOperatorはその設定をベースにしたPrometheusスクレープ コンフィギュレーションを自動で生成する
  • PrometheusRuleは希望するPrometheus ルールファイルを設定し、Prometheus alerting やレコーディングルールを含むPrometheus インスタンスによってロードされる。
  • Alertmanagerは希望したAlertmanager のデプロイメントを設定し、そのOperator は常にリソースの設定にマッチしているデプロイメントが走っているということを確認する。

そのOperatorレポジトリの中の kube-prometheus ディレクトリは、デフォルトのサービスとコンフィギュレーションが含まれています。そのため、Prometheus Operatorそれ自身だけではなく、get-goを使って、カスタマイズして使用しはじめることができる完全なセットアップが手に入ります。

The Prometheus Operator — Components architecture diagram

以下のものは私たちが構成しようとしているKubernetesモニタリングシステムのコンポーネントダイアグラムです。

第二章の手動でPrometheusコンポーネントをインストールするときに似ているダイアグラムだと分かりますよね。しかし、2つの重要な違いがあります。

  1. 異なるPrometheusデプロイメントは異なるリソースをモニタリングする:
  • Prometheusサーバーのうちの一つのグループ (1 to N, 自分のスケールによる)はKubernetesの内部コンポーネントと状態をモニタリングする。
  • Prometheus の他のグループは他の自分のクラスターの中にデプロイされたアプリをモニターする。

2. 直接デプロイとサービスを生成する代わりに、私たちはメトリックソースを伴うOperator にデータを流すためにCRDを使います。上のような例において、私たちは2つのデータソースを持つ1つのGrafanaサービスを持っています。しかし、私たちはPrometheus Operatorのおかげで、デクレラティブな方法でコンポーネントのダイアグラムを再度アレンジする方法をお見せすることができます。

Prometheus Operator — Quick install

そのprometheusのモニタリング ガイド レポジトリーはベースのyamlファイルをいくつか、そして私たちが使う予定のカスタマイズの例を含みます。まだレポジトリーが完了していないのであれば、まず最初にレポジトリーを完了しましょう。

自分のローカルのkubectlがkubernetesダスターを走らせるように指示出しているか確認してください。簡単に捨てられて、もう一度生成できるテストされたクラスターを使いたいと思うはずです。だから異なるコンフィギュレーションを使ってみましょう。

デフォルトで kube-prometheusをインストールするためには、以下が必要です。

デフォルトのスタックは、すぐに使えるたくさんのコンポーネントをデプロイします。

以下を見てください。

・Prometheus サーバーやAlertmanagerサーバーのように他のデプロイメントを管理する責任を担っているprometheus-operatorポッド、スタックのコア

  • 物理ホストごとのnode-exporterポッド(この例においては3)
  • A kube-state-metrics エクスポーター
  • デフォルトのPrometheus サーバー デプロイメント prometheus-k8s (レプリカ: 2)
  • デフォルトのAlertmanager デプロイメント alertmanager-main (レプリカ: 3)
  • Grafana デプロイメントgrafana (レプリカ: 1)

Accessing the interfaces of the Prometheus Operator

ちょうど今デプロイしたインターフェイスを素早く簡単に確認するために、kubectlのポートフォワード機能を使ってください。

それでは、自分のウェブブラウザでhttp://localhost:3000 を開き、Grafanaのインターフェイスにアクセスします。すでに色々な役に立つダッシュボードがたくさん入っています。

しかし、プロダクションKubernetesモニタリングをデプロイしたいと思うのであれば、それらのインターフェイスをingressコントローラーと適切なセキュリティを使って適切にエクスポーズする必要があります:HTTPS証明書と認証

Interacting with the Prometheus Operator via CRD objects

Kubernetesの中で自分が予測したようにそれぞれのDeploymentもしくはStatefulSetのコンポーネントをモディファイする代わりに、このPrometheusスタック デプロイメントをモディファイするために、直接アブストラクト設定をカスタマイズし、operatorに自分に代わってorchestrationをコントロールさせます。

それでは、シンプルな例からスタートしましょう。まず3つのAlertmanagerポッドはこのシナリオにおいては多すぎます。1つで十分です。

最初に、alertmanager CRDを調べましょう。

ここからポッドラベル、serviceAccountnodeSelector、そして私たちが探していたレプリカの数をモディファイすることが可能です。

レプリカのパラメントを1に変更してください。APIオブジェクトをパッチします。(prometheus-monitoring-guideレポジトリの中でパッチされたバージョンを見つけることができます)

もし、モニタリングのネームスペースの中でポッドを再度リストアップするのであれば、Prometheus Operatorそれ自身のログの中で、たった1つのAlertmanagerポッドと例サイズイベントを確認できるでしょう。

Prometheus Operator endpoint to scrape autoconfiguration

次のステップでは、自分のクラスターの中の他のデプロイされたサービスをモニタリングを開始するためにこのコンフィグレーションの上に構築します。

この過程に関連する2つのカスタムリソースが存在します。

  • The Prometheus CRD
  • Prometheus サーバーポッドメタデータを設定する
  • Prometheusサーバーレプリカの#を設定する
  • 始動したアラートルールを送るためにAlertmanagerのエンドポイントを設定する
  • このPrometheus サーバーデプロイメントによって表示されるServiceMonitor CRDのためのレベルとネームスペース フィルターを設定する
  • ServiceMonitorオブジェクトはダイナミックなターゲットエンドポイント コンフィギュレーションを表示する
  • The ServiceMonitor CRD
  • ネームスペースやラベルなどによってエンドポイントをフィルターに通す
  • 異なるスクレープポートを設定する
  • スクレープインターバル、プロトコル、TLS証明書、再ラベリング・ポリシーなどのような全ての追加されたスクレープパラメントを設定する

PrometheusオブジェクトはN ServiceMonitorオブジェクトをフィルターに通し、選択します。そして交代でN Prometheusメトリックエンドポイントをフィルターに通し、選択します。

もしServiceMonitorの基準にマッチする新しいメトリックエンドポイントがあれば、このターゲットは自動的にそのServiceMonitorを選ぶ全てのPrometheusサーバーに追加されます。

上のダイアグラムを見て分かるように、そのServiceMonitorはKubernetesサービスをターゲットにしていて、ポッドにより直接エクスポーズされるエンドポイントをターゲットにはしていません。

私たちは既に、全てのKubernetesの内部メトリック(kube-state-metrics, node-exporter, Kubernetes APIなど)をモニタリングするPrometheusデプロイメントを持っています。しかし、今私たちは、別々になっているデプロイメントが必要なのです。それは、クラスターの一番上で走っている他のアプリケーションの様子を見るためです。

この新しいデプロイメントを実行するために、それをクラスターに入れる前にまず最初にこのPrometheus CRDを見てみましょう。(下のレポジトリーの中でこのファイルを見つけることができます)

簡潔にするために、私たちは他のデプロイメントの中で見つけたalertmanagerserviceAccountコンフィギュレーションを再利用します。

このPrometheusサーバーコンフィギュレーション・ファイルの中では以下のものを見つけることができます。

  • このコンフィグを使った Prometheusレプリカの数
  • ダイナミックにアラートルールをコンフィグするruleSelector
  • 発動したアラートを受け取るAlertmanager デプロイメント (余剰分のための1つ以上のポッドになる可能性がある)
  • ServiceMonitorSelector,つまり、与えられたserviceMonitorがこのPrometheusサーバーをコンフィグレーションするために使われたかどうかを決めるフィルターのこと。
  • この例においては、もしserviceMonitorが自身のメタデータの中でラベルサービスアプリを含んでいるのであれば、serviceMonitorがこのPrometheusデプロイメントと関連付けされるように決めていた。

一旦自分たちのニーズに合わせて調節すれば、新しいコンフィギュレーションを直接レポジトリーから実行することができます。

Prometheus Operatorが新しいAPIオブジェクトに気づいて、所定のデプロイメントをあなたに代わって生成してくれるでしょう。

それらのどのポッドのインターフェイスにコネクトしても、私たちはどんなメトリックターゲットも持っていないということに気づくでしょう。私たちは、スクレープするサービスが必要です。もしあなたが何かを既にインストールして、それを使いたいとおもっているのであれば素晴らしいです!一方、私たちは素早く簡単にHelmを使ってアプリを走らせることができます。

CoreDNS は早くてフレキシブルなDNSサーバーです。Cloud Native Computing Foundationのまだ始まったばかりのプロジェクトです。そのためもしあなたが自分のクラスターに伴ったhelmセットアップを持っているのであれば、走らせましょう。

CoreDNSはPrometheusメトリックをエクスポーズします(ポート9153を使用):

さてそれでは、自分のServices Prometheusデプロイメントとこの新しいサービスをServiceMonitorを使って接続してみます。(下のレポジトリーからこのファイルを見つけることができます)

<code>

それを自分のクラスターに入れます。

2,3秒後、もしPrometheusインターフェイスの中のスクレープ・ターゲットを見るのであれば、どのようにコンフィグレーションが自動的にアップデートされたかを見ることができますし、このターゲットからメトリックを受け取ります。

そして、このCoreDNSデプロイメントのために、もしサービングポッド(そしてこのようにメトリックエンドポイントの数も)の数を増やすのであれば:

全てのターゲットは自動的にServiceMonitorによって検出され、自分のPrometheusコンフィグレーションの中に登録されます。

Prometheus Operator — How to configure Alert Rules

私たちは自分のPrometheusデプロイメントの中でKubernetesモニタリング・アラートをコンフィギュアすることができます。ServiceMonitorのコンセプトににとても似ているPrometheusRule CRDというコンセプトを用いています。

私たちが、自分たちのPrometheusデプロイメントを設定した時、フィルターに通すため、そしてそれらのオブジェクトにマッチさせるためのコンフィグレーションブロックがありました。

自分で希望して、その希望したメタデータに合うPromQLルールを含むオブジェクトを設定するときには、それらは自動的にPrometheusサーバーコンフィギュレーションに追加されます。(下のレポジトリーからこのファイルを見つけることができます)

そのレポジトリーから取り入れます:

それらのアラートをすぐにそのservice-prometheusインターフェイスから調べることができます。もし外部のingressをコンフィギュアしたくないのであれば、ローカルのport-forwardを使ってください。

Prometheusサーバーインターフェイスの中のAlertsタブにアクセスしてください。

DeadManSwitchはいつも発動するアラートのための共通の名前です。(いつもtrueになる評価をするファイアリングコンディションを持ちます)そして、それは自分のアラートパイプラインが予測していたように動いているかどうかチェックするためにそこにあります。数秒後、この状態はロードされ、明るい赤い背景のアラートネームが見えます(発動しています)。上の写真のようになります。

もしあなたが今Alertmanagerインターフェイスを開けると(ポート9093)、そのアラートがこのPrometheusデプロイメントから来ているのが見えます。もし外部のingressをコンフィギュアしたくないのであれば、ローカルのport-forwardを使ってください。

Prometheus Operator — Defining Grafana Dashboards

今日のように、Prometheus Operatorの中にはGrafanaコンポーネントのためのカスタムリソース設定はありません。Grafanaコンフィギュレーションを管理するためには、新しいデータソースと新しいダッシュボードを含むKubernetes secretとConfigMapを使います。

Prometheus Operatorを使ってデプロイされたGrafanaを使う時には、データソースはGrafanaがKubernetes secretから読むbase64を使ってエンコードされたデータ構造として設定されます。

もし、自分の現在のsecretデータをエンコードする場合は、これと似たようなものを見る必要があります.

私たちは、ただ同じJSONフォーマットを使って新しいデータソースを追加し、base64としてsecret dataを再エンコードしてsecretをアップデートする必要があります。

この新しいファイルを作成しましょう。

シークレットオブジェクトの中でそれをカプセル化します(自分自身のファイル、もしくは下に示したようなレポジトリーなどを使ってください)

そしてAPIの中のGrafanaシークレットをパッチします:

そのデータソースは、サービスを指しているということを覚えておいてください(Prometheusポッドではなく)、あなたはこのファイルを使ってservice-prometheus.monitoring.svcサービスを生成する必要があります。

最後にGrafanaをリスタート(再スタート)します:

そして、UI (もし必要なら再度port-forwardを使ってください, port 3000)の中のdatasources タブに行って、両方のデータソースとしてのPrometheusデプロイメントを見る必要があります。

Prometheus Operatorを使うことで、GrafanaダッシュボードはKubernetes ConfigMapの中でただDashboard JSONデータのエンコードだけを外部からロードされることになります。

それらのConfigMapは明確にGrafanaのデプロイメント設定で入れ込まれています。

ダッシュボードごとに新しいConfigMapを作成してもいいし、Grafanaポッドを管理するデプロイメントの設定の中で対応したエンティティを追加することも可能です。

他には、よりフレキシブルな選択肢として、Grafana Helmチャートを使うと、この章の2番目のテーマで話したようなDashboardコンフィギュレーションの自動的なアップデート もできます。

Conclusions

Prometheus Operatorを使用することで、私たちはより簡単にそしてよりデクレラティブにより再生力の高い方法でKubernetesモニタリングスタックを構築することができました。スケールすることも、モディファイしたり、異なるホストのセットに移動させるのも簡単にできます。

今のところ、私たちはPrometheusテクノロジースタックを使ったKubernetes clusterのモニタリングの素晴らしい可能性や大まかな要点、メリットについて話してきました。大きなデプロイメントに行く前に、例えば以下のような注意点を覚えておいてください。

  • Long term storage(長期的保存): 以前お話したように、Prometheus は長期的な保存については考慮していません。(そしてバックアップやデータの冗長性、トレンド分析、データマイニングなどにすごく近い考え方です) この章の2番目のテーマでは、完全な保存のための解決策の基本的な構成要素を提供してくれる最小のRook デベロップメントについて説明しています。
  • Authorization and Authentication(認証と認可): プロジェクト関連の文書で指摘されているおうにPrometheusとそのコンポーネントはどんなサーバー側の認証、認可、また暗号化にも対応していません。アクセスの異なるレベルのユーザーグループも他のRBAC フレームワークも存在しません。
  • Vertical and Horizontal scalability(垂直方向と水平方向のスケーラビリティ): そこまでたくさんの欠点はありませんが、自分のターゲットのキャパシティーについて事前にきちんと多くの情報を得た上で計画を立てる必要があります。私たちはこの説明の一番最後の部分でPrometheusのパフォーマンスに関してや、高可用性とフェデレーションについて述べています。

より分かりやすいPrometheusとSysdigのような商業的なモニタリングプラットフォームの比較についてはこちらをお読みください。PrometheusモニタリングとSysdigモニター:技術的な比較

Orangesys.ioでは、kuberneteの運用、DevOps、監視のお手伝いをさせていただいています。ぜひ私たちにおまかせください。

--

--