千家信息网

Kubelet Node Allocatable怎么配置

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,本篇内容主要讲解"Kubelet Node Allocatable怎么配置",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Kubelet Node Allo
千家信息网最后更新 2025年12月02日Kubelet Node Allocatable怎么配置

本篇内容主要讲解"Kubelet Node Allocatable怎么配置",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Kubelet Node Allocatable怎么配置"吧!

Kubelet Node Allocatable

  • Kubelet Node Allocatable用来为Kube组件和System进程预留资源,从而保证当节点出现满负荷时也能保证Kube和System进程有足够的资源。

  • 目前支持cpu, memory, ephemeral-storage三种资源预留。

  • Node Capacity是Node的所有硬件资源,kube-reserved是给kube组件预留的资源,system-reserved是给System进程预留的资源, eviction-threshold是kubelet eviction的阈值设定,allocatable才是真正scheduler调度Pod时的参考值(保证Node上所有Pods的request resource不超过Allocatable)。

  • Node Allocatable Resource = Node Capacity - Kube-reserved - system-reserved - eviction-threshold

如何配置

  • --enforce-node-allocatable,默认为pods,要为kube组件和System进程预留资源,则需要设置为pods,kube-reserved,system-reserve

  • --cgroups-per-qos,Enabling QoS and Pod level cgroups,默认开启。开启后,kubelet会将管理所有workload Pods的cgroups。

  • --cgroup-driver,默认为cgroupfs,另一可选项为systemd。取决于容器运行时使用的cgroup driver,kubelet与其保持一致。比如你配置docker使用systemd cgroup driver,那么kubelet也需要配置--cgroup-driver=systemd。

  • --kube-reserved,用于配置为kube组件(kubelet,kube-proxy,dockerd等)预留的资源量,比如-kube-reserved=cpu=1000m,memory=8Gi,ephemeral-storage=16Gi。

  • --kube-reserved-cgroup,如果你设置了--kube-reserved,那么请一定要设置对应的cgroup,并且该cgroup目录要事先创建好,否则kubelet将不会自动创建导致kubelet启动失败。比如设置为kube-reserved-cgroup=/kubelet.service 。

  • --system-reserved,用于配置为System进程预留的资源量,比如-system-reserved=cpu=500m,memory=4Gi,ephemeral-storage=4Gi。

  • --system-reserved-cgroup,如果你设置了--system-reserved,那么请一定要设置对应的cgroup,并且该cgroup目录要事先创建好,否则kubelet将不会自动创建导致kubelet启动失败。比如设置为system-reserved-cgroup=/system.slice。

  • --eviction-hard,用来配置kubelet的hard eviction条件,只支持memory和ephemeral-storage两种不可压缩资源。当出现MemoryPressure时,Scheduler不会调度新的Best-Effort QoS Pods到此节点。当出现DiskPressure时,Scheduler不会调度任何新Pods到此节点。关于Kubelet Eviction的更多解读,请参考我的相关博文。

  • Kubelet Node Allocatable的代码很简单,主要在pkg/kubelet/cm/node_container_manager.go,感兴趣的同学自己去走读一遍。

关于如何规划Node的Cgroup结构,请参考官方建议: recommended-cgroups-setup

Sample

以如下的kubelet资源预留为例,Node Capacity为memory=32Gi, cpu=16, ephemeral-storage=100Gi,我们对kubelet进行如下配置:

--enforce-node-allocatable=pods,kube-reserved,system-reserved--kube-reserved-cgroup=/kubelet.service--system-reserved-cgroup=/system.slice--kube-reserved=cpu=1,memory=2Gi,ephemeral-storage=1Gi--system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=1Gi--eviction-hard=memory.available<500Mi,nodefs.available<10%

NodeAllocatable = NodeCapacity - Kube-reserved - system-reserved - eviction-threshold = cpu=14.5,memory=28.5Gi,ephemeral-storage=98Gi.

Scheduler会确保Node上所有的Pod Resource Request不超过NodeAllocatable。Pods所使用的memory和storage之和超过NodeAllocatable后就会触发kubelet Evict Pods。

我踩的坑

kube-reserved-cgroup及system-reserved-cgroup配置

最开始,我只对kubelet做了如下配置--kube-reserved, --system-reserved,我就以为kubelet会自动给kube和system创建对应的Cgroup,并设置对应的cpu share, memory limit等,然后高枕无忧了。

然而实际上并非如此,直到在线上有一次某个TensorFlow worker的问题,无限制的使用节点的cpu,导致节点上cpu usage持续100%运行,并且压榨到了kubelet组件的cpu使用,导致kubelet与APIServer的心跳断了,这个节点便Not Ready了。

接着,Kubernetes会在其他某个最优的Ready Node上启动这个贪婪的worker,进而把这个节点的cpu也跑满了,节点Not Ready了。

如此就出现了集群雪崩,集群内的Nodes逐个的Not Ready了,后果非常严重。

把kublet加上如下配置后,即可保证在Node高负荷时,也能保证当kubelet需要cpu时至少能有--kube-reserved设置的cpu cores可用。

--enforce-node-allocatable=pods,kube-reserved,system-reserved--kube-reserved-cgroup=/kubelet.service--system-reserved-cgroup=/system.slice

注意,因为kube-reserved设置的cpu其实最终是写到kube-reserved-cgroup下面的cpu shares。了解cpu shares的同学知道,只有当集群的cpu跑满需要抢占时才会起作用,因此你会看到Node的cpu usage还是有可能跑到100%的,但是不要紧,kubelet等组件并没有收到影响,如果kubelet此时需要更多的cpu,那么它就能抢到更多的时间片,最多可以抢到kube-reserved设置的cpu nums。

Kubernetes会检查的cgroup subsystem

  • 在Kubernetes 1.7版本,Kubelet启动会检查以下cgroup subsystem的存在:

  • 在Kubernetes 1.8及1.9版本,Kubelet启动会检查以下cgroup subsystem的存在:

对于Centos系统,cpuset和hugetlb subsystem是默认没有初始化system.slice,因此需要手动创建,否则会报Failed to start ContainerManager Failed to enforce System Reserved Cgroup Limits on "/system.slice": "/system.slice" cgroup does not exist的错误日志。

我们可以通过在kubelet service中配置ExecStartPre来实现。

到此,相信大家对"Kubelet Node Allocatable怎么配置"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

配置 资源 节点 组件 进程 保证 更多 集群 参考 检查 调度 兴趣 内容 同学 启动会 实际 版本 目录 资源量 建好 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 方舟服务器怎么调人物等级 网鼎杯网络安全大赛闭幕 网络安全不得频繁征求用户同意 数据库句柄坏了 小程序云开发数据库安全性 计算机网络技术参军 三星手机安装网络安全证书 查询数据库是否锁表oracle 武汉扫码点餐软件开发 汕头自主可控软件开发平均价格 试卷保密室智能存储服务器 数据库联网 微信组件如何绑定数据库 软件开发干不动了 单机版用友u8连接不到服务器 物流软件开发功能需求 网络安全管理检查报告 工行软件开发中心成都刘炼 软件开发涉及到的技术汇总 odbc接数据库 互联网 天麻科技产业 网络技术渗透实验报告 百旺税控服务器管理在哪里 宁河区应用软件开发报价技术规范 安全dns服务器作用 桌面软件开发架构 服务器显示非本人我的世界 深圳市屏商互联网络科技有限公司 h3c怎么做到网络安全 魔兽世界怀旧服新开两组服务器
0