「New Relic Kubernetes integration」というエージェントを使うことで Kubernetes のメトリクスを簡単に New Relic へ送ることができる。
Introduction to the Kubernetes integration | New Relic Documentation
この Kubernetse integration は OpenShift にも対応しているが、kube-state-metrics には注意が必要。
何が起こるか:nrk8s-ksm で Warning が出続ける
Kubernetes integration は Helm を使ってインストールでき、色々はリソースがデプロイされる。
そのうちの一つに nrk8s-ksm
というコンポーネント (Deployment) があるが、デフォルト設定で Kubernetes integration をインストールすると、この nrk8s-ksm
が次の Warning メッセージを出し続けてしまう。
Error populating KSM metrics: populate errors:, querying KSM: getting filtered metric families: error calling prometheus exposed metrics endpoint. Got status code: 400
どうすればよいか:参照する kube-state-metrics の namespace を指定する
Kubernetes integration を Helm でインストールするとき、次の values.yaml
が使われる。
helm-charts/charts/nri-bundle/values.yaml at ec82db40960e2eaadf775629d9f67c9c241eba7f · newrelic/helm-charts
この values.yaml
に nrk8s-ksm
が参照する kube-state-metrics がある namespace を指定することで上記の Warning メッセージは出力されなくなる。
例えば、Kubernetes integration はデフォルトで newrelic
namespace にコンポーネントをデプロイするので、次のように newrelic
namespace を指定すること解消する。
newrelic-infrastructure:
enabled: true
# 追加した項目
ksm:
enabled: true
config:
namespace: "newrelic"
なぜ Warning メッセージが出続けてしまうのか
nrk8s-ksm
はクラスタから kube-state-mertrics を探してスクレイピングする役割がある。
OpenShift ではデフォルトで openshift-monitoring
namespace に kube-state-metrics がデプロイされる。
なので nrk8s-ksm
はデフォルトの kube-state-metrics を見ればいいように思えるが、デフォルトの kube-state-metrics は OpenShift コアコンポーネントの用途でしか使えないよう制限されている。
そのため、nrk8s-ksm
が openshift-monitoring
namespace の kube-state-metrics を参照すると上記の Warning メッセージが出力される。
1.2. モニタリングスタックについて | Red Hat Product Documentation
一方、New Relic の Kubernetes integration でもデフォルトでは newrelic
namespace に kube-state-metrics がデプロイされる。
nrk8s-ksm
はすべての namespace から kube-state-metrics を探すようになっているため、openshift-monitoring
namespace の kube-state-metrics と newrelic
namespace の kube-state-metrics 両方に対してスクレイピングする。
nrk8s-ksm
はリトライ回数が指定されていてエラーが続けば Pod が停止されるが、newrelic
namepsace のほうは問題なくスクレイピングできるため両方の kube-state-metrics に対してスクレイピングしているとリトライ回数がリセットされるらしく、そのせいで openshift-monitoring
namespace へのスクレイピングで発生した Warning メッセージが出続けてしまう(ここは推測)。
そこで、values.yaml
で kube-state-metrics を探す namespace を指定する(=openshift-monitoring
namespace を除外する)ことで Warning メッセージが出なくなるということ。
ちなみに、New Relic Kubernetes integration での kube-state-metrics デプロイを無効化することもでき、openshift-monitoring
namespace の kube-state-metrics だけ存在するようにすると、次の New Relic のドキュメントに載っているように Warning メッセージのあとに Error メッセージが出る。
Error populating KSM metrics | New Relic Documentation
time="2024-10-18T04:04:21Z" level=warning msg="Error populating KSM metrics: populate errors:, querying KSM: getting filtered metric families: error calling prometheus exposed metrics endpoint. Got status code: 400"
time="2024-10-18T04:04:21Z" level=warning msg="Error populating KSM metrics: populate errors:, querying KSM: getting filtered metric families: error calling prometheus exposed metrics endpoint. Got status code: 400"
time="2024-10-18T04:04:21Z" level=warning msg="Error populating KSM metrics: populate errors:, no data was populated"
time="2024-10-18T04:04:21Z" level=error msg="retrieving scraper data: retrieving ksm data: KSM data was not populated after trying all endpoints"
今回の対処方法は上記ページに記載されているものとほぼ同じだけど、openshift-monitoring
の kube-state-metrics でなんとかできんのか?といろいろ試して結局ダメだったのでここに供養する。