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 负责。
我有一个 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 负责。