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。

 

  

posted @ 2019-08-28 15:36  SpringCore  阅读(1269)  评论(0编辑  收藏  举报