在部署具有相关环境变量的多个容器时,有哪些最佳实践?

1 人关注

我正在尝试部署一个并行的数据处理任务,该任务使用同一docker镜像的许多容器,每个容器将以不同的增量环境变量运行。镜像被设置为读取环境变量,以确定要处理更大的列表中的哪一段。

背景。我 最初使用的是一个bash脚本,将一个递增的env var传递给docker运行命令,但现在我想用一个更好的方法来管理/监控所有的容器。我只有在应用服务中使用Kubernetes的经验,但它似乎也是协调多容器任务的一个更好的方法。

我想知道在Kubernetes的YAML配置中是否可以实现这种动态环境变量的传递,因为我更喜欢声明式的配置而不是shell脚本。我也不确定在Kubernetes中这样做的最佳方法是什么,是多个独立的pod,多容器pod,还是以某种方式使用副本。

我愿意接受建议,我知道像Terraform这样的其他工具可能对这种程序化的基础设施也有帮助。

4 个评论
是的,正是因为这是我目前看到的最相关的文档页,但即使如此,它也让我相信这在单一的声明式配置中是不可能的。
从文件中。 Next, expand the template into multiple files, one for each item to be processed. # Expand files into a temporary directory $ mkdir ./jobs $ for i in apple banana cherry do cat job-tmpl.yaml | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml done 这种通过脚本生成多个配置文件的方式正是我想避免的,选择使用 spec.但我找不到一种方法来传递/访问与工作有关的环境变量,而这种方法最终可以让我在容器中获得一个描述100个荚的1号这样的值
我宁愿使用Helm来制作模板
docker
kubernetes
data-science
terraform
data-processing
ev-dev
ev-dev
发布于 2018-08-26
2 个回答
Jay Rajput
Jay Rajput
发布于 2018-08-27
0 人赞同

使用 工作队列进行并行处理 ,将不同的环境变量传递给带有.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