「Robusta」でKubernetesクラスタの監視と管理自動化を行う

2024年5月23日(木)
桜井 佑介
第5回の今回は、Kubernetesクラスタの監視と管理自動化を行える「Robusta」について紹介します。

はじめに

こんにちは。3-shakeの桜井佑介です。今回は、Kubernetesクラスタの監視と管理自動化を行える「Robusta」について紹介します。

Robustaの概要

Robustaは、Robusta社が提供しているKubernetesクラスタを監視するためのPrometheusをベースとしたオープンソースの可観測性ツールです。自動化ルールに従い、調査に必要な様々な情報を自動で取得して通知してくれます。

例えば、

  • Podがエラー終了したときログ収集して通知する
  • Jobが失敗したとき最後の実行状態を通知する
  • OOMが発生したときにmemory使用量のグラフを添付して通知する
など、Robustaを導入するとKubernetes上でトラブルが発生した際に必要な情報を迅速に確認でき、Kubernetesの運用がより簡単になります。

Robustaでは「プレイブック」という通知のルールを作ります。プレイブックはトリガー(Podのクラッシュ、Prometheusアラートなど)とアクションからなります。アクションでは通知にログなどの情報を付与して充実させたり、通知を沈黙させたりできます。

RobustaはSaaSとして有料で提供されていますが、無料でも利用できます。

Robustaの仕組み

Robustaをインストールすると、Robustaのコンポーネント・プロセスがデプロイされます。Robustaでデプロイされるコンポーネントの主な役割は以下です。

  • robusta-forwarder
    • KubernetesのAPI Serverにアクセスし、リソースの変更を監視する。取得した情報をrobusta-runnerに送る
  • robusta-runner
    • イベントを受け取り、評価して通知を送る

robustaのアーキテクチャ公式ドキュメントより)

オプションとして、以下のコンポーネントも用意されています。

  • Prometheus
    • Robustaのインストールと同時にkube-prometheus-stackとPrometheus Operatorをインストールできます。既存のPrometheusと統合することも可能
  • Web UI
    • アラートやクラスタを一目で見ることができるダッシュボードが用意されている
  • CLI
    • Robustaをインストールするための補助やalertを発生させるデモのために利用できる
$ robusta --help
Usage: robusta [OPTIONS] COMMAND [ARGS]...

Options:
  --help  Show this message and exit.

Commands:
  auth           Authentication commands menu
  demo           Deliberately deploy a crashing pod to kubernetes so you...
  demo-alert     Create a demo alert on AlertManager.
  gen-config     Create runtime configuration file
  integrations   Integrations commands menu
  logs           Fetch Robusta runner logs
  playbooks      Playbooks commands menu
  self-host      Self-host commands menu
  update-config  Update an existing values.yaml file.
  version        Show the version of the local robusta-cli

Robustaを動かす

Robustaは公式の手順に従って、Helm chartでインストールします。robusta gen-configコマンドでHelmのvaluesファイルを生成します。コマンドを実行すると、SlackやWeb UIの設定などをインタラクティブに行うことができます。

robusta gen-config --enable-prometheus-stack

入力が完了すると、generated_values.yamlファイルが生成されます。生成した設定ファイルを使用してhelmでrobustaをインストールします。helmでインストールすると、Robustaのコンポーネント(robusta-forwarderとrobusta-runner)とkube-prometheus-stackのリソースがデプロイされます。

UIにはこちらのURLからアクセスできます。インストール時に指定したGmail等でログインします。ここでは、Robustaによって収集されたPodの情報を確認できます。

左にあるメニューから「App」を指定することでPodなどの情報を確認できます。

アラート

Robustaをインストールすると、事前に定義されたアラートがデプロイされます。実際のトラブルシューティングのシナリオのためのPodが用意されているので、それを試します。

下記のコマンドを実行すると、CrashLoopBackOffするPodをデプロイできます。このコマンドは公式ドキュメントに記載されています。

kubectl apply -f https://gist.githubusercontent.com/robusta-lab/283609047306dc1f05cf59806ade30b6/raw

Podがクラッシュしていることを確認できます。

$ kubectl get pods -l app=crashpod 
crashpod-5794b8d86c-72zvt                               0/1
CrashLoopBackOff   3 (17s ago)   65s

