首页 > 解决方案 > 部署多个具有相关环境变量的容器的最佳实践是什么?

问题描述

我正在尝试部署一个并行数据处理任务,该任务使用相同 docker 映像的许多容器,每个容器都使用不同的递增环境变量运行。该图像设置为读取环境变量,以确定要处理的较大列表的哪一部分。

背景:我最初使用的 bash 脚本将递增的 env var 传递给 docker run 命令,但现在我想要一种更好的方法来管理/监视所有容器。我只有将 Kubernetes 用于应用程序服务的经验,但它似乎也是编排我的多容器任务的更好方法。

想知道在 Kubernetes YAML 配置中是否可以进行这种动态环境变量传递,因为我更喜欢声明性配置而不是 shell 脚本。我也不确定在 Kubernetes 中执行此操作的最佳方法是多个单独的 pod、多容器 pod,还是以某种方式使用副本。

我愿意接受建议,我知道 Terraform 等其他工具也可能对这种编程基础设施有所帮助。

标签: dockerkubernetesdata-scienceterraformdata-processing

解决方案


使用Parallel Processing Using Work Queue将不同的环境变量通过 .spec.parallelism 传递给您的 k8s 作业 pod 怎么样。尽管根据您要执行的操作,为工作队列提供单独的服务可能有点过多。

另一个想法是使用 helm 模板功能来创建 k8s 清单文件。我创建了一个示例舵图,以提供模板并行处理的想法。请参阅git repo - helm-parallel-jobs。一旦你克隆了 git repo,你就可以像这样安装 helm chart 进行并行处理。作业模板与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

推荐阅读