检查 Kubernetes Pod 的 CPU 和内存利用率

199

我正在尝试查看一个 Kubernetes Pod 使用了多少内存和 CPU。我运行了以下命令:

kubectl top pod podname --namespace=default

我遇到了以下错误:
W0205 15:14:47.248366    2767 top_pod.go:190] Metrics not available for pod default/podname, age: 190h57m1.248339485s
error: Metrics not available for pod default/podname, age: 190h57m1.248339485s

1. 对于这个错误,我该怎么办?有没有其他方法可以获取 Pod 的 CPU 和内存使用情况? 2. 我看到这个命令的示例输出显示 CPU 为 250m。这应该如何解释? 3. 如果我们进入 Pod 并运行 Linux 的 top 命令,会得到相同的输出吗?

5
如果你在pod内运行top命令,它就像在主机系统上运行一样,因为该pod正在使用主机系统的内核。 - Alex Punnen
19个回答

207

无需度量服务器或任何第三方工具即可检查


如果您想在不安装任何第三方工具的情况下检查Pod的CPU /内存使用情况,则可以从cgroup中获取Pod的内存和CPU使用情况。

  1. 进入Pod的exec模式 kubectl exec -it pod_name -n namespace -- /bin/bash
  2. 运行cat /sys/fs/cgroup/cpu/cpuacct.usage以获取CPU使用情况
  3. 运行cat /sys/fs/cgroup/memory/memory.usage_in_bytes以获取内存使用情况

请确保已向部署添加了资源部分(请求和限制),以便它可以基于cgroup计算使用情况,容器将遵守Pod级别设置的限制

注意:此使用情况以字节为单位。这可能会根据Pod的使用情况而变化,这些值经常发生更改。


24
我该如何从这个数值计算CPU使用百分比?或者有没有办法确定分配给Pod/Deployment的CPU使用百分比? - Jaraws
25
要复制粘贴,请输入以下命令:cat /sys/fs/cgroup/memory/memory.usage_in_bytescat /sys/fs/cgroup/cpu/cpuacct.usage。 其中,第一个命令可以显示当前系统中进程使用的内存量(单位为字节),而第二个命令可以显示 CPU 使用时间(单位为纳秒)。 - Roman
3
请注意,这种方法显示的内存值可能与kubectl top不同,因为它检查的是内存使用情况,即_used + cache_,而top仅报告_used_。详情请参见:https://www.ibm.com/support/pages/kubectl-top-pods-and-docker-stats-show-different-memory-statistics - Rafael Aguilar
9
您可以使用 cat /sys/fs/cgroup/memory/memory.usage_in_bytes | numfmt --to=iec 命令获取以 Kb/Mb/Gb 为单位的数字。 - teegaar
28
CPU 值应如何解释?它的单位是什么? - justin.m.chase
显示剩余4条评论

189

kubectl top pod <pod-name> -n <fed-name> --containers

顺便提一句,此命令适用于 v1.16.2 版本。


6
我了解到必须先安装度量服务器: $ kubectl top pod mypod -n mynamespace --containers Error from server (NotFound): podmetrics.metrics.k8s.io "mynamespace/mypod" not found - user9074332
2
@user9074332,是的,您需要先安装度量服务器。您可以通过执行以下命令来安装: wget https://raw.githubusercontent.com/pythianarora/total-practice/master/sample-kubernetes-code/metrics-server.yaml kubectl create -f metrics-server.yaml - Umakant
"kubectl get pods --namespace product | grep Running | awk '{print $1}' | xargs kubectl top pod --namespace product --containers" 以整体输出而非每个 Pod 运行状态为目标。 - Mehmet Gökalp
1
不添加命名空间将会导致找不到 Pod 的错误。 - Yash Kumar Verma
1
如果您想定期执行 top 命令,可以使用 watch。例如,设置 5 秒的 watch 时间间隔:watch -n5 kubectl top pod <pod-name> -n <namespace-name> --containerswatch man page - Raunak Kapoor

73

使用k9s可以轻松检查所有资源的CPU和内存使用情况。

在此输入图像描述


3
为什么我在k9s中看不到CPU和MEM列?这是DigitalOcean Kubernetes的限制吗? - deed02392
@deed02392 不确定 - 试着扩展你的终端? - Nick
9
您需要安装 metrics-server 才能使用它:https://github.com/kubernetes-sigs/metrics-server - Jan Peer
1
如何配置k9s以显示内存为Mi? - Neculai Andrei

50
  1. 文档所述,您应该安装metrics-server

  2. 250m表示250毫CPU,CPU资源以CPU单位测量,在Kubernetes中,相当于:

    • 1个AWS vCPU
    • 1个GCP Core
    • 1个Azure vCore
    • 一颗带有超线程的裸金属英特尔处理器上的一个超线程

    允许使用分数值。请求0.5 CPU的容器将获得与请求1 CPU的容器一半的CPU。您可以使用后缀m表示milli。例如100m CPU、100 milliCPU和0.1 CPU都是相同的。不允许比1m更细的精度。

    CPU始终作为绝对数量请求,而不是相对数量;0.1在单核、双核或48核机器上是相同数量的CPU。

  3. 不,kubectl top pod podname显示给定Pod的指标,Linux topfree在容器内运行,并基于存储在虚拟文件系统 /proc/中的信息报告基于Linux系统报告的指标,它们不知道它运行的cgroup。

    这些链接提供了更多详细信息:


