Kubelet Node Allocatable怎么配置

66次阅读
没有评论

共计 3749 个字符,预计需要花费 10 分钟才能阅读完成。

本篇内容主要讲解“Kubelet Node Allocatable 怎么配置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“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 怎么配置”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3749字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)