3

客观的

我想在 Kubernetes 上部署 Airflow,其中 pod 可以在共享持久卷中访问相同的 DAG。根据文档(https://github.com/helm/charts/tree/master/stable/airflow#using-one-volume-for-both-logs-and-dags),看来我必须设置并通过Helm 的这些值:extraVolume, extraVolumeMount, persistence.enabled, logsPersistence.enabled, dags.path, logs.path.

问题

我在安装官方 Helm 图表时传递的任何自定义值都会导致类似于以下内容的错误:

Error: YAML parse error on airflow/templates/deployments-web.yaml: error converting YAML to JSON: yaml: line 69: could not find expected ':'
  • 工作正常:microk8s.helm install --namespace "airflow" --name "airflow" stable/airflow
  • 不工作
microk8s.helm install --namespace "airflow" --name "airflow" stable/airflow \
--set airflow.extraVolumes=/home/*user*/github/airflowDAGs \
--set airflow.extraVolumeMounts=/home/*user*/github/airflowDAGs \
--set dags.path=/home/*user*/github/airflowDAGs/dags \
--set logs.path=/home/*user*/github/airflowDAGs/logs \
--set persistence.enabled=false \
--set logsPersistence.enabled=false
  • 也无法正常工作: microk8s.helm install --namespace "airflow" --name "airflow" stable/airflow --values=values_pv.yaml, with values_pv.yaml: https://pastebin.com/PryCgKnC
    • 编辑:请更改/home/*user*/github/airflowDAGs为您机器上的路径以复制错误。

关注点

  1. 可能由于默认值中的这些行而出错values.yaml
## Configure DAGs deployment and update
dags:
  ##
  ## mount path for persistent volume.
  ## Note that this location is referred to in airflow.cfg, so if you change it, you must update airflow.cfg accordingly.
  path: /home/*user*/github/airflowDAGs/dags

如何airflow.cfg在 Kubernetes 部署中进行配置?在 Airflow 的非容器化部署中,可以在~/airflow/airflow.cfg.

  1. 第 69 行airflow.cfg参考:https ://github.com/helm/charts/blob/master/stable/airflow/templates/deployments-web.yaml#L69

其中包含git. 是否.yaml配置错误,并且错误地尝试使用git pull,但由于未指定 git 路径,因此失败了?

系统

  • 操作系统:Ubuntu 18.04(单机)
  • MicroK8s:v1.15.4 修订版:876
  • microk8s.kubectl version: v1.15.4
  • microk8s.helm version: v2.14.3

问题

如何正确地将正确的值传递给 Airflow Helm 图表,以便能够在 Kubernetes 上部署 Airflow,Pod 可以访问相同的 DAG 并在共享持久卷上登录?

4

2 回答 2

4

不确定你是否已经解决了这个问题,但如果你还没有,我认为有一个非常简单的方法接近你正在做的事情。

所有的 Deployments、Services、Pods 都需要持久化卷信息——它在本地的位置以及在每个 kube 类型中的位置。看起来图表的 values.yaml 提供了一种方法来做到这一点。我只会在下面用 dags 展示这个,但我认为它也应该与日志的过程大致相同。

所以基本步骤是,1)告诉 kube 'volume'(目录)在你的计算机上的位置,2)告诉 kube 把它放在你的容器中的哪里,以及 3)告诉气流在哪里寻找 dag。因此,您可以从 helm repo 复制 values.yaml 文件并使用以下内容进行更改。

  1. airflow部分

首先,您需要创建一个包含本地目录中项目的卷(extraVolumes如下所示)。然后,需要挂载它——幸运的是,把它放在这里会将它模板化到所有 kube 文件中。创建该卷后,您应该告诉它 mount dags。所以基本上,extraVolumes创建卷,并extraVolumeMounts安装卷。

airflow:
  extraVolumeMounts: # this will get the volume and mount it to that path in the container                                                                                                                                                               
  - name: dags
    mountPath: /usr/local/airflow/dags  # location in the container it will put the directory mentioned below.

  extraVolumes: # this will create the volume from the directory
  - name: dags
    hostPath:
      path: "path/to/local/directory"  # For you this is something like /home/*user*/github/airflowDAGs/dags

  1. 告诉气流配置 dags 在容器中的位置(与上面相同的 yaml 部分)。
airflow:
  config:
    AIRFLOW__CORE__DAGS_FOLDER: "/usr/local/airflow/dags"  # this needs to match the mountPath in the extraVolumeMounts section
  1. 使用 helm 和您的新values.yaml文件安装。
helm install --namespace "airflow" --name "airflow" -f local/path/to/values.yaml stable/airflow

最后,这应该允许气流在 dags 文件夹中看到您的本地目录。如果您添加一个新文件,它应该会显示在容器中 - 尽管可能需要一分钟才能显示在 UI 中 - 我不认为 dagbag 进程一直在运行?无论如何,希望这会有所帮助!

于 2019-11-25T18:35:45.497 回答
0

使用 yaml 文件执行此操作

因此,如果我们考虑使用 values.yaml,就会出现问题,因为您以错误的方式编辑它。

