Kubernetes 资源调度
正文
最近在做 xnfun 的时候,考虑执行函数节点选择的时候,想到这和 Kubernetes 里面 pod 执行节点的选择类似。
Kubernetes 中调度指为 Pod 匹配节点,使得 kubelet 可以运行它们。Kubernetes 中调度是抢占式的,意味着一个 Pod 即使被调度执行了,也可能被更高优先级的 Pod 给挤占停止。
Kubernetes 构建的容器调度服务(container scheduling service),设计目标是允许用户通过 Kubernetes 集群管理云容器集群,无需执行复杂的配置。系统能够选择合适的工作节点来执行特定容器集群的调度过程。
其调度器需要考虑 individual 和 collective 资源要求、服务质量要求(qos, quality of service)要求,硬件、软件、策略(policy)约束, 亲和性(affinity)和 anti-affinity 要求, 数据本地行要求(data locality), inter-workload interference, deadlines 等。
其调度过程分为 2 步:
-
Filtering:
调度器过滤掉不满足要求的节点,过滤后如果没有满足节点,Pod
将无法被调度;过滤条件如
-
PodFitsResources
: 检测节点是否有足够的资源,如 CPU, 内存, GPU 等
-
- Scoring: 调度器根据开启的评分规则为节点评分,最终,kube-scheduler 选择分数最高的节点,如果最高分有多个节点,将从它们中随机选择。
细分这两个步骤,整个调度过程分成很多阶段,每个阶段都暴露出一些扩展点1:
Figure 1: Kubernetes 调度阶段与扩展点