今回のアラートルールでは、2回Restartが発生するとSlackに通知が送られるようになっています。通知には、どのPodでエラーが発生したかやログメッセージなども付与されています。

UIからもPodの状態を確認できます。

CrashLoopBackOffするPod以外にも、GitHubのリポジトリに様々なデモ用のyamlが用意されています。

カスタムアラート

事前に定義されたアラート以外にも、自分でアラートを定義できます。ここではJobの失敗に対するアラートを設定しましょう。カスタムアラートを設定するには、最初に生成したgenerated_values.yamlにcustomPlaybooksという項目を作ります。設定項目は、おおよそ以下のようになっています。詳細は公式ドキュメントを参照してください。

  • triggers: ここでJobの失敗の時にアラートするように設定する
  • actions: アラート時のアクション
  • create_finding:
    • title: アラートのタイトル
    • aggregation_key: この値によりアラートをひとまとめにする
  • enricher
    • enricherの設定で通知に付与する情報を決める。例えばjob_events_enricherならばkubectl get eventsで得られる情報を通知する情報に付与する
customPlaybooks:
- triggers:
  - on_job_failure: {} 
  actions:
  - create_finding:
      title: "Job Failed"
      aggregation_key: "job_failure"
  - job_info_enricher: {}
  - job_events_enricher: {}
  - job_pod_enricher: {}

上記の設定を追加して、helmを更新します。

helm upgrade robusta robusta/robusta -f ./generated_values.yaml --set clusterName=robusta-cluster

失敗するJobをデプロイします。

kubectl apply -f https://raw.githubusercontent.com/robusta-dev/kubernetes-demos/main/job_failure/job_crash.yaml

下図のように、失敗したJobに関するアラートが発報されています。また、txtファイルで以下の情報が添付されていることが分かります。

  • test-job-lmwn9.log: Jobのアプリケーションのログ
  • Job events.txt: JobのEventの情報
  • Job pod events.txt: JobのpodのEventの情報

変更検知

robustaはKubernetesリソースの変更を検知し、通知する機能があります。これは、以下の様々な場面で有効な機能です。

  • アプリケーションの新しいバージョンがロールアウトされたとき
  • 機密性の高いリソースが変更されたとき
  • ClusterRolesまたはServiceAccountsなどが変更されたとき

公式ドキュメントに実施方法が記載されているので試してみましょう。以下の設定をgenerated_values.yamlに追加することで、deploymentリソースのimageの変更を検知できます。

customPlaybooks:
- triggers:
  - on_deployment_update: {}
  actions:
  - resource_babysitter:
      omitted_fields: [] 
      fields_to_monitor: ["image"]

デモ用のPodが用意されているので、デプロイします。

kubectl apply -f https://raw.githubusercontent.com/robusta-dev/kubernetes-demos/main/deployment_image_change/before_image_change.yaml

imageが変更されたyamlで更新します。

kubectl apply -f https://raw.githubusercontent.com/robusta-dev/kubernetes-demos/main/deployment_image_change/after_image_change.yaml

すると、以下のようにimageが更新されたことに対するSlack通知が来ることを確認できます。

なお、変更はUIからも確認できます。

Robusta UI

RobustaのUIには、上記で紹介したようなPodの状態を確認する以外にも様々な機能があります。

Apps: アプリケーションの情報表示

Deployments、StatefulSets、DaemonSets、Podsを一覧にして表示できます。一覧画面では各クラスタにデプロイされているリソースを統合して確認できます。また、各リソースの詳細画面ではログやyamlなどの情報を確認できます。

Timeline: イベントの表示

クラスタ上で発生したイベントを表示します。各イベントに対して、設定した優先度、設定したアラート、発生時刻等を確認できます。アラート名からアラートの設定情報やアラートが発生したPodのログなども確認できます。

Jobs: Jobの情報表示

クラスタ上のJobを一覧表示します。JobのPodのログやyamlなどの詳細情報を確認できます。

Nodes: Nodeの情報表示

クラスタのNodeの状態を表示します。NodeのステータスやCPUとメモリの使用状況など、様々な情報を確認できます。Node上に割り当てられているPodも確認できます。

Comparison: 各種リソースの比較

