「New Relic Kubernetes integration」というエージェントを使うことで Kubernetes のメトリクスを簡単に New Relic へ送ることができる。

Introduction to the Kubernetes integration | New Relic Documentation

Kubernetes integration into New Relic: features, requirements, and getting started.
icon
docs.newrelic.com

この 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

Helm charts for New Relic applications. Contribute to newrelic/helm-charts development by creating an account on GitHub.
icon
github.com

この values.yamlnrk8s-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-ksmopenshift-monitoring namespace の kube-state-metrics を参照すると上記の Warning メッセージが出力される。

1.2. モニタリングスタックについて | Red Hat Product Documentation

1.2. モニタリングスタックについて | Red Hat Documentation
icon
docs.redhat.com

一方、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 メッセージが出続けてしまう(ここは推測)。

alt text

そこで、values.yaml で kube-state-metrics を探す namespace を指定する(=openshift-monitoring namespace を除外する)ことで Warning メッセージが出なくなるということ。

alt text

ちなみに、New Relic Kubernetes integration での kube-state-metrics デプロイを無効化することもでき、openshift-monitoring namespace の kube-state-metrics だけ存在するようにすると、次の New Relic のドキュメントに載っているように Warning メッセージのあとに Error メッセージが出る。

Error populating KSM metrics | New Relic Documentation

Some troubleshooting tips if KSM metrics aren't being populated
icon
docs.newrelic.com

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 でなんとかできんのか?といろいろ試して結局ダメだったのでここに供養する。