如何在 kubeflow 管道中传递环境变量?

Posted

技术标签:

【中文标题】如何在 kubeflow 管道中传递环境变量?【英文标题】:How to pass an environmental variable in kubeflow pipeline? 【发布时间】:2020-03-27 17:56:19 【问题描述】:

我希望gcr.io/******/serve_model:lat5 Image 可以访问该变量,这是gcr.io/******/deployservice:lat2 的参数

最初我尝试将变量作为参数传递,但它不起作用,所以我试图将它作为环境变量传递。 我的环境变量将是一个 GCP 存储桶的 URL,我的 serve_model 将从该存储桶访问 .sav 模型文件。

        name='web-ui',
        image='gcr.io/******/deployservice:lat2',
        arguments=[
        '--image', 'gcr.io/******/serve_model:lat5',
        '--name', 'web-ui',
        '--container-port', '8080',
        '--service-port', '80',
        '--service-type', "LoadBalancer"
        ]
        ).add_env_variable(V1EnvVar(name='modelurl', value=Model_Path))

【问题讨论】:

你想只传递一个值吗?你考虑过ConfigMap 吗? kubernetes.io/docs/tasks/configure-pod-container/… 是的,我只想传递一个值.. 加载我的模型的 url @PjoterS 我将我的环境变量在我的管道 python 文件中传递为:web_ui.container.add_env_variable(V1EnvVar(name='modelurl', value=Model_Path)) 并将以下内容放入我的 .sh 文件中以在 kubeflow(kubernetes) 中运行:kubectl create configmap modelurl --from-literal=modelurl=Model_Path 这是对的方式? 【参考方案1】:

add_env_variable()Container 对象的函数,它作为 ContainerOp 的属性公开。

所以像下面这样的东西会起作用。参考kfp dsl代码here

model_path = 'gcp://dummy-url'
container_op = ContainerOp(name='web-ui',
                               image='gcr.io/******/deployservice:lat2',
                               arguments=[
                                   '--image', 'gcr.io/******/serve_model:lat5',
                                   '--name', 'web-ui',
                                   '--container-port', '8080',
                                   '--service-port', '80',
                                   '--service-type', "LoadBalancer"]
                               )
container_op.container.add_env_variable(V1EnvVar(name='model_url', value=model_path))

您可以通过检查 -containerenv 部分的 zip 中的 YAML 来验证这一点

  - container:
      args:
      - --image
      - gcr.io/******/serve_model:lat5
      - --name
      - web-ui
      - --container-port
      - '8080'
      - --service-port
      - '80'
      - --service-type
      - LoadBalancer
      env:
      - name: modelurl
        value: gcp://dummy-url <--the static env value
      image: gcr.io/******/deployservice:lat2

【讨论】:

似乎已经使用了这个但没有粘贴有问题的整个代码。 问题中发布的代码在) 之后运行add_env_variable(),这使得它看起来像是在ContainerOp 对象上运行它,而不是 i> 嵌套在里面的Container 对象。运行上面的代码应该会得到 env 中的 URL(检查上面的 yaml sn-p)。如果您的 yaml 显示这样,则 env var 应该可以在管道中访问。我的观点是,如果 URL 路径是静态字符串,则不需要 ConfigMap。【参考方案2】:

将其发布为社区 Wiki 以获得更好的可见性,因为原始海报能够传递此变量。

这是传递价值的最佳Kubernetes方式。

ConfigMap 是一个配置设置字典。这 字典由字符串的键值对组成。 Kubernetes 提供 这些值到您的容器中。 ConfigMap 存储配置 您的代码的设置。存储连接字符串、公共凭证、 ConfigMap 中的主机名和 URL。

您可以通过多种方式(从文件、手动等)创建ConfigMap。更多信息可以找到here。

解决方案

根据原始海报评论:

1.使用管道python文件和container函数add_env_variable传递环境变量:

web_ui.container.add_env_variable(V1EnvVar(name='modelurl', value=Model_Path))

2. 准备命令,该命令将创建具有适当值的配置映射:

kubectl create configmap modelurl --from-literal=modelurl=Model_Path

3. 将之前的命令放入脚本中,该脚本将在Kubeflow 中使用。

【讨论】:

以上是关于如何在 kubeflow 管道中传递环境变量?的主要内容,如果未能解决你的问题,请参考以下文章

如何连接 kubeflow 管道组件

如何获取/获取 Jenkins 管道中设置的环境变量到我们的 maven pom.xml

无法将环境变量传递给 azure 管道 yaml 中的 powershell 脚本(非内联)

如何将 OutputPathPlaceholder 与带有 Kubeflow 管道的字符串连接起来?

如何扩展 kubeflow 管道(使用顶点 ai),或者它只是自动完成

管道符和作业控制shell变量环境变量配置文件