我有一个Docker映像,该映像在启动时会期望安装一个JSON凭证文件。容器通过以下命令启动:
docker run -v [CREDENTIALS_FILE]:/credentials.json image_name
此图像位于Google容器注册表中,我想使用KubernetesPodOperator在Cloud Composer dag中启动它。
是否可以通过KubernetesPodOperator挂载单个文件?理想情况下,此文件将托管在Cloud Storage位置。我读到有一个volume / volume_mount选项,但传递单个文件似乎很繁琐-希望我忽略了另一个选项。
KubernetesPodOperator(namespace='default',
image="gcr.io/image_name,
name="start-container-image",
task_id="start-container-image",
volume=[?],
volume_mounts=[?],
dag=dag)
答案 0 :(得分:1)
k8s允许您装载卷(对于静态数据,configMap可以这样做,并且不会造成很大的负担)。 否则,如果您需要从不支持备份PV的远程存储(例如GCS)中远程提取数据,则需要直接提取数据。
您可能要考虑使用initContainer,该{{3}}仅用于从远程存储下载数据并将其保存在本地,以便您的主应用程序可以在本地使用数据运行。
答案 1 :(得分:1)
我使用Patrick W的建议并通过了configMap来解决这个问题。我应该将其更新为使用秘密,但这是到目前为止的实现:
首先,我创建了configMap:
kubectl create configmap credentials-configmap --from-file=./credentials.json
接下来,在我的DAG中,设置音量选项。注意,我不得不将mount_path修改为子目录“ / config /”,因为安装到“ /”时它会出错。
volume_mount = VolumeMount('creds-volume',
mount_path='/config/',
sub_path=None,
read_only=False)
volume_config = {
'configMap': {
'name': 'creds-volume'
}
}
volume = Volume(name='creds-volume', configs=volume_config)
这将传递给KuberenetesPodOperator:
KubernetesPodOperator(
volumes=[volume],
volume_mounts=[volume_mount],
...excluding other options for brevity
)
最后,容器在启动脚本期间将其利用,如下所示:
gcloud auth activate-service-account --key-file=/config/credentials.json
答案 2 :(得分:0)
以 David 的回答为基础,要修复已安装卷的权限问题,请使用以下命令:
volume_config = {
"configMap": {
"name": "foobar",
"defaultMode": 0o744
}
}
请注意,Python 3 中的默认模式写为 0o744,而不是 YAML 中的 0744。