设置原则:按硬件规格动态调整,而非固定值

这两个预留值不应是固定值,而应基于节点硬件规格(CPU 核数、内存大小)和节点角色(master/worker)动态设定。原因如下:

  • 系统进程和 Kubernetes 系统组件的资源消耗会随节点规模、运行负载变化。

  • 预留过小无法保护系统,过大会浪费可分配资源,特别是小规格节点上。

  • 不同角色节点(master vs worker)承载的系统组件不同,预留需求也不同。

因此,正确做法是:在节点规格确定后,根据该规格按比例或经验公式计算预留值,并对同构节点池使用相同配置。一旦硬件规格固定且节点池同构,该值就可以作为固定配置应用于所有相同规格的节点。


推荐的计算方法

1. 基于比例的参考值

  • systemReserved:为操作系统保留。

    • CPU:节点总 CPU 的 5% ~ 10%,最低不低于 100m

    • 内存:节点总内存的 5% ~ 10%,最低不低于 256Mi

  • kubeReserved:为 Kubernetes 系统组件(kubelet、容器运行时、CSI 等)保留。

    • CPU:节点总 CPU 的 5% ~ 10%,最低不低于 200m

    • 内存:节点总内存的 5% ~ 10%,最低不低于 256Mi

对于k8s的节点(2 CPU / 3.5 GiB 内存),按上述比例计算:

  • systemReserved.cpu = 2 × 5% = 100m(正好最低值)

  • systemReserved.memory = 3.5Gi × 5% ≈ 179Mi → 取 256Mi(最低值)

  • kubeReserved.cpu = 2 × 5% = 100m → 但官方建议 kubeReserved.cpu 不低于 200m

  • kubeReserved.memory = 3.5Gi × 5% ≈ 179Mi → 取 256Mi

2. 特殊组件额外预留

  • Master 节点:需要额外考虑 etcd、kube-apiserver、kube-controller-manager、kube-scheduler 等控制平面组件的资源消耗。etcd 对内存和磁盘 I/O 敏感,建议预留更多内存(如 512Mi)。因此 master 节点的 kubeReserved 可适当调高。

  • Worker 节点:系统组件相对较少,按基础比例即可。但如果运行了额外的系统级 DaemonSet(如监控 agent、日志采集、安全代理),也应计入 kubeReserved 或通过资源请求/限制由调度器管理。

3. 结合驱逐阈值

kubelet 的 evictionHard 阈值(如 memory.available < 100Mi)应与预留值配合,确保节点在 OOM 前有足够的缓冲。


编辑配置文件重启验证

sudo vi /var/lib/kubelet/config.yaml

在文件顶层(与 apiVersionkind 对齐)添加配置(如下-实际配置示例)。

sudo systemctl restart kubelet

确认 Allocatable 已减少

kubectl describe node <node-name> | grep -A 5 "Allocatable"

实际配置示例

小型节点(2 CPU / 3.5 GiB)

systemReserved:
  cpu: "100m"
  memory: "256Mi"
kubeReserved:
  cpu: "200m"
  memory: "256Mi"

中型节点(4 CPU / 8 GiB)

systemReserved:
  cpu: "200m"
  memory: "512Mi"
kubeReserved:
  cpu: "300m"
  memory: "512Mi"

大型节点(8 CPU / 32 GiB)

systemReserved:
  cpu: "400m"
  memory: "1Gi"
kubeReserved:
  cpu: "800m"
  memory: "2Gi"

Master 节点(额外考虑 +etcd)

systemReserved:
  cpu: "200m"
  memory: "512Mi"
kubeReserved:
  cpu: "500m"      # 包含 etcd、apiserver 等
  memory: "1Gi"

何时可以使用固定值

当节点规格完全相同且节点角色一致(如同构的 worker 节点池)时,可以设定统一的固定值。例如,所有 worker 节点都是 4C/8G,则可以统一配置。但一旦引入不同规格的节点(如混合部署 2C/4G 和 4C/8G),就需要分别设置。

最佳实践:将预留值写入自动化配置中(如 Ansible、Terraform、kubeadm 配置),根据节点规格计算,避免人为固定导致不适配。


总结

  • 预留值应基于硬件规格按比例计算,并满足最低值要求。

  • 角色不同(master/worker)需分别考虑。

  • 同构节点池可以使用固定值,但规格变化时必须调整。

  • 配置后应监控节点 Allocatable 使用率,必要时动态调整。

这样既能保护系统稳定性,又能最大化资源利用率。

更多推荐