Administrator
发布于 2024-07-28 / 4 阅读
0
0

可用区粒度剩余可调度Pod数查询

1. 平台

容器云运维管理平台

2. 需求

请求参数:可用区(Availability Zone),CPU,内存,CPU策略,过滤参数

响应参数:剩余可调度Pod数

3. 关系图

4. 设计方案

  1. 根据传入的可用区查询该可用区中的所有集群的clusterId(查mysql)

  2. 遍历所有clusterId,执行 GetSchedulableNodes(c, cpu, memory, localDisk, clusterId, cpuPolicy, selector)

a. 根据clusterId获取k8s client

b. 对标签选择器selector进行处理

c. 调用Kubernetes API,函数调用 k8sclt.GetSchedulableNodesAndPodsNumber 方法,传入 CPU、内存和本地磁盘的需求以及更新后的选择器

GetSchedulableNodesAndPodsNumber:

该方法的目的是计算在一个 Kubernetes 集群中,根据给定的资源需求(CPU、内存、本地磁盘)和选择器,哪些节点能够调度新的 Pod,以及每个节点可以调度的 Pod 数量。

  1. 获取节点列表:首先,通过调用 ListNodes 方法获取所有满足选择器条件的节点。如果获取失败或没有找到任何节点,函数将返回空值。

  2. 筛选节点:遍历所有节点,去除那些状态不是 "Ready" 或者被标记为 "Unschedulable" 的节点。同时,如果资源需求都为 0,则跳过当前节点,因为这通常意味着不需要考虑资源限制。

  3. 计算资源余量:对于每个节点,计算剩余可用的 CPU、内存和本地磁盘资源。如果剩余资源小于所需资源,则标记该节点不能满足资源需求。

  4. 计算总资源数和可调度 Pod 数量:

计算每个节点的总资源数(CPU、内存、本地磁盘)。

根据剩余资源和需求资源计算每个节点可以调度的最大 Pod 数量。

使用 utils.MinInArray 函数确定节点可以调度的实际 Pod 数量,这是由 CPU、内存和本地磁盘中最小的可调度数量决定的。

  1. 汇总结果:将满足条件的节点添加到 nodeList 中,并计算所有这些节点总共可以调度的 Pod 数量。

最终,函数返回四个值:

nodeList:满足条件的节点列表。

nodeCount:一个映射,键是节点名称,值是该节点可以调度的 Pod 数量。

count:所有满足条件的节点总共可以调度的 Pod 数量。

nodeTotal:一个映射,键是节点名称,值是该节点的总资源数(按需求资源单位计算)。


评论