对于第三点,你给出的链接说在 pod 内运行 top 命令与在主机系统上运行相同。但是当我尝试时,输出结果并不匹配。 - aniztar
实际上这个说法是错误的,它并没有报告相同的事情,但是它们的工作方式是相同的。主要区别在于,容器中 /proc/ 文件系统中的内容与主机中的内容不同,因此结果将不同。我已经添加了另一个链接,其中包含更详细的信息。 - Diego Mendes

39

通过使用以下kubectl命令快速检查CPU /内存是一种方便的方法。我发现它非常有用。

kubectl describe PodMetrics <pod_name>

将 <pod_name> 替换为使用时获取的 Pod 名称

kubectl get pod

15
错误:服务器没有"PodMetrics"资源类型。 - JRichardsz
2
@JRichardsz 你需要先安装k8s指标服务器 kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml - Presidenten
你能相信吗,我在一个 pod 上运行了 describe 命令,但没有显示与内存或 CPU 使用相关的详细信息。是否需要启用某些特定功能? - Manuel Lazo

31

为使下面的命令使用正确的数据,请先运行度量服务器:

  1. kubectl get hpa
  2. kubectl top node
  3. kubectl top pods

如果没有度量服务器: 通过以下命令进入pod:

  1. kubectl exec -it pods/{pod_name} sh
  2. cat /sys/fs/cgroup/memory/memory.usage_in_bytes

您将获得以字节为单位的pod内存使用情况。


2
此外,还应该有一个文件告诉您内存限制/sys/fs/cgroup/memory/memory.limit_in_bytes。有了这些文件,您可以计算该Pod的内存使用百分比。 最好在Pod本身上编写一些脚本来计算内存百分比并将其写入文件。然后,只需简单地运行kubectl exec pod/<pod_name> -- cat <memory_load_percentage_file>,就可以获取其内存负载。 - Z_K

18

不确定为什么它不在这里

  1. 查看所有运行时间的pod - kubectl get pods --all-namespaces
  2. 查看内存和CPU使用情况 - kubectl top pods --all-namespaces

1
这是因为在 Kubernetes 上默认情况下没有安装指标 API 服务器,至少在原始版本上是这样的。 - Lethargos

11
如果您使用Prometheus operatorVictoriaMetrics operator进行Kubernetes监控,则可以使用以下PromQL查询来确定每个容器、每个Pod和每个节点的资源使用情况:
  • 每个容器的内存使用量(以字节为单位):
sum(container_memory_usage_bytes{container!~"POD|"}) by (namespace,pod,container)
  • 每个容器在CPU核心中的CPU使用情况:
sum(rate(container_cpu_usage_seconds_total{container!~"POD|"}[5m])) by (namespace,pod,container)
  • 每个 Pod 的内存使用量(以字节为单位):
sum(container_memory_usage_bytes{container!=""}) by (namespace,pod)
  • 每个Pod的CPU使用情况(以CPU核心为单位):
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (namespace,pod)
  • 每个节点的内存使用量(以字节为单位):
sum(container_memory_usage_bytes{container!=""}) by (node)
  • CPU核心中每个节点的CPU使用情况:
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (node)
  • 每个节点的内存使用百分比:
100 * (
  sum(container_memory_usage_bytes{container!=""}) by (node)
    / on(node)
  kube_node_status_capacity{resource="memory"}
)
  • 每个节点的CPU使用率百分比:
100 * (
  sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (node)
    / on(node)
  kube_node_status_capacity{resource="cpu"}
)

好的,所以我尝试了每个 Pod 的内存使用量(以字节为单位),但它与 kubectl top 报告的不相符或在获取 API 后手动添加内存使用量后也是如此。 - Anupam Srivastava
@AnupamSrivastava,如果您能提供一个示例pod,并报告查询返回的内存使用情况和kubectl top返回的内存使用情况,那就太好了。 - valyala
被低估的答案。为一个有意义的Grafana仪表盘提供即插即用的功能。 - undefined

8

由于Heapster已经被弃用并将不再发布任何未来版本,因此您应该安装Metrics Server。

您可以按照以下方式安装Metrics Server:

  1. 克隆Metrics Server的GitHub存储库:git clone https://github.com/kubernetes-incubator/metrics-server.git

编辑deploy/1.8+/metrics-server-deployment.yaml文件,在command部分之后添加以下部分:

- command:
     - /metrics-server
     - --metric-resolution=30s
     - --kubelet-insecure-tls
     - --kubelet-preferred-address-types=InternalIP
  1. 运行以下命令:kubectl apply -f deploy/1.8+

这将安装您需要的所有度量服务器要求。

欲了解更多信息,请查看我的下面的答案:

如何启用KubeAPI服务器进行HPA自动缩放度量


5

一种不需要安装指标服务器的替代方法。

您需要在安装 Pod 的 Worker 节点上当前安装 crictl。在官方文档中定义了 Kubernetes 任务。

安装完成后,可以使用以下命令。(我必须在我的情况下使用sudo,但根据您的 Kubernetes 群集安装可能不需要)

  1. 查找 Pod 的容器 ID:sudo crictl ps
  2. 使用 stats 命令获取 CPU 和 RAM:sudo crictl stats <CONTAINERID>

参考输出结果:

CONTAINER           CPU %               MEM                 DISK                INODES
873f04b6cef94       0.50                54.16MB             28.67kB             8

2
值得注意的是,这假定kubernetes正在运行containerd,而不是早期版本使用的dockerd。 - SiHa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接