【k8s】k8s集群节点服务器资源扩容无法识别

k8s集群服务器节点扩内存,如果没有重启的话,得手动重启一下kubelet,不然识别不到

✅ 你说的这个现象是对的:
kubelet 只在启动的时候读取一次节点硬件容量(从 cAdvisor),运行期间不会自动刷新 Node 的 capacity / allocatable,所以热加内存、不重启整机的情况下,哪怕 free -h 系统已经识别到新内存,kubectl describe node 里内存容量还是旧值,调度器还是按旧内存算资源。

KEP-3953 是原地节点资源扩容,属于还在推进的特性,稳定版 k8s 默认不支持自动热更新节点容量。

操作步骤

  1. 先确认系统内核已经识别到内存(非常重要!虚拟机热内存还要确认内存online成功)
free -h
lsmem
  1. 滚动重启 kubelet(生产建议先驱逐节点Pod)
# 先驱逐(优雅迁移pod)
kubectl drain 节点名 --ignore-daemonsets

# 节点上执行重启
systemctl restart kubelet

# 等节点Ready后取消驱逐
kubectl uncordon 节点名
  1. 验证
kubectl describe node 节点名
# 看 Capacity 和 Allocatable 的 memory

补充两个关键点

  1. 只重启kubelet,节点上正在跑的Pod不会被杀掉,容器继续运行;只是kubelet短暂NotReady,同步状态后恢复Ready
  2. 如果是物理机插内存、必须整机断电才能加上内存:那直接重启服务器就够了,服务器重启kubelet自然跟着重启,不需要单独操作kubelet

小坑提醒

  • 如果你配置了 kube-reserved / system-reserved,重启kubelet后会重新计算 allocatable,不是简单把新增内存全部给Pod调度
  • 云主机热内存,部分虚拟化平台内存加上后是offline状态,要先手动online内存块,否则系统free看不到,重启kubelet也没用

如何查看 k8s各节点的 capacity / allocatable ?

方式1:kubectl describe node(最常用,看单节点)

# 查看单个节点
kubectl describe node node-xxx

# 只过滤 Capacity / Allocatable,简洁输出
kubectl describe node node-xxx | grep -E "Capacity|Allocatable" -A 10

输出片段示例:

Capacity:
  cpu:                4
  memory:             16265408Ki
  pods:               110
Allocatable:
  cpu:                3920m
  memory:             15221696Ki
  pods:               110

Capacity:节点硬件总资源;Allocatable:扣掉 kube-reserved / system-reserved / eviction阈值 后,调度器真正用来跑Pod的资源

方式2:kubectl get nodes -o jsonpath / yaml(批量查所有节点,适合脚本)

# yaml格式,看全部节点status
kubectl get nodes -o yaml

# jsonpath 批量提取所有节点名称 + capacity内存 + allocatable内存
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.capacity.memory}{"\t"}{.status.allocatable.memory}{"\n"}{end}'

方式3:jq格式化输出(推荐批量巡检,需要装jq)

kubectl get nodes -o json | jq -r '.items[] | [.metadata.name, .status.capacity.memory, .status.allocatable.memory, .status.capacity.cpu, .status.allocatable.cpu] | @tsv'

方式4:自定义列 get node 自定义输出(表格化看所有节点)

kubectl get nodes -o custom-columns="NODE:.metadata.name,CAP_MEM:.status.capacity.memory,ALLOC_MEM:.status.allocatable.memory,CAP_CPU:.status.capacity.cpu,ALLOC_CPU:.status.allocatable.cpu"

和你前面内存扩容场景关联重点

  • 加内存后,这里的 capacity 没更新 = kubelet 还没读到新内存,需要重启kubelet
  • 重启kubelet成功后,capacity 刷新,allocatable 会自动重新计算(按预留配置扣减)
  • kubectl top node 看的是实时使用率,不是 capacity/allocatable,别搞混;top依赖metrics-server

小补充单位

  • Ki:1024进制,k8s内部标准单位
  • m:毫核,1000m=1CPU核
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容