Kubernetes组件-Job(立即执行的任务)
⒈简介
Kubernetes组件中ReplicationController、ReplicaSet和DaemonSet会持续运行任务,永远达不到完成状态,这些pod中的进程在退出时会重新启动。但是在一个可完成的任务中,只想运行完成工作后就终止任务,其进程终止后,不应该再重新启动。
Kubernetes通过Job资源提供了对此的支持,它允许你运行一种pod,该pod在内部进程成功结束时,不重启容器。一旦任务完成,pod就被认为处于完成状态。在发生节点故障时,该节点上由Job管理的pod将仿照ReplicaSet的pod的方式,重新安排到其他节点。如果进程本身异常退出(进程返回错误退出代码时),可以将Job配置为重新启动容器。
如果一个Job所创建的pod,在最初被调度节点上异常退出后,将被重新安排到一个新节点上。
Job对于临时任务很有用,关键是任务要以正确的方式结束。
我们也可以在未托管的pod中运行任务并等待它完成而不使用Job资源,但是如果发生节点异常或pod在执行任务时被从节点中逐出,则需要手动重新创建该任务。手动做这件事并不合理——特别是如果任务需要几个小时才能完成。
⒉定义(创建)Job
apiVersion: batch/v1 #指定当前描述文件遵循batch/v1版本的KubernetesAPI kind: Job #我们在描述一个Job metadata: name: batch-job #指定Job的名称 spec: #当没有指定pod选择器时它将根据pod模板中的标签创建 template: #创建新pod所使用的pod模板 metadata: labels: app: batch-job #模板中的pod标签显然必须和Job的标签选择器相匹配,否则控制器将无休止的创建新的pod实例。因为创建新的pod不会使实际的副本数量接近期望的副本数量。为了防止出现这种情况,Kubernetes API服务会校验Job的定义不会接收错误的配置。 #不指定Job的标签选择器也是一种选择,因为Job会自动从模板中提取标签,而且描述文件也将更简短 spec: restartPolicy: OnFailure #Job不能使用Always作为默认的重新启动策略 containers: - name: main image: fanqisoft/batch-job ports: - containerPort: 8080
在一个pod的定义中,可以指定在容器中运行的进程结束时,Kubernetes会做什么。这是通过pod配置的属性restartPolicy完成的,默认为Always。Jobpod不能使用默认策略,因为它们不是要无限期地运行。因此,需要明确地将重启策略设置为OnFailure或Never。此设置防止容器在完成任务时重新启动(pod被Job管理时并不是这样的)。
创建以上描述文件后使用kubectl命令创建job
kubectl create -f batch-job.yaml
可以使用kubectl get 和 kubectl describe来检查jobs
kubectl get jobs
kubectl describe jobs
注意:kubectl get pods 默认不会列出已经完成任务的pod,除非使用--show-all(或-a)选项
kubectl get po -a
⒊在Job中运行多个pod实例
作业可以配置为创建多个pod实例,并以并行或串行方式运行它们。这是通过在Job描述文件设置completions和parallelism属性来完成的。
✦顺序运行Job pod
如果你需要一个Job运行多次,则可以将completions设为你希望作业的pod运行多少次。Job将一个接一个地运行五个pod。它最初创建一个pod,当pod的容器运行完成时,它创建第二个pod,以此类推,直到五个pod成功完成。如果其中一个pod发生故障,工作会创建一个新的pod,所以Job总共可以创建五个以上的pod。
apiVersion: batch/v1 #指定当前描述文件遵循batch/v1版本的KubernetesAPI kind: Job #我们在描述一个Job metadata: name: batch-job #指定Job的名称 spec: #当没有指定pod选择器时它将根据pod模板中的标签创建 completions: 5 #将completions设置为5,将使此作业顺序运行5个pod template: #创建新pod所使用的pod模板 metadata: labels: app: batch-job #模板中的pod标签显然必须和Job的标签选择器相匹配,否则控制器将无休止的创建新的pod实例。因为创建新的pod不会使实际的副本数量接近期望的副本数量。为了防止出现这种情况,Kubernetes API服务会校验Job的定义不会接收错误的配置。 #不指定Job的标签选择器也是一种选择,因为Job会自动从模板中提取标签,而且描述文件也将更简短 spec: restartPolicy: OnFailure #Job不能使用Always作为默认的重新启动策略 containers: - name: main image: fanqisoft/batch-job ports: - containerPort: 8080
✦并行运行Job
Job不必一个接一个地运行单个pod,直接让该Job并行运行多个pod。通过配置Job描述文件parallelism属性指定允许多少个pod并行执行。通过将parallelism设置为2,Job创建两个pod并行运行它们,只要其中一个pod完成任务,工作将运行下一个pod,直到五个pod都成功完 成任务。
apiVersion: batch/v1 #指定当前描述文件遵循batch/v1版本的KubernetesAPI kind: Job #我们在描述一个Job metadata: name: batch-job #指定Job的名称 spec: #当没有指定pod选择器时它将根据pod模板中的标签创建 completions: 5 #将completions设置为5,将使此作业顺序运行5个pod,这项任务必须确保5个pod成功完成 parallelism: 2 #最多两个pod可以并行运行 template: #创建新pod所使用的pod模板 metadata: labels: app: batch-job #模板中的pod标签显然必须和Job的标签选择器相匹配,否则控制器将无休止的创建新的pod实例。因为创建新的pod不会使实际的副本数量接近期望的副本数量。为了防止出现这种情况,Kubernetes API服务会校验Job的定义不会接收错误的配置。 #不指定Job的标签选择器也是一种选择,因为Job会自动从模板中提取标签,而且描述文件也将更简短 spec: restartPolicy: OnFailure #Job不能使用Always作为默认的重新启动策略 containers: - name: main image: fanqisoft/batch-job ports: - containerPort: 8080
⒋Job的缩放
我们可以在Job运行时更改Job的parallelism属性。这与缩放ReplicaSet 或ReplicationController类似,可以使用kubectl scale命令完成。
kubect1 scale job {jobName} --replicas 3
由于你将para1lelism从2增加到3,另一个pod立即启动,因此现在有三个pod在运行。
⒌限制Job pod完成任务的时间(超时时间)
Job要等待一个pod多久来完成任务?如果pod卡住并且根本无法完成(或者无法足够快完成),该怎么办?
通过在pod配置中设置activeDeadlineSeconds属性,可以限制pod的时间。如果pod运行时间超过此时间,系统将尝试终止pod,并将Job标记为失败。
注意通过指定Job manifest中的spec.backoffLimit字段,可以配置Job在被标记为失败之前可以重试的次数。如果你没有明确指定它,则默认为6。
⒍