kubectl top 报告的 Kubernetes 节点内存使用情况与 pod 内存使用总和之间的差异

kubectl top 报告的 Kubernetes 节点内存使用情况与 pod 内存使用总和之间的差异

我在 Kubernetes 集群中遇到了内存使用情况报告方面的差异,我希望了解可能造成该问题的原因。

当我运行时kubectl top pods --all-namespaces,我得到以下输出,列出了集群中各个 pod 的内存使用情况:

NAMESPACE           NAME                                                CPU(cores)   MEMORY(bytes)
argocd              argocd-application-controller-0                     40m          185Mi
argocd              argocd-applicationset-controller-584f68b9d7-l954j   1m           51Mi
argocd              argocd-dex-server-8577d9498b-l9lnv                  1m           17Mi
argocd              argocd-notifications-controller-564dcb4995-j582k    1m           25Mi
argocd              argocd-redis-66d9777b78-29mq6                       3m           4Mi
argocd              argocd-repo-server-58c94b5cbf-477v8                 1m           71Mi
argocd              argocd-server-b8bd4f4b5-kz4qw                       1m           41Mi
cert-manager        cert-manager-5b54fc556f-jjsqb                       1m           22Mi
cert-manager        cert-manager-cainjector-7d8b6cf7b9-885vx            1m           26Mi
cert-manager        cert-manager-webhook-7d4744b5ff-cmk98               1m           9Mi
gitlab              gitlab-deployment-66dcd84ffb-b58cs                  133m         6505Mi
kube-system         coredns-6799fbcd5-q7pns                             11m          17Mi
kube-system         local-path-provisioner-84db5d44d9-2466v             1m           7Mi
kube-system         metrics-server-67c658944b-44f5n                     12m          19Mi
kube-system         svclb-traefik-c1466e35-j2psx                        0m           2Mi
kube-system         traefik-5ff9bf948b-bh2bp                            1m           34Mi
linkerd             linkerd-destination-7b5d9869c8-69jwx                8m           63Mi
linkerd             linkerd-identity-7cfd498f58-jpdtr                   3m           24Mi
linkerd             linkerd-proxy-injector-f6c775c9c-wj9cj              3m           27Mi
linkerd-viz         grafana-5646d97bff-n7bj4                            14m          93Mi
linkerd-viz         metrics-api-5f5789c8cf-5mpzp                        2m           29Mi
linkerd-viz         prometheus-6c96bcf74d-85cs9                         25m          154Mi
linkerd-viz         tap-d94cf7688-np8sk                                 5m           29Mi
linkerd-viz         tap-injector-7c5b57889c-h8ft5                       2m           23Mi
linkerd-viz         web-69bbf5b8db-tz9t2                                5m           26Mi
microservice-demo   auth-service-deployment-69dc69b858-7zfl6            7m           543Mi
microservice-demo   backend-api-deployment-786b954f-7kbg4               18m          99Mi
microservice-demo   mongodb-deployment-7d94b89cf5-xs5gs                 12m          288Mi
microservice-demo   payout-service-deployment-7fdf698f68-78zzx          7m           79Mi
microservice-demo   wallet-service-deployment-687fc74bdb-hlh4w          11m          86Mi
microservice-demo   web-app-deployment-5dc5dcbf7c-lz9q8                 1m           7Mi
microservice-demo   wheel-service-deployment-5bfb59d776-nr4pf           4m           67Mi

将这些 pod 的内存使用量加起来,总数约为 9146Mi。

但是,当我使用 kubectl top 检查节点的内存使用情况时,它报告的内存使用量要高得多:

NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
myserver  785m         9%     16508Mi         51%

如您所见,该节点报告的内存使用量 (16508Mi) 明显高于列出的 pod 的内存使用量总和 (9146Mi)。

我已经验证了 kubectl top pods --all-namespaces 的输出包括在节点上运行的所有 pod,所以我很困惑是什么可能消耗了节点报告的额外内存。

使用时htop我也没有获得任何其他信息,除了正在运行的 pod,因为htop它告诉我 GitLab 是使用最多的: 在此处输入图片描述

有人能解释一下为什么会出现这样的差异吗?还有哪些其他因素或组件可能导致节点报告的内存使用量,我该如何减少它。感觉整个 k3s 在我运行的集群中总共占用了太多内存。我看到有人在树莓派上运行 GitLab 之类的东西,那么为什么 16GB 的 RAM 不够用呢?

答案1

有一些因素可以考虑为什么内存使用情况存在一些差异。

  1. 资源开销:Kubernetes 为 Pod 分配了超出请求限制的额外内存。总内存使用量的结果不仅包括 Pod 消耗的内存,还包括系统进程、内核等

  2. 缓存内存:Linux 内核会缓存未使用的内存,以便在需要时更快地分配。kubectl top nodes即使 pod 并未主动使​​用此缓存内存,它也会显示出来。

  3. 缓冲:用于缓冲 I/O 操作的内存也会影响节点报告的总体内存使用情况。

  4. 被驱逐的 pod:如果某些 pod 最近由于内存压力而被驱逐,那么它们的内存可能仍会反映在节点的总使用量中,直到垃圾收集器回收它为止。

建议优化 pod 资源请求和限制,以确保资源请求合适。调整这些值有助于更好地分配和管理。您可以监视系统进程并识别可能导致整体内存使用量增加的任何内存密集型进程。检查节点上运行的任何可能消耗内存的不必要的服务或组件。评估当前节点大小是否足以满足其上运行的工作负载。根据工作负载和资源要求,您可能需要扩大大小以满足内存需求。

答案2

请注意kubectl top nodes不保证显示的内存使用量是 显示的内存使用量的总和kubectl top pods。有关详细信息,请参阅以下链接:

https://github.com/kubernetes-sigs/metrics-server/issues/193#issuecomment-451309811

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

尤其:

对于 Pod 来说,内存是 Pod 中容器的内存使用量总和。对于节点来说,我相信它是系统范围的节点 cgroup 报告的内存使用量。所以它可能包括 Pod 中没有的内容,IIRC。我们只是报告节点上的 cadvisor 提供给我们的信息。

相关内容