Kubernetes
  • 序言
  • 基礎入門
    • Kubernetes 簡介
    • Kubernetes 基本概念
    • Kubernetes 101
    • Kubernetes 201
    • Kubernetes 集群
  • 核心原理
    • 核心原理
    • 架構原理
    • 設計理念
    • 核心組件
      • etcd
      • kube-apiserver
      • kube-scheduler
      • kube-controller-manager
      • kubelet
      • kube-proxy
      • kube-dns
      • Federation
      • kubeadm
      • hyperkube
      • kubectl
    • 資源對象
      • Autoscaling
      • ConfigMap
      • CronJob
      • CustomResourceDefinition
      • DaemonSet
      • Deployment
      • Ingress
      • Job
      • LocalVolume
      • Namespace
      • NetworkPolicy
      • Node
      • PersistentVolume
      • Pod
      • PodPreset
      • ReplicaSet
      • Resource Quota
      • Secret
      • SecurityContext
      • Service
      • ServiceAccount
      • StatefulSet
      • Volume
  • 部署配置
    • 部署指南
    • kubectl 安裝
    • 單機部署
    • 特性開關
    • 最佳配置
    • 版本支持
    • 集群部署
      • kubeadm
      • kops
      • Kubespray
      • Azure
      • Windows
      • LinuxKit
      • kubeasz
    • 附加組件
      • Addon-manager
      • DNS
      • Dashboard
      • 監控
      • 日誌
      • Metrics
      • GPU
      • Cluster Autoscaler
      • ip-masq-agent
    • Kubernetes-The-Hard-Way
      • 準備部署環境
      • 安裝必要工具
      • 創建計算資源
      • 配置創建證書
      • 配置生成配置
      • 配置生成密鑰
      • 部署 Etcd 群集
      • 部署控制節點
      • 部署計算節點
      • 配置 Kubectl
      • 配置網絡路由
      • 部署 DNS 擴展
      • 煙霧測試
      • 刪除集群
  • 插件擴展
    • API 擴展
      • Aggregation
      • CustomResourceDefinition
    • 訪問控制
      • 認證
      • RBAC 授權
      • 准入控制
    • Scheduler 擴展
    • 網絡插件
      • CNI
      • Flannel
      • Calico
      • Weave
      • Cilium
      • OVN
      • Contiv
      • SR-IOV
      • Romana
      • OpenContrail
      • Kuryr
    • 運行時插件 CRI
      • CRI-tools
      • Frakti
    • 存儲插件
      • 容器存儲接口 CSI
      • FlexVolume
      • glusterfs
    • 網絡策略
    • Ingress Controller
      • Ingress + Letsencrypt
      • minikube Ingress
      • Traefik Ingress
      • Keepalived-VIP
    • Cloud Provider 擴展
    • Device 插件
  • 服務治理
    • 服務治理
      • 一般準則
      • 滾動升級
      • Helm
      • Operator
      • Service Mesh
      • Linkerd
      • Linkerd2
    • Istio
      • 安裝
      • 流量管理
      • 安全管理
      • 策略管理
      • 度量管理
      • 排錯
      • 社區
    • Devops
      • Draft
      • Jenkins X
      • Spinnaker
      • Kompose
      • Skaffold
      • Argo
      • Flux GitOps
  • 實踐案例
    • 實踐概覽
    • 資源控制
    • 集群高可用
    • 應用高可用
    • 調試
    • 端口映射
    • 端口轉發
    • 用戶管理
    • GPU
    • HugePage
    • 安全
    • 審計
    • 備份恢復
    • 證書輪換
    • 大規模集群
    • 大數據與機器學習
      • Spark
      • Tensorflow
    • Serverless
  • 排錯指南
    • 排錯概覽
    • 集群排錯
    • Pod 排錯
    • 網絡排錯
    • PV 排錯
      • AzureDisk
      • AzureFile
    • Windows 排錯
    • 雲平臺排錯
      • Azure
    • 排錯工具
  • 社區貢獻
    • 開發指南
    • 單元測試和集成測試
    • 社區貢獻
  • 附錄
    • 生態圈
    • 學習資源
    • 國內鏡像
    • 如何貢獻
    • 參考文檔
Powered by GitBook
On this page
  • API 版本對照表
  • Job 類型
  • Job Controller
  • Job Spec 格式
  • Indexed Job
  • Pod 自動清理
  • 暫停和重啓 Job
  • Bare Pods
  • 參考文檔
  1. 核心原理
  2. 資源對象

Job

Job 負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個 Pod 成功結束。

API 版本對照表

Kubernetes 版本
Batch API 版本
默認開啓

v1.5+

batch/v1

是

Job 類型

Kubernetes 支持以下幾種 Job:

  • 非並行 Job:通常創建一個 Pod 直至其成功結束

  • 固定結束次數的 Job:設置 .spec.completions,創建多個 Pod,直到 .spec.completions 個 Pod 成功結束

  • 帶有工作隊列的並行 Job:設置 .spec.Parallelism 但不設置 .spec.completions,當所有 Pod 結束並且至少一個成功時,Job 就認爲是成功

根據 .spec.completions 和 .spec.Parallelism 的設置,可以將 Job 劃分爲以下幾種 pattern:

