如何在K8s节点上为system-node-critical Pod预留资源
解决方案:为关键Pod预留节点资源
针对你在K8s 1.22集群中遇到的问题,推荐通过以下方式实现普通作业仅占用节点80%资源、为system-node-critical级关键Pod预留20%资源的需求:
1. 配置Node Allocatable(官方核心方案)
Node Allocatable是Kubelet的原生特性,用于为系统组件、关键Pod预留节点资源。配置后,普通Pod仅能使用节点总资源减去预留部分后的allocatable资源池,从根源上避免关键Pod驱逐普通Pod的情况。
具体配置方式
你可以通过Kubelet启动参数或配置文件设置预留资源(以CPU和内存按节点总资源20%预留为例):
- 通过启动参数:在Kubelet启动命令中添加以下参数:
--system-reserved=cpu=2000m,memory=2Gi \ --reserved-cpu=0 \ --reserved-memory=0
注:system-reserved专门为system-node-critical、system-cluster-critical级Pod预留,reserved字段用于自定义用户侧预留场景。
- 通过配置文件:创建
kubelet-config.yaml并挂载到Kubelet配置目录:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration systemReserved: cpu: "2000m" memory: "2Gi" reservedSystemCPUs: "0-1" # 可选,指定固定CPU核心给关键Pod,进一步隔离资源
配置完成后重启Kubelet,节点的allocatable资源会自动调整为总资源减去system-reserved的部分,普通作业调度将严格限制在该范围内。
2. 补充优化:强化优先级与资源约束
结合以下配置可进一步提升稳定性:
- 确保关键Pod的优先级类已设为
system-node-critical(你已完成此设置),这类Pod的调度优先级高于所有普通Pod,会被优先分配预留资源。 - 普通作业保持
Guaranteed QoS配置(请求=限制),让调度器能精准计算资源占用,避免超配。
注意事项
- 若使用托管K8s集群(如EKS、GKE、AKS),需通过云厂商控制台或官方API修改Kubelet配置,不可直接操作节点。
- 预留资源比例需根据关键Pod的实际资源总和调整,确保20%的预留量能覆盖所有关键Pod的需求。
内容的提问来源于stack exchange,提问作者Jan Jongboom
相关产品推荐
相关产品推荐