クラスタ上にデプロイされているリソースのyaml情報をCluster単位、namespace単位、resource単位などで比較できます。下図ではリソース単位で2つのDeploymentのyamlファイルを比較したときの表示です。異なる部分が一目で分かるようになっています。リソース単位で比較する場合はDeploymentだけでなく、2つのConfigMapの比較などさまざまなリソースを比較でき、設定を確認するのに便利です。

Clusters: クラスタの情報表示

Robustaがインストールされているクラスタの情報を表示します。クラスタにデプロイされているアプリケーションなどがいくつあるか、その中で正常ではないものがいくつあるかなどを簡単に確認できます。また、クラスタのKubernetesのバージョンやrobustaのバージョンなども確認できます。

Alerting: アラート情報の表示、設定

各アラートの設定情報を一覧で確認できます。AlertやSilence状態にしたAlertの状態などが確認できます。各アラートの設定情報を確認できるほか、UI上で設定情報を修正したり、新規にアラートを作成することもできます。

Efficiency: リソースの利用情報

リソースを最適化するための分析情報が表示されます。Podの使用状況データを収集し、MemoryとCPUのLimitやRequestの推奨値を提示してくれます。こちらは第1回で紹介した「KRR」をJobで実行し、情報をスキャンして結果を表示します。

Best Practices: 設定の推奨事項の表示

Kubernetesのリソースと構成に関して、潜在的な問題を提示してくれます。popyeというJobを実行し、情報をスキャンして結果を表示します。Podのリソースリミットに関する指摘など、各Podで設定した方が良い項目などを表示します。UIからでもpopyeのJobを実行できるようになっています。

Plan & Usage: Planの情報表示

現状のRobustaのSaaSで契約した際のPlanを表示します。契約していない場合はFreeと表示されます。また、有料版にアップグレードした際にどの程度の料金がかかりそうかを確認できます。下図では有料版の1Podあたりの金額は0.0008$/1hで、そこから月にかかる予想料金が試算されています。

有料版と無料版の違い

最後に、有料版と無料版の違いを簡単にまとめます。有料版にはPro版とEnterprise版があります。詳細はRobustaの公式サイトを確認してください。

無料版ではRobustaの基本的な機能が提供されます。基本的な機能とは上記で紹介した監視機能やアラート機能、クラスタの状態を確認できるダッシュボード、SlackやTeamsとのインテグレーションがあります。Robustaで保存されているデータの保存期間は12時間となっています。

有料のPro版では無料版で利用できる機能に加えて、データの保存期間が3ヶ月間になります。また、EメールやZoomでサポートを受けられます。料金は1Podあたり0.0008$/1hです。

もう1つのEnterprise版では、Pro版の機能に加えて、セルフホストでの利用やSSOといった機能が提供されます。データの保存期間は2年間です。サポートは専用のSlackチャンネルで受けることができます。料金はカスタマイズに基づいて決定されます。

おわりに

今回は、Kubernetesクラスタの監視と管理自動化を行えるRobustaについて紹介しました。Robustaをインストールすると、豊富な機能を備えた監視基盤を簡単に構築できます。今回で紹介した以外にも様々な機能があるので、ぜひ試してみてください。

株式会社スリーシェイク Sreake事業部
2022年10月に3-shakeのSreake事業部にJoinし、主にAWS環境のSRE支援業務に携わっている。日々、Kubernetesやクラウドネイティブ技術を学んでいきたいです。

連載バックナンバー

仮想化/コンテナ技術解説
第5回

「Robusta」でKubernetesクラスタの監視と管理自動化を行う

2024/5/23
第5回の今回は、Kubernetesクラスタの監視と管理自動化を行える「Robusta」について紹介します。
仮想化/コンテナ技術解説
第4回

「Odigos」でノーコードの分散トレーシングを実現する

2024/3/14
第4回の今回は、アプリケーションのソースコードを変更せずに分散トレーシングを実現できる「Odigos」について紹介します。
仮想化/コンテナ技術解説
第3回

「Inspektor Gadget」でKubernetesクラスタをデバッグする

2024/1/24
第3回の今回は、eBPFを利用してKubernetesクラスタをデバッグする「Inspektor Gadget」について紹介します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています