1     前言

2     Kubernetes定义

3     Kubernetes架构

4     Kubernetes技术

4.1   容器化技术

4.1.1 cgroups技术

4.1.2 Docker容器运行环境

4.1.3 containerd容器运行环境

4.1.4 Pod的基本概念

4.1.5 Pod的调度策略

4.1.6 Pod的资源编排

4.1.6.1Deployments

4.1.6.2ReplicaSet

4.1.6.3StatefulSets

4.1.6.4DaemonSet

4.1.6.5Jobs

可变调度指令

Job的调度指令是通过修改配置域实现的,一般情况下,Job是在约束的条件下并行地执行Pod任务,例如,在指定的节点区域中执行指定的任务、在特定的硬件资源中(不同的GPU模型或者不同的GPU组合模型)执行特定的任务。如前面的内容所述,Job提供暂停指令(配置域),队列调度控制器可以使用该指令决定何时暂停任务的执行、何时恢复任务的执行,但是队列调度控制器不能决定在什么节点中执行恢复的Pod任务,与该功能特性相关的集群开关是:JobMutableNodeSchedulingDirectives。

因此,在任务启动之前或者在任务恢复之前,用户可以修改调度指令涉及到的配置域,在Job对应的Pod模板中,这些配置域包括节点关系匹配、节点选择器、容忍度、标签以及注解。

指定Pod选择器

如果用户在创建一个Job的时候,没有指定配置域.spec.selector,则系统默认地在Job中增加该配置域,该配置域的值在所有Job中保持唯一性。用户也可以自行指定该配置域,而且该配置域的值必须保持唯一性,因为,如果与其他Job的选择器相同,则Job控制器认为是相同的选择器而作为相同的Pod任务进行统计,当指定的Pod任务被删除的时候,所有相同选择器的Pod任务都将会被删除,所以,这些操作会引起误删的结果。

如上图所示,假如old对应的Job目前处于运行的状态,用户的需求是保留这些已经运行的Pod任务,使用新命名的Job、新定义的Pod模板执行剩余的任务,如前面所述,因为Pod任务在运行的状态下其配置域是不能被修改更新的,所以,现在的做法是,只删除Job对象,而保留已经运行的Pod任务,再创建新的Job继续执行剩余的任务,如下所示,创建一个新Job:

如上图所示,新创建的Job,其配置域controller-uid保持与旧Job的相等,同时,增加配置域manualSelector: true,当Job控制器运行新Job的时候,会自动地更新配置域controller-uid的值为新的唯一的标签值。

Pod失败应对策略

用户可以使用配置域.spec.podFailurePolicy指定Pod在失败异常的情况下的应对策略,与该功能特性相关的集群开关是:JobPodFailurePolicy、PodDisruptionConditions。在Job执行Pod任务的过程中,如果发生失败异常的情况,则Job控制器会根据运行在Pod中的容器的异常码或者Pod的当前状况做出恰当的应对措施。如前面所述,配置域.spec.backoffLimit可以设置Pod失败补偿措施,而使用配置域.spec.podFailurePolicy可以设置更加灵活、更多细节的失败补偿措施,其优点如下所示:

  • 为了避免不必要的因Pod任务重启而带来的资源开销,用户可以使用应用软件返回的异常码(退出码)而快速终止一个发生异常的Pod任务

  • 为了保证即使在Pod任务发生异常的情况下还能完成任务的执行,用户可以设置而忽略Pod的异常,使得Pod的异常情况不参与配置域.spec.backoffLimit对应的失败次数的统计

如上图所示,定义了Pod失败的应对策略,其描述如下所示:

  • 退出码是0表示容器成功运行

  • 退出码是42表示Job完全运行失败

  • 其他退出码表示容器运行失败,引起Pod运行失败,则按照配置域backoffLimit对应的错误补偿策略处理

其中,配置域的值DisruptionTarget表示该Pod异常情况不参与backoffLimit机制的统计。如前面所述,不管Job发生的是何种异常情况,Job控制器都会终止所有运行中、或者等待中的Pod任务。

此外,如下所示提供与配置域.spec.podFailurePolicy相关的要求与语义:

  • 如果需要定义配置域.spec.podFailurePolicy,必须先定义配置域.spec.restartPolicy的值等于Never(Job控制器不会在Pod任务失败的节点上重启容器)

  • 如果在配置域spec.podFailurePolicy.rules中定义多个规则,则按照先后的顺序匹配,前面的匹配到,后面的不用匹配,如果没有匹配的规则,则按照默认的规则处理

  • 在配置域spec.podFailurePolicy.rules[*].containerName中指定规则生效的容器,如果没有指定具体的容器,则规则对所有的容器有效,如果指定具体的容器,则在Pod定义的模板中匹配一个与之对应的容器

  • 在配置域spec.podFailurePolicy.rules[*].action中指定Pod失败应对措施所采取的动作,该动作分类如下所示:

FailJob表示Job运行失败,Job对应的全部Pod任务被终止

Ignore表示不参与配置域.spec.backoffLimit机制的统计,并且创建一个新的Pod任务

Count表示参与配置域.spec.backoffLimit机制的统计,这是默认的动作

Job的追踪与终结

该功能特性对应的集群开关是:JobTrackingWithFinalizers,控制器使用该功能特性追踪新创建Job的执行情况,统计状态为成功(succeeded)、失败(failed)的Job,与该统计信息相关的行为包括:

  • 当一个节点失败,垃圾回收器移除该节点对应的孤立的Pod任务

  • 在统计数量达到指定的临界值,垃圾回收器移除已完成的Job(状态为成功、失败)

  • 人为干涉删除Job中的Pod任务

  • 外部控制器删除对应的Pod任务或者替换对应的Pod任务

(未完待续)

Logo

开源、云原生的融合云平台

更多推荐