【问题标题】:changing memory allocation of a kubernetes worker node更改 Kubernetes 工作节点的内存分配
【发布时间】:2025-12-06 19:20:06
【问题描述】:

我的设置

我有一个物理节点 K8s 集群,我在其中污染了主节点,因此它也可以充当工作人员。该节点具有 Centos7,总共 512 GB 内存。我将我的实验限制在一个节点集群;一旦找到解决方案,我将在我的小型 k8s 集群上对其进行测试,其中 master 和 worker 服务位于不同的节点上。

我要做什么

我希望 k8s worker 一开始只使用 256GB 的内存。稍后,如果满足特定节点条件,我想将 k8s worker 的内存分配增加到(比如说)400GB

我现在在哪里

  1. 我重新启动了我的机器,节点已使用完整的 512 GB 内存。
  2. 我使用chmem -d <range> 离线256 GB 内存。现在操作系统只能看到 256 GB 内存可用。
  3. 我按照从kubeadm initkubectl taint nodes --all node-role.kubernetes.io/master- 的步骤进行操作
  4. 我的单节点 K8s 集已建立,我最多可以部署 2 个 Pod。每个 pod 请求 100Gi 并限制为 200Gi 内存使用量。 Pod 正在执行sleep 100000。所以没有记忆压力。
  5. 当我尝试启动第三个 pod 时; pod 卡在挂起状态,因为调度程序检测到它管理的唯一工作节点超出了可分配的内存资源。这是有道理的。第三个 pod 只是永远停留在挂起状态。
  6. 现在过了一段时间;节点满足要求的条件;此时我使用chmem -e <range> 启用了一些内存,现在操作系统看到 400GB。
  7. 此时我想让 k8s 工作人员了解此内存资源容量变化,以便可以部署停留在挂起阶段的第三个 pod。
  8. 这是我需要你帮助的地方。如何在不重新启动 k8s 的情况下更新工作人员的内存资源容量。如果我重新启动集群,它可以看到 400GB 内存;但这意味着我需要杀死已经运行的 pod,而杀死已经运行的 pod 是不可接受的。

【问题讨论】:

标签: kubernetes memory-management kubelet


【解决方案1】:

这是一个漫长的过程,但您可以尝试通过systemctl restart kubelet 重新启动 kubelet。容器不应该以这种方式重新启动,希望一旦重新启动,它会注意到增加的内存配置。

【讨论】:

  • 我检查了 kubelet 日志;它反映了我在线/离线内存时内存容量的变化。但对第三个 pod 的调度决策没有影响;它仍处于待定阶段。另一方面,当我检查kubectl describe nodes 详细信息时,内存容量保持不变,并且不反映由于内存/在线/离线引起的变化。我还尝试按照您的建议重新启动 kubelet,但调度行为或 pod 状态没有变化
  • 嗯,在 etcd 中可能有关于节点内存大小的旧信息,调度程序在决定调度新 Pod 时会使用这些信息。尚不确定如何在此处强制更新。附带说明:请记住,K8s 将 pod 视为短暂的,它们最终会随着时间的推移而被杀死。
  • 因此,除非您所做的更改在几分钟内生效,否则还有另一个远景:通过修改 kubelet 的内存预留参数之一,您可能能够强制重新配置数据库中的节点。例如。更改system-reserved 的值并观察:kubernetes.io/docs/tasks/administer-cluster/…
  • 我看到您使用kubeadm 来配置您的集群,但您是否对kubelet 配置进行了任何更改?
  • 谢谢伯纳德;重新启动 kubelet 工作......每次我在线/离线内存时,操作系统内存映射和指标都会立即更新,但是为了让 K8s 获得这些更改——我重新启动了 kubelet,并且在几秒钟内它也反映在了 K8s 级别。当 kubelet 重新启动时,Pod/容器继续运行;这是一个惊喜;我的印象是,如果我在正在运行的工作人员上重新启动 kubelet;它会杀死/重新启动所有 pod。
【解决方案2】:
  • 请提供以下命令的输出
kubectl describe nodes
  • 使用以下命令重新启动 kubelet 应该可以工作,因为 kubelet 每次启动时都会重新计算可分配的 cpu 和内存
systemctl restart kubelet
  • 您是否尝试在重新启动 kubelet 后删除并重新创建第三个 pod?

【讨论】:

  • 感谢 Sagar 重新启动 kubelet 工作...每次我在线/离线内存时,操作系统内存映射和指标都会立即更新,但为了让 K8s 获得这些更改-我重新启动 kubelet 并在几秒钟内它也反映在 K8s 级别。当 kubelet 重新启动时,Pod/容器继续运行;这是一个惊喜;我的印象是,如果我在正在运行的工作人员上重新启动 kubelet;它会杀死/重新启动所有 pod。
  • kubelet 系统守护进程调用容器运行时 API 来创建容器。所以实际上运行容器的是容器运行时,如 Docker、Containerd 等。因此,您可以随时重启 kubelet 系统守护进程,而不必担心容器重启。但是如果由于某种原因,kubelet 守护进程没有启动并且长时间处于关闭状态,那么 Kubernetes 会认为该节点已关闭,并且 Kubernetes 会从该节点驱逐 Pod,从而导致 Deployment/ReplicaSet 启动其他节点上的 Pod。在这种情况下,您将遇到容量过剩的问题。