Объем Kubernetes (мини-куб) установлен (по значениям управления воздушным потоком), но остается пустым

#kubernetes #airflow #minikube #docker-volume

Вопрос:

Я хотел бы развернуть воздушный поток локально на Minikube и установить локальную папку для обработки DAG.

Воздушный поток развертывается следующим образом:

 helm install $AIRFLOW_NAME apache-airflow/airflow 
    --values values.yml 
    --set logs.persistence.enabled=true 
    --namespace $AIRFLOW_NAMESPACE 
    --kubeconfig ~/.kube/config
 

values.yml Выглядит это примерно так:

 executor: KubernetesExecutor
config:
  core:
    dags_folder: /dags
webserver:
  extraVolumes:
    - name: dags
      hostPath:
        path: /path/dags
  extraVolumeMounts:
    - name: dags
      mountPath: /dags
 

kubectl describe pods airflow-webserver --kubeconfig ~/.kube/config --namespace airflow :

 Volumes:
  config:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      airflow-airflow-config
    Optional:  false
  logs:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  airflow-logs
    ReadOnly:   false
  dags:
    Type:          HostPath (bare host directory volume)
    Path:          /path/dags/
    HostPathType:  
  airflow-webserver-token-xtq9h:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  airflow-webserver-*
    Optional:    false
QoS Class:       BestEffort
 

Кажется, что DAG тома установлены правильно, но они остаются пустыми.
Что может вызвать такое поведение ?

Редактировать: kubectl describe pods airflow-scheduler-0 --kubeconfig ~/.kube/config --namespace airflow

     Mounts:
      /opt/airflow/airflow.cfg from config (ro,path="airflow.cfg")
      /opt/airflow/dags from dags (rw)
      /opt/airflow/logs from logs (rw)
      /opt/airflow/pod_templates/pod_template_file.yaml from config (ro,path="pod_template_file.yaml")
      /var/run/secrets/kubernetes.io/serviceaccount from airflow-scheduler-token-9zfpv (ro)
 
 Volumes:
  config:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      airflow-airflow-config
    Optional:  false
  dags:
    Type:          HostPath (bare host directory volume)
    Path:          /path/dags
    HostPathType:  
  logs:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  airflow-logs
    ReadOnly:   false
  airflow-scheduler-token-9zfpv:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  airflow-scheduler-token-9zfpv
    Optional:    false
 

Ответ №1:

Предполагая, что у вас уже есть некоторые dag в /path/dag, вам следует подключить папку dag к планировщику, а не к веб-серверу (если вы используете Airflow 2). Планировщик-это тот, кто анализирует dag, веб-сервер отображает их только на основе информации, хранящейся в БД, поэтому на самом деле ему не нужны DAG (раньше он нуждался в этом в версии 1.10 без сериализации).

Также я думаю, что вам следует использовать LocalExecutor, а не KubernetesExecutor, если вы хотите выполнять dag из локальной папки — тогда dags подключенный к планировщику будет доступен для процессов, которые создаются из планировщика в том же контейнере.

Если вы хотите запустить Kubernetes Executor и хотите смонтировать папку хоста, я полагаю, вам нужно будет добавить ее в качестве монтирования в свой файл шаблона pod (вы можете создать такой файл шаблона pod с помощью интерфейса командной строки airflow

Видишь https://airflow.apache.org/docs/apache-airflow/stable/executor/kubernetes.html#pod-template-file

Комментарии:

1. Я добавил те же самые дополнительные / дополнительные модули в планировщик и попытался использовать как LocalExecutor, так и KubernetesExecutor, но не смог увидеть свою DAG в пользовательском интерфейсе веб-сервера. Смонтированная папка DAG в планировщике также пуста. Проблема, похоже, связана с монтированием, которое не добавляет мои локальные файлы DAG, не так ли ? Я также попробую использовать файл pod_template_file, спасибо !

Ответ №2:

Причина, по которой ваша папка монтирования пуста, заключается в том, что я предполагаю, что вы используете рабочий стол Docker на macOS (это мое дикое предположение).

Ваши dag должны присутствовать в папке /path/dag на хосте, однако в случае рабочего стола Docker на macOS (аналогично в Windows) ваш хост является виртуальной машиной, а не macOS/Windows.

В этом случае вам необходимо убедиться, что /путь/dag с вашего хоста также сопоставлен с виртуальной машиной (по умолчанию сопоставляются только эти папки:

Через: https://docs.docker.com/desktop/mac/

По умолчанию каталог /Users, /Volume, /private, /tmp и /var/папки являются общими

Вы также можете добавлять новые папки с вашего хоста для общего доступа (см. главу «Общий доступ к файлам» в документе выше).

Комментарии:

1. Привет, Джерек, я использую Ubuntu 20.04.2 и Docker 20.10.7. Я не вижу никакой причины, по которой мои локальные файлы не отображаются в моей смонтированной папке

2. Да, это странно. Вы уверены, что используете локальный движок docker ? Может быть, там есть какая-то изоляция. Интересно, если docker run -it -v /path/dags:/paths/dags bash бы ты побежал, ты бы увидел там свои кинжалы?

3. Я действительно вижу там свои даги, набрав эту команду ! Я попробовал запустить minikube start --driver=docker , и он показывает Preparing Kubernetes v1.20.7 on Docker 20.10.7 , что относится к моей локальной версии докера

Ответ №3:

Я полностью перепутал hostPath параметр для моей локальной машины. hostPath относится к узлу мини-куба, на котором запущен модуль.

   extraVolumes:
    - name: dags
      hostPath:
        path: /mnt/airflow/dags
        type: Directory
  extraVolumeMounts:
    - name: dags
      mountPath: /opt/airflow/dags
 

Это позволит смонтировать том между узлом хоста Minikube и портом.
Путь /mnt/airflow/dags не должен присутствовать на локальном компьютере.

Затем локальную папку DAG можно подключить к узлу Minikube:

minikube mount ./dags/:/mnt/airflow/dags

См.: https://medium.com/@ipeluffo/running-apache-airflow-locally-on-kubernetes-minikube-31f308e3247a