このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2024年5月31日金曜日

Prometheus で kubernetes 上のリソースを監視してみる その1 kubernetes に Prometheus と Grafana を構築する。

今回から、kubernetes 上で Prometheus と Grafana を用意して監視を行えるように構築し、Pod や Service といった各リソースをターゲットとして追加するにはどうすればいいかなどを記事にしていきたいと思います。
また、Chat-GPTさんにどうやってyaml書いたらいいか等、構築の仕方についてアドバイスをもらいながらやってみてAIの活用みたいなことに手を出していこうと思います。


利用する環境の前提条件ですが、コントロールプレーン1台 ノード2台の構成に外部公開用IPアドレスを払い出すためのMetalLBが構築済みの環境となります。

kubernetes を使用するので、全部 Pod として展開することになり細かい設定を作った後にいじるのはちょっと難しくなります。
ですが、何度も作り直すことが容易になりますので、今回は完成系に向かって一つ一つ構築していくというよりは一旦ここまで作ると決めてそれが作れるyamlを作成します。
そのyamlを元に、次にここまで作ると決めてyamlに手を加えていく方法でやっていこうと思います。
最終的に、出来上がったyamlをapplyすれば全部一度に作成できるようになっているはずです。

具体的に言いますと以下のyamlを作りながら完成を目指したいと思います。

第1回目:Prometheus と Grafana を構築して外部からアクセス可能な状態となっているyamlを作成
第2回目:2.そのyamlを元に、Prometheus の監視対象となる Pod や Service 等のリソースを追加したyamlを作成

そのあとですが、第3回目としてGrafana から Prometheus で監視している対象を監視するダッシュボードを自作してみようと思います。
この第3回目についてはyamlではなく実際にGrafanaを操作して設定していく予定です。

前置きが長くなってしまいましたが、早速第1回目のPrometheusとGrafanaの作成に取り掛かってみます。

何も知らないふりをして、ChatGPTさんに聞いてみました。

質問文:kubernetes を利用してPrometheusとGrafanaを作成したいです。管理のためそれぞれのnamespaceを作成してリソースを配置したいと思いますが、どのようにすればいいでしょうか。

結果は以下のスクショのようになりました。

まずnamespaceをそれぞれコマンドで作成するように案内されました。
次は長くてスクショを分割しましたが、PrometheusとGrafanaの作成を行うyamlのを案内してくれました。
なんと、特に説明していないのにServiceも作ってくれていますね。

Prometheusのyaml
Grafanaのyaml
そして、yamlをapplyするところも案内してくれました。
ですが、せっかくなので、名前空間の作成も含めて一つのyamlにまとめてもらえないか聞いてみましょう。
かなり長くなってしまいましたが、1つにまとめてくれました。
ちなみにお礼を言うとこんなふうに返してくれます。

これをそのまま純真無垢な心でapplyしてもいいのですが、こちらから与えた情報がかなり少なかったので一応中身を確認してみます。
確認してみたところ、Serveを作成してくれていたんですがタイプが入っていませんでした。
これでは、外部からアクセスするためのIPアドレスが払い出されず接続できません。

しかしながら、これは最初にそうしたいと伝えなかった私のミスですね。
ChatGPTに限らず、AIを使用する際はこのようにきめ細かな詳細設定を伝える必要があるのですが、全部最初から伝えきるのは大変なので案内してくれたものを精査して不足部分を補っていきましょう。

では、Serviceにtype LoadBarancerを追加してもらえるようにお願いします。
長くなってしまうので一部分だけのスクショになりますが、案内してくれたyamlに今度は『type: LoadBalancer』が追加されています。
では、うまくいくことを祈りつつyamlをapplyしてみましょう。

実際にこのyamlをapplyしてみると、リソースが作成され始めるのですが Prometheus の Pod が ContainerCreating のままとなります。
# kubectl get pod -n prometheus
NAME                         READY   STATUS              RESTARTS   AGE
prometheus-87b9fbd44-zxl4r   0/1     ContainerCreating   0          5d
原因の確認をするため、該当Pod の詳細を見てみると、configmapがないためでした。
# kubectl describe pod/prometheus-87b9fbd44-zxl4r -n prometheus

Events:
  Type     Reason       Age                    From               Message
  ----     ------       ----                   ----               -------
  Normal   Scheduled    7m54s                  default-scheduler  Successfully assigned prometheus/prometheus-87b9fbd44-zxl4r to dev-k8s-02.devops.lab
  Warning  FailedMount  102s (x11 over 7m54s)  kubelet            MountVolume.SetUp failed for volume "prometheus-config" : configmap "prometheus-config" not found
というわけで、configmap も作れるyamlにしてもらいました。
最初は、configmapを作成するためのファイルを用意してそれを読み込んでconfigmapを作成する方式を提案されました。
1つのyamlファイルに収めたかったので、それも含めて1つのyamlの中でどうにかできないかChatGptさんとやり取りしてconfigmapとprometheusの部分は以下のようになりました。
あらためてこのyamlをapplyすると、PrometheusとGrafanaのPodが作成されブラウザでアクセス可能となります。
ChatGptさんを使ってみた感じですが、全く見当違いの答えが出てきたときには修正が楽だったんですが中途半端にこちらの意図が伝わってる時に『部分的にこうしてほしい』を伝えるのがなかなか大変でしたね。

また、アウトプットをそのまま使うのではなく、中身を確認することは重要だと思いました。
そのまま利用して問題なく動く場合も十分あると思うのですが、今回で言うとServiceのタイプについて伝えてなかったので外部からアクセスできない状態でした。
しかしそのまま利用するとyamlのapplyには成功してしまいます。
成功してしまうので問題ないと思ってしまう・・・ということが起きかねません。

なので、やはり自分でアウトプットされた内容が自分の欲しいものになっているかどうかというのがある程度は分かるように精進しましょう。

今回はここまでとなります。