extraVolumeMounts: home/*user*/github/airflowDAGs
  ## Additional volumeMounts to the main containers in the Scheduler, Worker and Web pods.
  # - name: synchronised-dags
  #   mountPath: /usr/local/airflow/dags
  extraVolumes: home/*user*/github/airflowDAGs
  ## Additional volumes for the Scheduler, Worker and Web pods.
  # - name: synchronised-dags
  #   emptyDir: {}

如果 extraVolumeMounts 需要namemounthPath才能工作,你不能像这样传递路径,这就是你在#那里的原因,所以你可以删除它们,添加你的值,它应该可以工作。

它应该看起来像这样

 extraVolumeMounts:
 - name: synchronised-dags
   mountPath: /usr/local/airflow/dags
 extraVolumes:
 - name: synchronised-dags
   emptyDir: {}

这就是您可以安装它的方式:

1.使用 helm fetch 下载气流图到你的电脑

helm fetch stable/airflow --untar

2.像上面的例子一样编辑airflow /values.yaml extraVolumeMount和extraVolume,只需添加你的名字和路径。

nano/vi/vim airflow/values.yaml

3.您可以更改气流/values.yaml 中的其余内容并使用:

helm install ./airflow --namespace "airflow" --name "airflow" -f ./airflow/values.yaml

或者

使用此命令仅编辑 extraVolumeMount 和 extraVolume

helm install --set dags.path=/home/user/github/airflowDAGs/dags --set logs.path=/home/user/github/airflowDAGs/logs --set persistence.enabled=false --set logsPersistence.enabled=false  ./airflow --namespace "airflow" --name "airflow" -f ./airflow/values.yaml

结果:

NAME:   airflow
LAST DEPLOYED: Fri Oct 11 09:18:46 2019
NAMESPACE: airflow
STATUS: DEPLOYED

RESOURCES:
==> v1/ConfigMap
NAME                  DATA  AGE
airflow-env           20    2s
airflow-git-clone     1     2s
airflow-postgresql    0     2s
airflow-redis         3     2s
airflow-redis-health  3     2s
airflow-scripts       1     2s

==> v1/Deployment
NAME               READY  UP-TO-DATE  AVAILABLE  AGE
airflow-flower     0/1    1           0          1s
airflow-scheduler  0/1    1           0          1s
airflow-web        0/1    1           0          1s

==> v1/PersistentVolumeClaim
NAME                STATUS   VOLUME    CAPACITY  ACCESS MODES  STORAGECLASS  AGE
airflow-postgresql  Pending  standard  2s

==> v1/Pod(related)
NAME                                 READY  STATUS             RESTARTS  AGE
airflow-flower-5596b45d58-wrg74      0/1    ContainerCreating  0         1s
airflow-postgresql-75bf7d8774-dxxjn  0/1    Pending            0         1s
airflow-redis-master-0               0/1    ContainerCreating  0         1s
airflow-scheduler-8696d66bcf-bwm2s   0/1    ContainerCreating  0         1s
airflow-web-84797489f5-8wzsm         0/1    ContainerCreating  0         1s
airflow-worker-0                     0/1    Pending            0         0s

==> v1/Secret
NAME                TYPE    DATA  AGE
airflow-postgresql  Opaque  1     2s
airflow-redis       Opaque  1     2s

==> v1/Service
NAME                    TYPE       CLUSTER-IP   EXTERNAL-IP  PORT(S)   AGE
airflow-flower          ClusterIP  10.0.7.168   <none>       5555/TCP  1s
airflow-postgresql      ClusterIP  10.0.8.62    <none>       5432/TCP  2s
airflow-redis-headless  ClusterIP  None         <none>       6379/TCP  1s
airflow-redis-master    ClusterIP  10.0.8.5     <none>       6379/TCP  1s
airflow-web             ClusterIP  10.0.10.176  <none>       8080/TCP  1s
airflow-worker          ClusterIP  None         <none>       8793/TCP  1s

==> v1/ServiceAccount
NAME     SECRETS  AGE
airflow  1        2s

==> v1/StatefulSet
NAME            READY  AGE
airflow-worker  0/1    1s

==> v1beta1/Deployment
NAME                READY  UP-TO-DATE  AVAILABLE  AGE
airflow-postgresql  0/1    1           0          1s

==> v1beta1/PodDisruptionBudget
NAME         MIN AVAILABLE  MAX UNAVAILABLE  ALLOWED DISRUPTIONS  AGE
airflow-pdb  N/A            1                0                    2s

==> v1beta1/Role
NAME     AGE
airflow  2s

==> v1beta1/RoleBinding
NAME     AGE
airflow  2s

==> v1beta2/StatefulSet
NAME                  READY  AGE
airflow-redis-master  0/1    1s


NOTES:
Congratulations. You have just deployed Apache Airflow
   export POD_NAME=$(kubectl get pods --namespace airflow -l "component=web,app=airflow" -o jsonpath="{.items[0].metadata.name}")
   echo http://127.0.0.1:8080
   kubectl port-forward --namespace airflow $POD_NAME 8080:8080

2. Open Airflow in your web browser
于 2019-10-11T12:33:07.013 回答