我在 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
有一些因素可以考虑为什么内存使用情况存在一些差异。
资源开销:Kubernetes 为 Pod 分配了超出请求限制的额外内存。总内存使用量的结果不仅包括 Pod 消耗的内存,还包括系统进程、内核等
缓存内存:Linux 内核会缓存未使用的内存,以便在需要时更快地分配。
kubectl top nodes
即使 pod 并未主动使用此缓存内存,它也会显示出来。缓冲:用于缓冲 I/O 操作的内存也会影响节点报告的总体内存使用情况。
被驱逐的 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 提供给我们的信息。