IT 铁人赛 k8s 入门30天 -- day25 Indexed Job for Parallel Processing with Static Work Assignment

前言

参考文兼 https://kubernetes.io/docs/tasks/job/indexed-parallel-processing-static/

今天要来实作 Indexed Job for Parallel Processing with Static Work Assignment 这个任务

这个任务的主要内容是透过 Index Job 来同步处理一个文字档案内容

把内容读出来在使用 rev 功能把内容字串反转出来印到 console 上

prequest

k8s api version 需要再 1.21 以上

布署目标

1 建制一个 Index Job Deployment 来处理反转字串的功能

2 使用 Downward API 来设定 Index

任务分析

取得完成任务的 Index

要达成这样的设定有以下几种作法

1 透过环境变数 JOB_COMPLETION_INDEX: Job Controller 会自动把这个变数带入

2 读取一个档案包含这个完成的 Index

3 假设不能修改程序, 可以使用一个 script 从上面的方法中拿到 Index 然後带入执行参数

建制一个 Index Job Deployment 来处理反转字串的功能

建立 indexed-job.yaml 如下

apiVersion: batch/v1
kind: Job
metadata:
  name: 'indexed-job'
spec:
  completions: 5
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      restartPolicy: Never
      initContainers:
      - name: 'input'
        image: 'docker.io/libray/bash'
        command:
        - "bash"
        - "-c"
        - |
          items=(foo bar baz qux xyz)
          echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txt
        volumeMounts:
        - mountPath: /input
          name: input
      containers:
      - name: "workder"
        image: "docker.io/library/busybox"
        command:
        - "rev"
        - "/input/data.txt"
        volumeMounts:
        - mountPath: /input
          name: input
      volumes:
      - name: input
        emptyDir: {}

建立一个 Job

名称设定为 indexed-job

completions 设定为 5 代表要产生 5 个 Job 才能完成

parallelism 设定为 3 代表一次最多同时开启 3 个 Job

initContainer 设定 image 使用 "docker.io/library/bash"

initContainer 设定执行指令如下

bash -c items=(foo bar baz qux xyz) echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txt

initContainer 设定挂载路径为 /input, 名称为 input

container 设定 image 为 "docker.io/library/busybox"

cotainer 设定执行指令如下

rev /input/data.txt

container 设定挂载路径为 /input, 名称为 input

注意的是 initContainer 用来做环境初始化

这边透过 JOB_COMPLETION_INDEX 这个环境变数让 initConatiner

把对应的值塞入分配到的 container 内

建制指令如下

kubectl apply -f indexed-job.yaml

查看布署结果使用以下指令

kubectl describe jobs/indexed-job

查看执行内容

选取其中一个 Job 查看 log

kubectl logs -f $job_name

使用 Downward API 来设定 Index

另外一个作法是透过 Downward API 直接把 job-completion-index 当作 filecontent

设定 indexed-job-vol.yaml 如下

apiVersion: batch/v1
kind: Job
metadata:
  name: 'indexed-job
  annotations:
  
spec:
  completions: 5
  parallelism: 3
  completionMode: Indexed
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: 'worker'
        image: 'docker.io/library/busybox'
        command:
        - "rev"
        - "/input/data.txt"
        volumeMounts:
        - mountPath: /input
          name: input
      volumes:
      - name: input
        downwardAPI:
          items:
          - path: "data.txt"
            fieldRef:
              fieldPath: metadata.annotations['batch.kubernetes.io/job-completion-index']

建立一个 Job

名称设定为 indexed-job

completions 设定为 5 代表要产生 5 个 Job 才能完成

parallelism 设定为 3 代表一次最多同时开启 3 个 Job

container 设定 image 为 "docker.io/library/busybox"

cotainer 设定执行指令如下

rev /input/data.txt

container 设定挂载路径为 /input, 名称为 input

不同的是这次的 data.txt 内容直接使用 Dowdward API 的方式

把 job-completion-index 当作档案内容

建制指令如下

kubectl apply -f indexed-job-vol.yaml

查询执行 logs 结果如下:

後记

这次使用 minikube 执行时, 一开始没开启 IndexJob API

导致 JOB_COMPLETION_INDEX 一直无法读取到

直到笔者在 stackoverflow 查询 minikube index job 这篇 kubernetes-indexed-job-does-not-works

才发现需要使用以下指令把 IndexJob 功能开启

minikube start --feature-gates=IndexedJob=true

写到这边有些感想

在实践功能的时候, 检查执行环境真的很重要

比如使用某版 go-ethereum client 要去连线 JSONRPC 就要 go1.15 以上

偏偏 debug log 在最後一行才出现版本限制讯息


<<:  [Day 24] 实作-日期格式转换 字串长度限制

>>:  DAY24 linebot完结篇

Java 开发 WEB 的好平台 -- Grails -- (2) 新增一个 Grails 专案

说明 我在本系列文章中,主要是采用 IntelliJ-IDEA 作为示范。但我不会在文章中跟你讲述如...

DAY5:Kaggle-Data Science London + Scikit-learn(二)

参考大神文章 哈罗大家好,今天要用跟昨天一样的资料集,由於用PCA做降维的效果不是那麽好,於是我参...

网路方面被问到的案例整理 - 你也可以成为网路高手

接到 User 说网路不通 , 你可以请 User 先看一下主机後方网路线是否灯号有亮或重新插拔一下...

【Day 08】 实作 - 透过 AWS 服务 - AppFlow 把 Google Analytics 资料存放至 AWS 中 ( 1 )

今天我们来实作怎麽『 透过 AWS 服务把 Google Analytics 资料撷取存放至 AWS...

Day26 小乌龟登场,麦块的强大帮手

之前已介绍过 Computer, Advanced Computer, Pocket Compute...