一旦安装了kube-prometheus,使用kubectl top node时会出现错误

首先

从启用了指标的kubespray状态中将其删除,并引入了kube-prometheus。

由于 v0.12.0 kube-prometheus 的错误,导致“kubectl top node”命令无法运行,因此我将记录下其经过。

环境

    • kubespray v2.21.0 (kubernetes: v1.25.6)

 

    kube-prometheus v0.12.0

请查看相关资料

    • GitHub Issues #926 – Document guidance to remove metrics-server before installing kube-prometheus

GitHub Issues #1764 – prometheus-adapter: failed querying node metrics

准备工作

如果在kubespray的addons.yml中启用了metrics-server,则如何处理将在下一节中进行说明。

如果您还使用其他方法或包来安装了node-exporter,则需要在安装kube-prometheus之前将其卸载,以避免冲突。

$ sudo apt remove prometheus-node-exporter

改变的地方

kube-prometheus導入之前的準備工作

如果已经安装了metrics-server,则按照以下步骤进行删除。
如果没有安装,请跳过并继续安装kube-prometheus。

#!/bin/bash

sudo kubectl delete service/metrics-server -n  kube-system
sudo kubectl delete deployment.apps/metrics-server  -n  kube-system
sudo kubectl delete apiservices.apiregistration.k8s.io v1beta1.metrics.k8s.io
sudo kubectl delete clusterroles.rbac.authorization.k8s.io system:aggregated-metrics-reader
sudo kubectl delete clusterroles.rbac.authorization.k8s.io system:metrics-server 
sudo kubectl delete clusterrolebinding metrics-server:system:auth-delegator
sudo kubectl delete clusterrolebinding system:metrics-server          
sudo kubectl delete rolebinding metrics-server-auth-reader -n kube-system 
sudo kubectl delete serviceaccount metrics-server -n kube-system

请确保不要删除与任务无关的资源。

如果使用kubespray的addons.yml来安装metrics-server,相关的YAML文件会被放置在node1的/etc/kubernetes/addons/metrics_server/目录下,因此我认为可以使用它。

$ sudo kubectl delete -f /etc/kubernetes/addons/metrics_server/

kube-prometheus安装后的工作

导入过程的步骤已经在另一篇文章中进行了总结,本文则提供了解决方案。

    Qiita – kube-prometheusをjsonnet-builderでカスタマイズした時の対応メモ

在此处引入后出现了以下错误。

$ sudo kubectl top node
error: metrics not available yet

为了解决这个问题,需要像参考资料中提到的第1764步骤那样,允许来自adapter的通信到promethes的networkpolicy。

$ sudo kubectl -n monitoring  edit networkpolicy prometheus-k8s

当编辑器启动后,您可以复制grafana的定义,并添加kube-prometheus。

  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus-adapter
    ports:
    - port: 9090
      protocol: TCP

前后的差异如下。

--- a.yaml      2023-03-15 05:04:40.490062834 +0000
+++ b.yaml      2023-03-15 05:04:31.238491762 +0000
@@ -36,6 +36,13 @@
     ports:
     - port: 9090
       protocol: TCP
+  - from:
+    - podSelector:
+        matchLabels:
+          app.kubernetes.io/name: prometheus-adapter
+    ports:
+    - port: 9090
+      protocol: TCP
   podSelector:
     matchLabels:
       app.kubernetes.io/component: prometheus

这样kubectl top应该会开始工作了。

尽管顶部节点有对应的对策,但顶部的Pod出现了错误。

如果我们能通过此处的处理进行改善就好了,但是我们遇到了一个现象,即使顶部节点会有反应,但顶部节点下的子节点却无法运行。

$ sudo kubectl top node
NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node1   1234m        15%    7260Mi          24%
node2   682m         17%    7056Mi          45%
node3   697m         17%    3785Mi          24%
node4   790m         19%    6700Mi          42%

$ sudo kubectl -n monitoring top pod
error: Metrics not available for pod monitoring/alertmanager-main-0, age: 36m15.420243139s

以下是可能相关的报告:
– 可能涉及的报告如下。
– 与此相关的报告可能有以下内容。
– 下列是可能相关的报告。

    • https://stackoverflow.com/questions/71692797/prometheus-adapter-unable-to-fetch-cpu-metrics-for-pod-podname-skipping

 

    • https://github.com/kubernetes-sigs/prometheus-adapter/issues/496

 

    • https://github.com/kubernetes-sigs/prometheus-adapter/issues/385

 

    https://github.com/prometheus-operator/kube-prometheus/issues/926

对原因的调查

当使用”Metrics not available for pod”进行搜索时,有以下的Issues在metrics-server中进行了报告。

    https://github.com/kubernetes-sigs/metrics-server/issues/1061

这是为metrics-server而设计的,与kube-state-metrics没有直接关系,但有人指出dockershim可能存在问题。

通过将 cri-dockerd 更改为 containerd,我们可以确认 kubespray 的行为变化。

在kubespray中,提供了从dockerd迁移到containerd的迁移指南。

    https://github.com/kubernetes-sigs/kubespray/blob/master/docs/upgrades/migrate_docker2containerd.md

由于这个结果,顶级Pod成功运行了。

$ sudo kubectl top pod -A

NAMESPACE        NAME                                              CPU(cores)   MEMORY(bytes)
ingress-nginx    ingress-nginx-controller-2whld                    1m           120Mi
ingress-nginx    ingress-nginx-controller-4p7fb                    1m           123Mi
ingress-nginx    ingress-nginx-controller-6p2ft                    1m           122Mi
ingress-nginx    ingress-nginx-controller-zdqv4                    2m           165Mi
kube-system      calico-kube-controllers-75748cc9fd-5cks7          4m           22Mi 
kube-system      calico-node-gq89c                                 50m          136Mi
kube-system      calico-node-m74b8                                 40m          141Mi
kube-system      calico-node-qrz8x                                 35m          133Mi

节点的更改是逐台进行的,但是结果现在从被替换为containerd的节点返回。

目前我还无法确认从cri-dockerd转移到containerd时可能出现了哪些具体问题,但目前似乎有一种解决办法是从dockerd迁移到containerd。

以上

bannerAds