共计 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 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!