首页 > 解决方案 > GKE 中的 metrics-server-nanny 容器的 CPUThrottlingHigh 警报

问题描述

我注意到我的一些集群在 GKE 中报告了针对 metrics-server-nanny 容器(图像:gke.gcr.io/addon-resizer:1.8.11-gke.0)的 CPUThrottlingHigh 警报。我看不到配置此容器以为其提供更多 CPU 的方法,因为它会自动部署为 metrics-server pod 的一部分,并且 Google 会自动重置对部署/pod 资源设置的任何更改。

所以出于好奇,我在 GKE(3 个标准节点)中创建了一个小型 kubernetes 集群,并开启了自动缩放功能,最多可扩展到 5 个节点。没有安装任何应用程序或任何东西。然后我安装了 kube-prometheus 监控堆栈(https://github.com/prometheus-operator/kube-prometheus),其中包括 CPUThrottlingHigh 警报。安装监控堆栈后不久,该容器弹出了同样的警报。我在此容器或相关 metrics-server-nanny 容器的日志中看不到任何内容。

此外,我在 AWS 或 Azure 上没有注意到同样的问题,因为虽然它们在 kube-system 命名空间中有类似的 metrics-server pod,但它们在 pod 中不包含 sidecar metrics-server-nanny 容器。

有没有人看到这个或类似的东西?有没有办法在不让谷歌覆盖配置更改的情况下给这个东西更多的资源?

标签: kubernetesgoogle-cloud-platformgoogle-kubernetes-enginemonitoringautoscaling

解决方案


这是Kubernetes中的一个已知问题,即 CFS 导致 Throttling Pods 表现出尖峰 CPU 使用模式。由于 Kubernetes / GKE 用于实现 CPU 配额,这会导致 Pod 受到限制,即使它们真的不忙。

Kubernetes 使用 CFS 配额来对运行应用程序的 pod 实施 CPU 限制。Completely Fair Scheduler (CFS) 是一个进程调度程序,它根据时间段而不是可用的 CPU 功率来处理执行进程的 CPU 资源分配。

我们无法通过 Kubernetes 直接控制 CFS,因此唯一的解决方案是禁用它。这是通过节点配置完成的。

允许用户调整 Kubelet 配置“ CPUManagerPolicy ”和“ CPUCFSQuota ”</p>

解决方法是完全暂时禁用 Kubernetes CFS 配额(kubelet 的标志--cpu-cfs-quota=false

    $ cat node-config.yaml
    kubeletConfig:
    cpuCFSQuota: false
    cpuManagerPolicy: static

    $ gcloud container clusters create --node-config=node-config.yaml

gcloud 会将 YAML 节点配置文件中的字段映射到新添加的 GKE API 字段。


推荐阅读