问题描述
业务使用的kubenetes集群,需要收集k8s各节点的硬件资源使用情况, 因此需要分析Node的系统资源是如何设置的。
通过跟踪源码, 先分享一下capacity和allocatable这两个指标的获取路径
环境说明
kubenetes版本: v1.23.3
linux版本: CentOS 7.6
总体说明
node的状态由节点上的kubelet进行设置, capacity与allocatable的含义如下:
capacity: 容量, 节点的系统资源上限
allocatable: 可分配的, kubelet可分配的系统资源上限, 注意: 非当前实时可用的系统资源
源码级分析
状态设置入口函数- defaultNodeStatusFuncs
状态设置控制逻辑:MachineInfo
容量设置
kubelet通过cadvisor库获取系统资源: CPU和内存
【容量】CPU
所用测试机器是16核 与node.status.capacity.cpu结果一致
【容量】内存
所用测试机器总内存32778604 kB(32G) 与node.status.capacity.memory 一致
【容量】Pods
kubelet从配置中获取最大节点数量
所用测试机器的kubelet未配置【最大Pod数量】-maxPods, maxPods的默认配置是110
【容量】临时存储-ephemeral-storage
所用测试机器kubelet的root-dir是: /dcos/data/docker/kubelet, 所在的磁盘分区是根分区
所用测试机器根分区的磁盘大小是206291924K 与 node.status.capacity.ephemeral-storage一致
可分配设置
控制逻辑
可分配容量 = 总容量 - 保留容量
kubelet保留容量配置
所用测试机器的kubelet配置文件如下:
所用测试机器配置的kubelet保留资源量
内存: 总容量:-32778604Ki * (1-5%) = 31887025971 与 node.status.allocatable.memory 相当
临时存储: 总容量-206291924Ki * (1-5%) = 200680783667 与 node.status.allocatable.ephemeral-storage 相当