Minikubeにkube-prometheusを使ってPrometheusとGrafanaをデプロイする
はじめに
別のことがしたくて、Kubernetesクラスタの監視をPrometheus + Grafanaで行っている環境が欲しくて、いろいろ調べてたらkube-prometheusというのを見つけて、スターも多そうだったのでちょっと触ってみようと思います。
なおこのブログで特に指定がない場合はコンテキストはminikube
が指定されているものとします。
kube-prometheusとは
kube-prometheusはKubernetesのクラスターをPrometheusで監視を行ない簡単に運用していくくための諸々が用意されたアセットです。具体的には、以下のようなものが含まれます。
- Grafana
- Prometheus
- Prometheus Operator
- Kubernetesに対するネイティブデプロイメントとそのマネジメント機能を提供するKubernetes Operator
- Alertmanager
- Prometheusのようなクライアントアプリからのアラートをハンドルするコンポーネント
- Prometheus node-exporter
- *NIX kernelsによって公開されるOSのメトリクスのPrometheusエクスポーター
- Prometheus Adapter for Kubernetes Metrics APIs
- kube-state-metrics
- apiserverに問い合わせを行って、Kubernetes Objectsに関するメトリクスを行ってくれるコンポーネント
インストールしてみる
環境
動作環境は以下の通り
今回KubernetesのクラスタはMinikubeを用いてローカルに構成します。そのVMはデフォルトのDockerを利用します。
各ミドルウェア、OSのバージョンは以下のとおりです。
$ uname -srvmpio Linux 5.4.0-70-generic #78-Ubuntu SMP Fri Mar 19 13:29:52 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux $ lsb_release -a LSB Version: core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch Distributor ID: Ubuntu Description: Ubuntu 20.04.2 LTS Release: 20.04 Codename: focal (Minikubeが動いているDocker) $ docker version (クライアントは省略) Server: Docker Engine - Community Engine: Version: 20.10.5 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 363e9a8 Built: Tue Mar 2 20:16:15 2021 OS/Arch: linux/amd64 Experimental: true containerd: Version: 1.4.4 GitCommit: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e runc: Version: 1.0.0-rc93 GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec docker-init: Version: 0.19.0 GitCommit: de40ad0 $ minikube version minikube version: v1.18.1 commit: 09ee84d530de4a92f00f1c5dbc34cead092b95bc $ kubectl version -o yaml clientVersion: buildDate: "2021-03-18T01:10:43Z" compiler: gc gitCommit: 6b1d87acf3c8253c123756b9e61dac642678305f gitTreeState: clean gitVersion: v1.20.5 goVersion: go1.15.8 major: "1" minor: "20" platform: linux/amd64 serverVersion: buildDate: "2020-12-08T17:51:19Z" compiler: gc gitCommit: af46c47ce925f4c4ad5cc8d1fca46c7b77d13b38 gitTreeState: clean gitVersion: v1.20.0 goVersion: go1.15.5 major: "1" minor: "20" platform: linux/amd64
クラスターを構築する
公式のやり方通りにMinikubeを用いてクラスタを作ってみたいと思います。
以下のコマンドを実行します。
minikube start --kubernetes-version=v1.20.0 --memory=6g --bootstrapper=kubeadm --extra-config=kubelet.authentication-token-webhook=true --extra-config=kubelet.authorization-mode=Webhook --extra-config=scheduler.address=0.0.0.0 --extra-config=controller-manager.address=0.0.0.0
ここで、それぞれのオプションの意味は以下のようになっています。
bootstrapper
:Bootstrapper(インストール前の環境をチェックするプログラム)の名前。デフォルトはkubeadm
(今回明示的にやる必要は無かったかも)--extra-config
:key=value
のペアで各コンポーネントに渡される設定。valueは.
で区切られており最初のパートは設定を追加するコンポーネント(kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, schedulerなどが選択可能)、後のパートは渡す設定値を示すようです。具体的にはそれぞれのコンポーネントに対して以下のようなオプションを渡しています。kubelet
に対して渡すオプションとして--authentication-token-webhook=ture
とauthorization-mode=Webhook
を渡しています(オプションの意味はこちら)。- schedulerに対して
0.0.0.0
にバインドするように設定 - controller-managerに対して
0.0.0.0
にバインドするように設定
全体を通して、すごく重要そうなのはなさそうな印象ですね。ものによっては省略しても行けそうな気がしますが、変なところでつまりたくないので一旦公式に従っておきます。 ちなみに、それぞれのオプションの意味の詳細はここをご確認ください。 また、Kubernetesに関係するコンポーネントに関してはかこちらがよくまとまっています。
kube-prometheusはmetrics APIサーバーを含むたminikubeが持つmetrics-serverは不要となります。
以下のコマンドで、無効化されているか確認します。
$ minikube addons disable metrics-server 🌑 「metrics-server」アドオンは無効化されています
minikubeにkube-prometeusをインストールする
まず、動かしているクラスターのバージョンによって提供されているブランチを選択する必要があるようです。今回クラスターは1.20系で動かしているので、現状ではブランチはrelease-0.7
かHEAD
を使う必要がありそうです。その他詳細な対応表に関してはこちらを確認してください。
今回はrelease-0.7
を利用したいと思います。
以下のようにソースコードをクローンしてきて、release-07
ブランチをチェックアウトします。
$ git clone https://github.com/prometheus-operator/kube-prometheus.git $ cd kube-prometheus/ $ git checkout -b release-0.7 origin/release-0.7 $ git branch main * release-0.7
チェックアウトまでできたら、必要なコンポーネントをクラスタにデプロイします。
kube-prometeusのセットアップは2段階で行なう必要があります。
* manifests/setup
ディレクトリに用意されているマニフェストでCRDs(Custom Resource Definition)とネームスペースを作成する
* CDRとネームスペースができたらmanifests
配下にあるリソースをデプロイする
具体的には以下のコマンドを実行します。
$ kubectl create -f manifests/setup $ kubectl create -f manifests/
ちなみにkube-prometeusを削除したい場合は以下のコマンドをを実行します。
$ kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup
Grafanaのダッシュボードを確認する
デプロイされたGrafanaとPrometheusのダッシュボードにアクセスするためには以下のコマンドでポートフォワードを行います。
$ kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 & \ kubectl --namespace monitoring port-forward svc/grafana 3000 Forwarding from 127.0.0.1:9090 -> 9090 Forwarding from [::1]:9090 -> 9090 Forwarding from 127.0.0.1:3000 -> 3000 Forwarding from [::1]:3000 -> 3000
Prometheusはhttp://localhost:9090、Grafanaはhttp://localhost:3000でそれぞれアクセスできます。
Grafanaの画面にアクセスするとデフォルトで諸々の設定を行ってくれたダッシュボードを確認することができます。
NginxのPodをデプロイしてメトリクスを見てみる
最後に1つネームスペースを作ってNginxのPodをデプロイしてみて、可視化されたメトリクスを確認してみたいと思います。
こちらのマニフェストを使ってNginxのPodを1つのレプリケイトで作るDeploymentを作成します。
まずは、ネームスペースを作成します。
$ kubectl create ns nginx-ns
次にDeoloymentを作成します。
$ kubectl -n nginx-ns apply -f https://raw.githubusercontent.com/samuraiball/settings/master/kubernetes/double-nginx-sample/deployment.yaml deployment.apps/nginx-first created deployment.apps/nginx-second created $ kubectl -n nginx-ns get po NAME READY STATUS RESTARTS AGE nginx-first-d6db6c668-mpbk7 1/1 Running 0 42s nginx-second-6b8d5c9696-wdt75 1/1 Running 0 42s
この状態でGrafanaの左サイドメニューからSearch
を選択し、「pod
」で検索します。
検索結果一覧のなかからKubernetes / Compute Resources / Namespace (Pods)
を選択します。
画面上部のnamespaceでnginx-ns
を選択するとデプロイしたNginxのPodのメトリクスがきちんと