在kubernetes系统中,pod在大多数情况下只是容器的载体而已,通常需要通过RC、Deployment、DaemonSet、Job等对象来完成pod的调度及自动控制功能。

以下来介绍pod的几种调度方法:

1、RC、Deployment : 全自动调度

  RC的主要功能之一就是自动部署一个容器应用的多个副本,以及持续监控副本的数量,在集群内始终维持用户指定的副本数量。除了使用系统内置的调度算法选择合适的node进行调度,也可以指定满足的条件来进行调度。

  1)NodeSelector :定向调度

    k8s默认是Master上的Schedule服务(kube-scheduler进程)根据一系列复杂的算法,最终为pod选择合适的主机,但是有时候我们希望pod创建在指定的节点上。可以通过Node的Label和Pod的nodeSelector属性匹配来达到上述目的。

    (1)首先通过kubectl label来给node打上一些标签

    (2)然后在pod的nodeSelector设置来匹配,如果多个node定义了相同的label,则会选一台合适的主机来创建。

  注意:如果pod指定了nodeSelector,但是集群中没有包含本Label的node,即使有可使用的node,该pod也无法创建。

  2)NodeAffinity  :亲和性调度

    由于nodeSlector通过Node的Label进行精确匹配,所以NodeAffinity增加了In、NotIn、Exists、DoseNotExists、Gt、Lt等操作符来选择Node。

2、DaemonSet :特定场景调度

  用来管理在集群中每个Node上运行一份pod的副本实例

3、Job :批处理调度

  如果有个批处理任务(并行或者串行启动多个计算机进程去处理一批工作项,处理完成后,整个批处理任务结束。有以下几种模式:

  1)Job Template Expansion 模式 

    一个Job对象对应一个待处理的一批工作项(work iteam)

    使用场景:批处理(work iteam)比较少,每个work iteam 的处理的数据比较大的场景

  2)Queue with Pod Per Work Iteam模式:

    采用一个队列存放work iteam ,一个job对象作为消费者去完成这些work iteam,在这种模式下,job会启动N个Pod,一个pod对应一个work iteam

  3)Queue with Variable Pod Count模式:

    与2)一样,只是启动的Pod数量是可变的