Prometheusを利用した、kubernetesの監視ってどんな感じなんだろう?
この記事はそんな方にピッタリです!
Prometheusって?
一言でいうと、メトリクスに特化したオープンソースの監視システムです。
メトリクスって?
システムの監視には、ロギング、トレーシング、ヘルスチェック、ブラックボックス監視などいろいろなカテゴリがあります。
その中の一つで様々なタイプの情報やイベントを時間の経過とともに管理できる手法が「メトリクス」です。
Prometheusは個別のイベントではなく、システム全体の健全性、挙動、性能などを追跡できます。
PrometheusOperatorを構成する
Prometheusを実際にKubernetesと一緒に操作してみようと思うと、Grafanaやexporterのインストール、監視targetの設定など、手を付けなければならないことが多く、途中で挫折してしまうことが多いと思います。
そこで、今回はHelmとPrometheus Operatorを使って、いっぺんに作っちゃいましょう!
作業の流れ
作業はkubeadmにて構成済みのkubernetesクラスタで行います。
概要はこんな感じです。
1.Helmインストール
Helmというのはkubernetesのパッケージ管理ツールです。
RedHatのyum、Debianのaptのようなものです。
helm install を実行すると、K8sクラスタに対してAPIが発行され、K8sクラスタ上にオブジェクトが作成されます。
ここでは、K8sクラスタに対してkubectlでapiを発行することができるノードにて作業を行います。
Helmのtarballをダウンロードして解凍します。
# wget https://get.helm.sh/helm-v3.2.1-linux-amd64.tar.gz
~
2020-05-20 01:42:31 (59.1 MB/s) - ‘helm-v3.2.1-linux-amd64.tar.gz’ saved [12927632/12927632]
# tar zxf helm-v3.2.1-linux-amd64.tar.gz
#
バイナリを任意の場所に配置します。PATHの追加が不要な/usr/local/binあたりがいいでしょう。
# mv linux-amd64/helm /usr/local/bin/
# helm version
version.BuildInfo{Version:"v3.2.1", GitCommit:"fe51cd1e31e6a202cba7dead9552a6d418ded79a", GitTreeState:"clean", GoVersion:"go1.13.10"}
#
Helm のリポジトリを追加します。
# helm repo add stable https://kubernetes-charts.storage.googleapis.com/
"stable" has been added to your repositories
# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com/
2. Prometheusネームスペース作成
Prometheus Operatorを導入するとリソースがたくさん作成されるので、
管理しやすいように専用のネームスペース[prometheus]を作成します。
まずマニフェストを作ります。
## prometheus-namespace.yml
kind: Namespace
apiVersion: v1
metadata:
name: prometheus
マニフェストを適用します。
# kubectl apply -f prometheus-namespace.yml
namespace/prometheus created
#
3. Prometheus Operatorインストール
さあ、いよいよPrometheus Operatorをインストールしましょう!
Helmでインストールします。
# helm install prometheus stable/prometheus-operator --namespace prometheus
~
Visit https://github.com/coreos/prometheus-operator for instructions on how
to create & configure Alertmanager and Prometheus instances using the Operator.
#
※ kubeadmにて作成したクラスタの場合は、Prometheusによるetcdのmetrics取得に失敗するので、helm実行時に以下のオプションを付けてください。
[–set kubeEtcd.service.port=2381,kubeEtcd.service.targetPort=2381]
実際に何が立ち上がっているか見てみましょう!
# kubectl get all -n prometheus
NAME READY STATUS RESTARTS AGE
pod/alertmanager-prometheus-prometheus-oper-alertmanager-0 2/2 Running 0 2d22h
pod/prometheus-grafana-5b47c8cfb6-lvq4n 2/2 Running 0 2d22h
pod/prometheus-kube-state-metrics-6d6fc7946-z9f5m 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-4vz25 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-5jhmp 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-628lk 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-gt8vt 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-lh2qv 1/1 Running 0 2d22h
pod/prometheus-prometheus-node-exporter-wpzpj 1/1 Running 0 2d22h
pod/prometheus-prometheus-oper-operator-66d78dfdcb-gppt9 2/2 Running 0 2d22h
pod/prometheus-prometheus-prometheus-oper-prometheus-0 3/3 Running 1 2d22h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 2d22h
service/prometheus-grafana ClusterIP 10.32.0.36 <none> 80/TCP 2d22h
service/prometheus-kube-state-metrics ClusterIP 10.32.0.220 <none> 8080/TCP 2d22h
service/prometheus-operated ClusterIP None <none> 9090/TCP 2d22h
service/prometheus-prometheus-node-exporter ClusterIP 10.32.0.213 <none> 9100/TCP 2d22h
service/prometheus-prometheus-oper-alertmanager ClusterIP 10.32.0.65 <none> 9093/TCP 2d22h
service/prometheus-prometheus-oper-operator ClusterIP 10.32.0.208 <none> 8080/TCP,443/TCP 2d22h
service/prometheus-prometheus-oper-prometheus ClusterIP 10.32.0.131 <none> 9090/TCP 2d22h
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/prometheus-prometheus-node-exporter 6 6 6 6 6 <none> 2d22h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/prometheus-grafana 1/1 1 1 2d22h
deployment.apps/prometheus-kube-state-metrics 1/1 1 1 2d22h
deployment.apps/prometheus-prometheus-oper-operator 1/1 1 1 2d22h
NAME DESIRED CURRENT READY AGE
replicaset.apps/prometheus-grafana-5b47c8cfb6 1 1 1 2d22h
replicaset.apps/prometheus-kube-state-metrics-6d6fc7946 1 1 1 2d22h
replicaset.apps/prometheus-prometheus-oper-operator-66d78dfdcb 1 1 1 2d22h
NAME READY AGE
statefulset.apps/alertmanager-prometheus-prometheus-oper-alertmanager 1/1 2d22h
statefulset.apps/prometheus-prometheus-prometheus-oper-prometheus 1/1 2d22h
#
Prometheusに必要なalertmanagerや、便利なダッシュボードツールのGrafanaもすでに起動しています!
4. Prometheus ダッシュボード表示
さあそれでは、Prometheusのダッシュボードを表示してみましょう。
運用に利用するわけではないので、簡易的なポートフォワーディングでPrometheusダッシュボードにアクセスします。
先ほどの一覧表示でPrometheusのサービスが9090ポートで起動していることが分かりました。
kubectlを実行するノード向けのアクセスを、Kubernetesのサービスのポートに転送されるようにします。
# k port-forward service/prometheus-prometheus-oper-prometheus 9090:9090 --address 0.0.0.0 -n prometheus
Forwarding from 0.0.0.0:9090 -> 9090
ブラウザでポートフォワーディングを設定したノードにアクセスすると、Prometheusの画面が表示されます。
これはPrometheusの内蔵ダッシュボードで、式ブラウザと呼ばれていて、Prometheusの取得しているmetricsの中で取得したい情報の式を入力して参照できるもののようです。
試しに式に[process_resident_memory_bytes]を入力してメモリの使用量を取得しました。
こ、これは人間の読める表示ではないですね。と思ったあなた。
[Graph]タブをクリックしてみましょう。
これならまだ見やすいですね!
ただ、Prometheusの内蔵ダッシュボードは一時的な探索には便利なのですが、汎用のダッシュボードとしては利用しづらいため、[Grafana]が推奨されています。
5. Grafanaダッシュボード表示
という事で、[Grafana]ダッシュボードを表示してみましょう。
Grafanaはポート80で公開されているようなので、先ほどと同様にポート転送設定をします。
# k port-forward service/prometheus-grafana 3000:80 --addres
s 0.0.0.0 -n prometheus
Forwarding from 0.0.0.0:3000 -> 3000
ブラウザからアクセスします。
かっこいいログイン画面が開きます。以下の情報でログインします。
ユーザ: admin
パスワード: prom-operator
既に監視対象の設定やダッシュボードの作成はされているので、左上の[Home]からダッシュボードを選択して表示してみます。
試しにノードの情報が参照できる[Nodes]ダッシュボードを開いてみます。
これは見やすくて便利そうですね!
左上の四角が4つのプルダウンから新しいダッシュボードを作成したりできるので、見やすいダッシュボードを考えてみてください!
おわりに
今回はPrometheusとGrafanaのKubernetesでの利用の概要をつかむために、[Prometheus Operator]を利用しました。
この環境で色々操作してなんとなくイメージをつかんでみてください。
今回導入のPrometheus Operatorは、Helmで導入したため、設定などはHelm Chartのvalues.ymlに記載されています。
細かい設定を行う場合は、[helm install]実行時に[–set]や[-f ファイル名]などでvalues.ymlの内容を書き換えて導入してみてください。
参考
GitHub – Helm Prometheus Operator : https://github.com/helm/charts/tree/master/stable/prometheus-operator