Helm稳定/气流-使用Helm图表的具有共享持久卷的气流部署的自定义值失败

时间:2019-10-09 08:26:24

标签: kubernetes airflow kubernetes-helm microk8s

客观

我想在共享持久卷中的Pod可以访问相同DAG的Kubernetes上部署Airflow。 根据文档(https://github.com/helm/charts/tree/master/stable/airflow#using-one-volume-for-both-logs-and-dags),看来我必须设置并将以下值传递给Helm:extraVolumeextraVolumeMountpersistence.enabledlogsPersistence.enabled,{ {1}},dags.path

问题

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

logs.path
  • 工作正常: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.yamlhttps://pastebin.com/PryCgKnC
    • 编辑:请将values_pv.yaml更改为计算机上的路径以复制错误。

关注事项

  1. 由于默认的/home/*user*/github/airflowDAGs中的以下几行,可能会出错:
values.yaml

如何在Kubernetes部署中配置## 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部署中,可以在airflow.cfg中找到此文件。

  1. ~/airflow/airflow.cfg中的第69行是指:https://github.com/helm/charts/blob/master/stable/airflow/templates/deployments-web.yaml#L69

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

系统

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

问题

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

2 个答案:

答案 0 :(得分:0)

使用yaml文件

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

public static void createPdf_PageType(String baseUri, String[] src, String dest, PageSize pageSize, boolean rotate) throws IOException {

    ConverterProperties properties = new ConverterProperties();
    properties.setBaseUri(baseUri);
    PdfWriter writer = new PdfWriter(dest);
    PdfDocument pdf = new PdfDocument(writer);

    PdfViewerPreferences preferences = new PdfViewerPreferences();
    preferences.setPrintScaling(PdfViewerPreferencesConstants.NONE);
    pdf.getCatalog().setViewerPreferences(preferences);

    PdfMerger merger = new PdfMerger(pdf);
    log.info("Generating PDF");
    for (String html : src) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfDocument temp = new PdfDocument(new PdfWriter(baos));
        if(rotate) {
        temp.setDefaultPageSize(pageSize.rotate()); /** Page Size and Orientation */
        } else {
            temp.setDefaultPageSize(pageSize); /** Page Size and Orientation */
        }

        HtmlConverter.convertToPdf(html, temp, properties);
        temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));
        merger.merge(temp, 1, temp.getNumberOfPages());
        temp.close();
    }
  //  pdf.getCatalog().setViewerPreferences(new PdfViewerPreferences().setPrintScaling(PdfViewerPreferences.PdfViewerPreferencesConstants.NONE));
    pdf.close();
    log.info("PDF Generated");

}

如果extraVolumeMounts需要 name mounthPath 起作用,您不能仅仅传递这样的路径,这就是在那里拥有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: {} 的原因,因此您可以只需删除它们,添加您的值即可使用。

应该看起来像这样

#

这就是您安装它的方式:

1。使用头盔抓取功能将气流图下载到您的电脑上

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

2。像上面的示例一样编辑airflow / values.yaml extraVolumeMount and extraVolume,只需添加名称和路径即可。

helm fetch stable/airflow --untar

3。您可以在airflow / values.yaml中更改其余内容并使用:

nano/vi/vim airflow/values.yaml

OR

仅在extraVolumeMount和extraVolume修改后使用此命令

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

结果:

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

答案 1 :(得分:0)

不确定是否已解决此问题,但是如果您还没有解决,我认为有一种非常简单的方法可以解决您的工作。

所有部署,服务和Pod都需要持久的卷信息-它在本地驻留以及在每种kube类型中应该存在的位置。看起来图表的values.yaml提供了一种方法。我只会在下面用dags显示它,但我认为它也应该与日志大致相同。

因此,基本步骤是:1)告诉kube“ volume”(目录)在您的计算机上的位置,2)告诉kube将其放在容器中的位置,以及3)告诉airflow在哪里寻找损坏的位置。因此,您可以从头盔存储库中复制values.yaml文件,并使用以下内容进行更改。

  1. airflow部分

首先,您需要创建一个包含本地目录中项目的卷(这是下面的extraVolumes)。然后,需要将其挂载-幸运的是,将其放在此处会将其模板化到所有kube文件中。创建该卷后,您应该告诉它安装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. 告诉dag居住在容器中的气流配置(与上面的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进程会一直运行吗?无论如何,希望这会有所帮助!