K8sにPrometheus Operatorを導入して監視する

Prometheusを利用した、kubernetesの監視ってどんな感じなんだろう?
この記事はそんな方にピッタリです!

Prometheusって?


一言でいうと、メトリクスに特化したオープンソースの監視システムです。
 

メトリクスって?

システムの監視には、ロギング、トレーシング、ヘルスチェック、ブラックボックス監視などいろいろなカテゴリがあります。

その中の一つで様々なタイプの情報やイベントを時間の経過とともに管理できる手法が「メトリクス」です。
Prometheusは個別のイベントではなく、システム全体の健全性、挙動、性能などを追跡できます。

 

PrometheusOperatorを構成する


Prometheusを実際にKubernetesと一緒に操作してみようと思うと、Grafanaやexporterのインストール、監視targetの設定など、手を付けなければならないことが多く、途中で挫折してしまうことが多いと思います。

そこで、今回はHelmとPrometheus Operatorを使って、いっぺんに作っちゃいましょう!

 

作業の流れ


作業はkubeadmにて構成済みのkubernetesクラスタで行います。
概要はこんな感じです。

  1. Helmインストール
  2. Prometheusネームスペース作成
  3. Prometheus Operatorインストール
  4. Prometheusダッシュボード表示
  5. Grafanaダッシュボード表示

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です