如何将单个文件作为卷挂载到KubernetesPodOperator?

时间:2019-09-10 20:31:26

标签: google-kubernetes-engine airflow google-cloud-composer

我有一个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)

3 个答案:

答案 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