Kubernetes 调度和资源管理

简介: 本文简单介绍了一下调度的高级策略,在集群资源紧张的时候也能合理调度资源。

作者 | 子誉 蚂蚁金服高级技术专家

Kubernetes 调度过程

首先来看第一部分 - Kubernetes 的调度过程。如下图所示,画了一个很简单的 Kubernetes 集群架构,它包括了一个 kube-ApiServer,一组 Web-hook Controllers,以及一个默认的调度器 kube-Scheduler,还有两台物理机节点 Node1 和 Node2,分别在上面部署了两个 kubelet。

从零开始入门 K8s | Kubernetes 调度和资源管理

我们来看一下,假如要向这个 Kubernetes 集群提交一个 pod,它的调度过程是什么样的一个流程?

假设我们已经写好了一个 yaml 文件,就是下图中的橙色圆圈 pod1,然后往 kube-ApiServer 里提交这个 yaml 文件。

从零开始入门 K8s | Kubernetes 调度和资源管理

此时 ApiServer 会先把这个待创建的请求路由给我们的 webhook Controllers 进行校验。

从零开始入门 K8s | Kubernetes 调度和资源管理

通过校验之后,ApiServer 会在集群里面生成一个 pod,此时生成的 pod,它的 nodeName 是空的,并且它的 phase 是 Pending 状态。在生成了这个 pod 之后,kube-Scheduler 以及 kubelet 都能 watch 到这个 pod 的生成事件,kube-Scheduler 发现这个 pod 的 nodeName 是空的之后,会认为这个 pod 是处于未调度状态。

从零开始入门 K8s | Kubernetes 调度和资源管理

接下来,它会把这个 pod 拿到自己里面进行调度,通过一系列的调度算法,包括一系列的过滤和打分的算法后,Schedule 会选出一台最合适的节点,并且把这一台节点的名称绑定在这个 pod 的 spec 上,完成一次调度的过程。

此时我们发现,pod 的 spec 上,nodeName 已经更新成了 Node1 这个 node,更新完 nodeName 之后,在 Node1 上的这台 kubelet 会 watch 到这个 pod 是属于自己节点上的一个 pod。

从零开始入门 K8s | Kubernetes 调度和资源管理

然后它会把这个 pod 拿到节点上进行操作,包括创建一些容器 storage 以及 network,最后等所有的资源都准备完成,kubelet 会把状态更新为 Running,这样一个完整的调度过程就结束了。

通过刚刚一个调度过程的演示,我们用一句话来概括一下调度过程:它其实就是在做一件事情,即把 pod 放到<strong>合适的 node 上。

这里有个关键字“合适”,什么是合适呢?下面给出几点合适定义的特点:

  • 首先要满足 pod 的资源要求;
  • 其次要满足 pod 的一些特殊关系的要求;
  • 再次要满足 node 的一些限制条件的要求;
  • 最后还要做到整个集群资源的合理利用。

做到以上的要求后,可以认为我们把 pod 放到了一个合适的节点上了。

接下来我会为大家介绍 Kubernetes 是怎么做到满足这些 pod 和 node 的要求的。

Kubernetes 基础调度力

下面为大家介绍一下 Kubernetes 的基础调度能力,Kubernetes 的基础调度能力会以两部分来展开介绍:

  1. 第一部分是资源调度——介绍一下 Kubernetes 基本的一些 Resources 的配置方式,还有 Qos 的概念,以及 Resource Quota 的概念和使用方式;
  2. 第二部分是关系调度——在关系调度上,介绍两种关系场景:pod 和 pod 之间的关系场景,包括怎么去亲和一个 pod,怎么去互斥一个 pod?pod 和 node 之间的关系场景,包括怎么去亲和一个 node,以及有一些 node 怎么去限制 pod 调度上来。

如何满足 Pod 资源要求

点击链接,查看更多内容

关键字:kubernetes 调度 入门 Pod Node


分享到:


相關文章: