Kubernetes 指标服务器不与 Linkerd 一起工作

Kubernetes metrics-server not working with Linkerd

我有一个 metrics-server 和一个使用此服务器的水平 pod 自动缩放器,运行 在我的集群上。
这工作得很好,直到我将 linkerd-proxies 注入到我的应用程序所在的命名空间的部署中 运行。该名称空间中的 运行 kubectl top pod 导致 error: Metrics not available for pod <name> 错误。但是,metrics-server pod 的日志中没有任何内容。
metrics-server 显然在其他命名空间中运行良好,因为 top 在除网状命名空间之外的每个命名空间中都可以运行。

起初我认为可能是因为代理的资源requests/limits没有设置,但是在运行注入它们(kubectl get -n <namespace> deploy -o yaml | linkerd inject - --proxy-cpu-request "10m" --proxy-cpu-limit "1" --proxy-memory-request "64Mi" --proxy-memory-limit "256Mi" | kubectl apply -f -)之后,问题仍然存在一样。

这是一个已知问题吗,是否有任何可能的解决方案?

PS:我在不同的命名空间中有一个 kube-prometheus-stack 运行,这似乎能够从网状 pods 中抓取 pod 指标就好了

我可以在已注入 linkerd 的 pods 上使用 kubectl top

:; kubectl top pod -n linkerd --containers
POD                                       NAME             CPU(cores)   MEMORY(bytes)   
linkerd-destination-5cfbd7468-7l22t       destination      2m           41Mi            
linkerd-destination-5cfbd7468-7l22t       linkerd-proxy    1m           13Mi            
linkerd-destination-5cfbd7468-7l22t       policy           1m           81Mi            
linkerd-destination-5cfbd7468-7l22t       sp-validator     1m           34Mi            
linkerd-identity-fc9bb697-s6dxw           identity         1m           33Mi            
linkerd-identity-fc9bb697-s6dxw           linkerd-proxy    1m           12Mi            
linkerd-proxy-injector-668455b959-rlvkj   linkerd-proxy    1m           13Mi            
linkerd-proxy-injector-668455b959-rlvkj   proxy-injector   1m           40Mi  

所以我不认为有任何与 Linkerd 和 Kubernetes 指标服务器根本不兼容的东西。

我注意到有时我会在 pod 启动后的前 ~1m 看到错误,在 metrics 服务器获得 pod 的初始状态之前;但这些错误消息似乎与您参考的内容略有不同:

:; kubectl rollout restart -n linkerd deployment linkerd-destination 
deployment.apps/linkerd-destination restarted
:; while ! kubectl top pod -n linkerd --containers linkerd-destination-6d974dd4c7-vw7nw ; do sleep 10 ; done
Error from server (NotFound): podmetrics.metrics.k8s.io "linkerd/linkerd-destination-6d974dd4c7-vw7nw" not found
Error from server (NotFound): podmetrics.metrics.k8s.io "linkerd/linkerd-destination-6d974dd4c7-vw7nw" not found
Error from server (NotFound): podmetrics.metrics.k8s.io "linkerd/linkerd-destination-6d974dd4c7-vw7nw" not found
Error from server (NotFound): podmetrics.metrics.k8s.io "linkerd/linkerd-destination-6d974dd4c7-vw7nw" not found
POD                                    NAME            CPU(cores)   MEMORY(bytes)   
linkerd-destination-6d974dd4c7-vw7nw   destination     1m           25Mi            
linkerd-destination-6d974dd4c7-vw7nw   linkerd-proxy   1m           13Mi            
linkerd-destination-6d974dd4c7-vw7nw   policy          1m           18Mi            
linkerd-destination-6d974dd4c7-vw7nw   sp-validator    1m           19Mi
:; kubectl version --short
Client Version: v1.23.3
Server Version: v1.21.7+k3s1

问题显然是 CRI 运行时的 cAdvisor 统计提供程序中的错误。 linkerd-init 容器在终止后继续生成指标,这是不应该发生的。 metrics-server 忽略来自 pods 的包含报告零值的容器的统计信息(以避免报告无效指标,例如当容器重新启动时,尚未收集指标,...)。您可以在此处跟进 issue。解决方案似乎正在更改为另一个运行时或使用 PodAndContainerStatsFromCRI 标志,这将使内部 CRI 统计信息提供者而不是 cAdvisor 负责。