今回はKubernetesクラスターをPrometheusとcAdvisorで監視してみるのを試してみようと思います。
Kubernetesの監視にPrometheusとGrafanaを使うのはメジャーな方法です。 久しぶりにセットアップしてみたら、Kubernetesのバージョンアップデートに伴って仕様変更など色々あり、旧来のやり方でうまくいきませんでした。
コンテナー基盤のクラスター監視は重要だと思うので、現時点(2020年5月9日)の動作確認した手順をここにまとめておきたいと思います。ちなみにKubernetesはmicrok8sを使って構築した環境で確認していますが、他の方法でセットアップしたKubernetesでも動くと思います。バージョンは1.17.5を用いましたが、おそらく1.18でも同様かと思います(後日確認します)。
想定する構成
本例では次の2台を想定しますが、Prometheusだけでは継続的な監視には不十分だと思います。 Prometheusと連携してGrafanaを使うとか、ZABBBIXを使うとか検討してください。今回の記事ではその辺りの説明は省略します。
Prometheusノード
Prometheusサーバーをセットアップします。 監視用のノードでそれ以外はインストールしません。 本例では192.168.1.52のIPアドレスを設定しています。
microk8sノード
microk8sを用いてKubernetesをセットアップします。 Prometheus Node exporterとcAdvisorを追加で導入します。 本例では192.168.1.51のIPアドレスを設定しています。
microk8s側のセットアップ
microk8sのインストール
microk8sを用いてKubernetesをセットアップします。
sudo snap install microk8s --channel=1.17/stable --classic sudo microk8s.enable rbac storage dns metrics-server
本例はシングルノードのクラスターとしますが、複数台構成が必要なら次のドキュメントを参考にしてください。
Prometheusはアドオンとして追加しないのがポイントです。 microk8sのアドオンとしてPrometheusを手軽に導入できるのですが、このアドオンは設定の変更ができないため、microk8sのアドオンのPrometheusは今回、利用しません。 とはいえ、特にカスタマイズする必要がなければmicrok8sのアドオンとして追加する方が簡単です。
Prometheus Node exporterのインストール
監視対象のmicrok8sノードにNode exporterをインストールします。 microk8sノードのリソース監視をするために導入します。
snapパッケージでインストール
まずはsnapパッケージを使う方法です。このパッケージはコミュニティユーザーによる提供です。
sudo snap install node-exporter --channel=latest/beta --classic (2020/05/09現在ではv1.0.0-rc.0)
debパッケージでインストール
UbnutuにはPrometheus Node exporterのdebパッケージも提供されています。 aptコマンドを使ってインストールすることもできます。このパッケージはコミュニティによってメンテナンスされています。
sudo apt install prometheus-node-exporter (2020/05/09現在ではv0.15.2+ds-1 universe)
コンテナーのメトリックを取るためcAdvisorの導入
microk8sノードのリソース監視のため、Node exporterをセットアップしました。 コンテナーのメトリックを取るにはNode exporterではできないため、cAdvisorを使ってみます。
本題に入る前にcAdvisorの概要
cAdvisorは、稼働中のコンテナのリソースとパフォーマンス状況を収集、出力できるツールです。プロセス、CPUやメモリの使用量、ファイルシステムの使用量を確認できます。収集したデータは専用のWebインターフェイスで確認するだけでなく、APIを使って他のアプリケーションにメトリックを提供できるため、PrometheusやGrafanaなどを用いてコンテナーやプラットフォームの監視が可能になります。
cAdvisorはかつてKubernetesのKubeletに実装されていたため、1.13以前のバージョンではデフォルトで利用できましたが、現在のバージョンでは利用できません。
Ubuntuの場合、cAdvisorのdebパッケージが用意されているためこれを利用することもできますが、少々古いのと、Kubernetesのようなノードが多数あるような構成に一つ一つセットアップして設定を投入していくのはちょっと面倒です。cAdvisorをKubernetesのDaemonsetとして動かす方法が推奨されるそうです。Kubernetes 1.17系で動作確認しましたが、おそらくそれ以降のバージョンでも動作すると思います。
ちなみに、cAdvisorはDockerで利用するのは本当に簡単です。
cAdvisorのセットアップ
cAdvisorをKubernetesのDaemonsetとして動かしてみます。 Kubernetes 1.14以降のバージョンではkustomizeはkubectlコマンドに実装されていますので、少々コマンドとオプションの指定が変わっているので注意します。
git clone https://github.com/google/cadvisor.git kubectl kustomize deploy/kubernetes/base (内容を確認) kubectl apply -k deploy/kubernetes/base (Kustomizeを使って展開)
-fオプションではなく、-kオプションとしてkustomization_directoryを指定します。 -kオプションは--kustomizeのエイリアス。
cAdvisorサービスの作成
外部からアクセス可能にするようにサービスを作成します。 以下はnodePortを使った場合の例。ポートは一意のものを指定すること。
apiVersion: v1 kind: Service metadata: name: cadvisor namespace: cadvisor spec: selector: app: cadvisor ports: - protocol: TCP port: 8080 nodePort: 30080 type: NodePort
cAdvisorの動作確認
コマンドでデータを取り出してみましょう。
curl http://192.168.1.51:30080/api/v2.0/stats
ブラウザーでDashboardを開いてみましょう。
http://192.168.1.51:30080/containers/
cAdvisorのダッシュボード
CPU、メモリー、プロセス、ファイルシステムの使用状況などを確認できる。
監視側
Prometheusのインストール
どちらかのバージョンをインストールしてください。Ubuntu Serverのセットアップ時にインストーラーでprometheusを追加した場合はバージョン1の方がインストールされます(2020/05/09現在)。
sudo snap install prometheus (2020/05/09現在ではv1.8.2) sudo snap install prometheus --channel=2/stable (2020/05/09現在ではv2.9.1)
Prometheusの設定変更
snapパッケージの場合、設定は/var/snap/以下に展開されます。次の手順に従って設定ファイルを開きます。static_configsなどにサービスを追記します。30080はNodePortです。
cd /var/snap/prometheus/current vi prometheus.yml ... # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090'] - targets: ['192.168.1.51:30080'] ←cAdvisor実行ノードのIPアドレスを追記
備考
snapパッケージはバイナリーは/snap以下、設定は/var/snap以下のディレクトリーに展開されます。
Prometheusサービスの再起動
snapパッケージのサービスはsnap restartコマンドで行います。 実行後にsnap servicesコマンドでactiveになっていることを確認します。他のステータスの場合はPrometheusの設定に定義エラーがありますので、設定を見直します。
snap restart prometheus snap services Service Startup Current Notes prometheus.prometheus enabled active -
Prometheusダッシュボードへのアクセス
ブラウザーで以下URLにアクセスします。
「Zabbixでメトリックを使ってグラフ化(Zabbixで性能監視)する」に続く...