如何在 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))
您可以通过检查 -container
下 env
部分的 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 管道中传递环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何获取/获取 Jenkins 管道中设置的环境变量到我们的 maven pom.xml
无法将环境变量传递给 azure 管道 yaml 中的 powershell 脚本(非内联)
如何将 OutputPathPlaceholder 与带有 Kubeflow 管道的字符串连接起来?