参考文兼 https://kubernetes.io/docs/tasks/job/indexed-parallel-processing-static/
今天要来实作 Indexed Job for Parallel Processing with Static Work Assignment 这个任务
这个任务的主要内容是透过 Index Job 来同步处理一个文字档案内容
把内容读出来在使用 rev 功能把内容字串反转出来印到 console 上
k8s api version 需要再 1.21 以上
1 建制一个 Index Job Deployment 来处理反转字串的功能
2 使用 Downward API 来设定 Index
要达成这样的设定有以下几种作法
1 透过环境变数 JOB_COMPLETION_INDEX: Job Controller 会自动把这个变数带入
2 读取一个档案包含这个完成的 Index
3 假设不能修改程序, 可以使用一个 script 从上面的方法中拿到 Index 然後带入执行参数
建立 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 直接把 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 在最後一行才出现版本限制讯息
说明 我在本系列文章中,主要是采用 IntelliJ-IDEA 作为示范。但我不会在文章中跟你讲述如...
参考大神文章 哈罗大家好,今天要用跟昨天一样的资料集,由於用PCA做降维的效果不是那麽好,於是我参...
接到 User 说网路不通 , 你可以请 User 先看一下主机後方网路线是否灯号有亮或重新插拔一下...
今天我们来实作怎麽『 透过 AWS 服务把 Google Analytics 资料撷取存放至 AWS...
之前已介绍过 Computer, Advanced Computer, Pocket Compute...