1. 平台
容器云运维管理平台
2. 需求
请求参数:可用区(Availability Zone),CPU,内存,CPU策略,过滤参数
响应参数:剩余可调度Pod数
3. 关系图
4. 设计方案
根据传入的可用区查询该可用区中的所有集群的clusterId(查mysql)
遍历所有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 数量。
获取节点列表:首先,通过调用 ListNodes 方法获取所有满足选择器条件的节点。如果获取失败或没有找到任何节点,函数将返回空值。
筛选节点:遍历所有节点,去除那些状态不是 "Ready" 或者被标记为 "Unschedulable" 的节点。同时,如果资源需求都为 0,则跳过当前节点,因为这通常意味着不需要考虑资源限制。
计算资源余量:对于每个节点,计算剩余可用的 CPU、内存和本地磁盘资源。如果剩余资源小于所需资源,则标记该节点不能满足资源需求。
计算总资源数和可调度 Pod 数量:
计算每个节点的总资源数(CPU、内存、本地磁盘)。
根据剩余资源和需求资源计算每个节点可以调度的最大 Pod 数量。
使用 utils.MinInArray 函数确定节点可以调度的实际 Pod 数量,这是由 CPU、内存和本地磁盘中最小的可调度数量决定的。
汇总结果:将满足条件的节点添加到 nodeList 中,并计算所有这些节点总共可以调度的 Pod 数量。
最终,函数返回四个值:
nodeList:满足条件的节点列表。
nodeCount:一个映射,键是节点名称,值是该节点可以调度的 Pod 数量。
count:所有满足条件的节点总共可以调度的 Pod 数量。
nodeTotal:一个映射,键是节点名称,值是该节点的总资源数(按需求资源单位计算)。