【问题标题】:How to mount a volume to a Kubernetes Pod running a docker container from the Airflow host that triggers it using the KubernetesPodOperator如何从使用 KubernetesPodOperator 触发它的 Airflow 主机将卷挂载到运行 docker 容器的 Kubernetes Pod
【发布时间】:2020-10-16 00:39:17
【问题描述】:

我在使用 KubernetesPodOperator 的气流中有一个 DAG,我正在尝试将在 pod 中运行的容器生成的一些文件返回到气流主机。对于开发,我的主机是一个运行 airflow image 和 docker-desktop K8s 集群的 Docker 容器,对于生产,我使用带有 EKS 的 AWS EC2 盒。

volume_mount = VolumeMount('dbt-home',
                           mount_path=<CONTAINER_DIR>,
                           sub_path=None,
                           read_only=False)

volume_config= {
    'hostPath':
      {'path': <HOST_DIR>, 'type': 'DirectoryOrCreate'}
    }

volume = Volume(name="dbt-home", configs=volume_config)


dbt_run = KubernetesPodOperator(
                          namespace='default',
                          image=MY_IMAGE>,
                          cmds=["bash", "-cx"],
                          arguments=[command],
                          env_vars=MY_ENVIRONMENT,
                          volumes=[volume],
                          volume_mounts=[volume_mount],
                          name="test-run",
                          task_id="test-run-task",
                          config_file=config_file,
                          get_logs=True,
                          reattach_on_restart=True,
                          dag=dag
                          )

我尝试对卷使用 hostPath 类型,但我认为它指的是 pod 的主机。我查看了有关卷的 kubernetes 文档,其中我发现 EmptyDir 也没有解决。

【问题讨论】:

  • 我想我可能会提供帮助,因为我使用 PodOperator 和挂载卷,但我不太明白你在问什么。所以,你正在生成一个 pod 来运行你的 DAG,你想挂载什么卷?
  • 嗨@Howard_Roark 我正在从 Airflow DAG 内部生成一个 pod 来运行任务。我在 EC2 上托管了 Airflow。一些日志文件是由任务在 pod 容器中生成的。我想将这些日志文件返回到 Airflow 主机上,以供下一个任务使用。

标签: python docker kubernetes airflow


【解决方案1】:

根据您的评论,您是在询问如何在 pod 中运行的一个任务如何完成并将日志写入到 pod 中运行的另一个任务在启动时可以读取的位置。看起来你可以做一些事情。

  1. 您可以让您的任务开始获取通过 kubectl get logs 完成的前一个 pod 的日志(即将 kubectl 放入您的任务映像并允许其服务帐户获取该命名空间中的 pod 日志)或使用 Kubernetes python API 获取日志。
  2. 您可以将 pvc 挂载到您的初始任务中的某个位置并在那里写入日志,然后当它完成时,您可以将相同的 pvc 挂载到您的下一个任务中,它可以从该位置读取日志。如果一次只能挂载到一个 pod 中,则可以使用 ebs;如果一次挂载到多个 pod 中,则可以使用 nfs。可能 nfs 会很有意义,这样您就可以一次在 pod 中的多个任务之间共享您的日志。
  3. 您可以将日志发送至Cloudwatch via fluentd。然后,您的任务可以查询 Cloudwatch 以获取上一个任务的日志。我认为将您的日志传送到 Cloudwatch 是一种很好的做法,因此您不妨这样做。

我不确定您是否正在寻找一种更自然的气流方式来执行此操作,但这些想法可以解决您的问题。

【讨论】:

  • 我正在尝试将多个卷挂载到 KubernetesPodOperator,第二个volumeMount 我收到了FileNotFoundError: [Errno 2] No such file or directory: '/data/airflow/report_configs'。我相信volumes和volumeMounts是列表类型,并且会在列表中安装所有的volumes(每个都有不同的pvc/pv)。添加多个卷/volumeMount 不起作用。有什么建议吗??
  • 你应该能够做到这一点。您可以在此处查看规范:airflow.apache.org/docs/apache-airflow/stable/_api/airflow/…
  • 一个问题。当我们提到 KubernetesPodOperator 的卷和 volumeMounts 时,它是创建一个还是我们需要在将它用于 KubernetesPodOperator 之前创建它?我先创建了一个,然后尝试安装它,但仍然看到FileNotFoundError: [Errno 2] No such file or directory: '/data/airflow/report_configs'。此外,有问题的卷没有安装在其他任何地方..
  • 配置volume = [ Volume(name='volume1', configs={'persistentVolumeClaim': {'claimName': 'volume_claim_1'}}), Volume(name='volume2', configs={'persistentVolumeClaim': {'claimName': 'volume_claim_2'}}) ] volume_mount = [ VolumeMount('volume1',mount_path='/data/airflow/',sub_path=None,read_only=False), VolumeMount('volume2',mount_path='/kubeop/airflow/',sub_path=None,read_only=False)]
  • 我不确定您的语法是否遵循 KubernetesPodOperator 规范,因为在 cmets 中很难阅读。您可以尝试遵循此人的示例:varlogdiego.com/airflow-kubernetes-operator 关于您的其他问题,您可以提前创建 pvc,然后在规范的 Volume 定义中引用,然后将其传入以安装在给定路径
猜你喜欢
  • 2017-01-01
  • 2021-01-13
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多