k8s集群服务器节点扩内存,如果没有重启的话,得手动重启一下kubelet,不然识别不到
✅ 你说的这个现象是对的:
kubelet 只在启动的时候读取一次节点硬件容量(从 cAdvisor),运行期间不会自动刷新 Node 的 capacity / allocatable,所以热加内存、不重启整机的情况下,哪怕 free -h 系统已经识别到新内存,kubectl describe node 里内存容量还是旧值,调度器还是按旧内存算资源。
KEP-3953 是原地节点资源扩容,属于还在推进的特性,稳定版 k8s 默认不支持自动热更新节点容量。
操作步骤
- 先确认系统内核已经识别到内存(非常重要!虚拟机热内存还要确认内存online成功)
free -h
lsmem
- 滚动重启 kubelet(生产建议先驱逐节点Pod)
# 先驱逐(优雅迁移pod)
kubectl drain 节点名 --ignore-daemonsets
# 节点上执行重启
systemctl restart kubelet
# 等节点Ready后取消驱逐
kubectl uncordon 节点名
- 验证
kubectl describe node 节点名
# 看 Capacity 和 Allocatable 的 memory
补充两个关键点
- 只重启kubelet,节点上正在跑的Pod不会被杀掉,容器继续运行;只是kubelet短暂NotReady,同步状态后恢复Ready
- 如果是物理机插内存、必须整机断电才能加上内存:那直接重启服务器就够了,服务器重启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核