#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