Job 類型
使用示例
行爲
completions
Parallelism

一次性 Job

數據庫遷移

創建一個 Pod 直至其成功結束

1

1

固定結束次數的 Job

處理工作隊列的 Pod

依次創建一個 Pod 運行直至 completions 個成功結束

2+

1

固定結束次數的並行 Job

多個 Pod 同時處理工作隊列

依次創建多個 Pod 運行直至 completions 個成功結束

2+

2+

並行 Job

多個 Pod 同時處理工作隊列

創建一個或多個 Pod 直至有一個成功結束

1

2+

Job Controller

Job Controller 負責根據 Job Spec 創建 Pod,並持續監控 Pod 的狀態,直至其成功結束。如果失敗,則根據 restartPolicy(只支持 OnFailure 和 Never,不支持 Always)決定是否創建新的 Pod 再次重試任務。

Job Spec 格式

  • spec.template 格式同 Pod

  • RestartPolicy 僅支持 Never 或 OnFailure

  • 單個 Pod 時,默認 Pod 成功運行後 Job 即結束

  • .spec.completions 標誌 Job 結束需要成功運行的 Pod 個數,默認爲 1

  • .spec.parallelism 標誌並行運行的 Pod 的個數,默認爲 1

  • spec.activeDeadlineSeconds 標誌失敗 Pod 的重試最大時間,超過這個時間不會繼續重試

一個簡單的例子:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
# 創建 Job
$ kubectl create -f ./job.yaml
job "pi" created
# 查看 Job 的狀態
$ kubectl describe job pi
Name:        pi
Namespace:    default
Selector:    controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
Labels:        controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
        job-name=pi
Annotations:    <none>
Parallelism:    1
Completions:    1
Start Time:    Tue, 27 Jun 2017 14:35:24 +0800
Pods Statuses:    0 Running / 1 Succeeded / 0 Failed
Pod Template:
  Labels:    controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
        job-name=pi
  Containers:
   pi:
    Image:    perl
    Port:
    Command:
      perl
      -Mbignum=bpi
      -wle
      print bpi(2000)
    Environment:    <none>
    Mounts:        <none>
  Volumes:        <none>
Events:
  FirstSeen    LastSeen    Count    From        SubObjectPath    Type        Reason            Message
  ---------    --------    -----    ----        -------------    --------    ------            -------
  2m        2m        1    job-controller            Normal        SuccessfulCreate    Created pod: pi-nltxv

# 使用'job-name=pi'標籤查詢屬於該 Job 的 Pod
# 注意不要忘記'--show-all'選項顯示已經成功(或失敗)的 Pod
$ kubectl get pod --show-all -l job-name=pi
NAME       READY     STATUS      RESTARTS   AGE
pi-nltxv   0/1       Completed   0          3m

# 使用 jsonpath 獲取 pod ID 並查看 Pod 的日誌
$ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
3.141592653589793238462643383279502...

固定結束次數的 Job 示例

apiVersion: batch/v1
kind: Job
metadata:
  name: busybox
spec:
  completions: 3
  template:
    metadata:
      name: busybox
    spec:
      containers:
      - name: busybox
        image: busybox
        command: ["echo", "hello"]
      restartPolicy: Never

Indexed Job

通常,當使用 Job 來運行分佈式任務時,用戶需要一個單獨的系統來在 Job 的不同 worker Pod 之間分配任務。比如,設置一個工作隊列,逐一給每個 Pod 分配任務。Kubernetes v1.21 新增的 Indexed Job 會給每個任務分配一個數值索引,並通過 annotation batch.kubernetes.io/job-completion-index 暴露給每個 Pod。使用方法爲在 Job spec 中設置 completionMode: Indexed。

Pod 自動清理

TTL 控制器用來自動清理已經結束的 Pod,如處於 Complete 或 Failed 狀態的 Job。Pod 停止之後的 TTL 可以通過 .spec.ttlSecondsAfterFinished 來設置。

注意,該特性要求集群中各節點(包括控制節點)的時間一致,比如在所有節點中運行 NTP 服務。

暫停和重啓 Job

從 v1.21 開始,可通過 .spec.suspend 暫停和重啓 Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: myjob
spec:
  suspend: true
  parallelism: 1
  completions: 5
  template:
    spec:
      ...

當 Job 暫停後,Job conditions 中會新增一條 Job 暫停的事件:

$ kubectl get jobs/myjob -o yaml
apiVersion: batch/v1
kind: Job
# .metadata and .spec omitted
status:
  conditions:
  - lastProbeTime: "2021-02-05T13:14:33Z"
    lastTransitionTime: "2021-02-05T13:14:33Z"
    status: "True"
    type: Suspended
  startTime: "2021-02-05T13:13:48Z"

Bare Pods

所謂 Bare Pods 是指直接用 PodSpec 來創建的 Pod(即不在 ReplicaSets 或者 ReplicationCtroller 的管理之下的 Pods)。這些 Pod 在 Node 重啓後不會自動重啓,但 Job 則會創建新的 Pod 繼續任務。所以,推薦使用 Job 來替代 Bare Pods,即便是應用只需要一個 Pod。

參考文檔

PreviousIngressNextLocalVolume

Last updated 1 year ago

Jobs - Run to Completion