我正在尝试部署一个并行的数据处理任务,该任务使用同一docker镜像的许多容器,每个容器将以不同的增量环境变量运行。镜像被设置为读取环境变量,以确定要处理更大的列表中的哪一段。
背景。我 最初使用的是一个bash脚本,将一个递增的env var传递给docker运行命令,但现在我想用一个更好的方法来管理/监控所有的容器。我只有在应用服务中使用Kubernetes的经验,但它似乎也是协调多容器任务的一个更好的方法。
我想知道在Kubernetes的YAML配置中是否可以实现这种动态环境变量的传递,因为我更喜欢声明式的配置而不是shell脚本。我也不确定在Kubernetes中这样做的最佳方法是什么,是多个独立的pod,多容器pod,还是以某种方式使用副本。
我愿意接受建议,我知道像Terraform这样的其他工具可能对这种程序化的基础设施也有帮助。
使用 工作队列进行并行处理 ,将不同的环境变量传递给带有.spec.parallelism的k8s job pods如何?虽然为工作队列设置一个单独的服务可能有点过了,这取决于你想做什么。
另一个想法可以是使用舵手的模板化能力来创建一个k8s清单文件。我创建了一个Helm图表的样本,让大家对模板化的并行处理有一个概念。见 git repo - helm-parallel-jobs 。一旦你克隆了git repo,你可以像这样安装用于并行处理的舵手图。作业的模板与 k8s文档 所使用的相同。从下面的输出中可以看出,提供了三个不同的环境变量--apple,banana,cherry,这就创建了3个不同的pod,并将环境变量传递给它们。
[root@jr]# helm install --set envs='{apple,banana,cherry}' --name jobs ./helm-parallel-jobs/example/parallel-jobs NAME: jobs LAST DEPLOYED: Sun Aug 26 16:29:23 2018 NAMESPACE: default STATUS: DEPLOYED RESOURCES: ==> v1/Job NAME DESIRED SUCCESSFUL AGE process-item-apple 1 0 0s process-item-banana 1 0 0s process-item-cherry 1 0 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE process-item-apple-dr6st 0/1 ContainerCreating 0 0s process-item-banana-d2wwq 0/1 ContainerCreating 0 0s process-item-cherry-wvlxz 0/1 ContainerCreating 0 0s