首页 > 解决方案 > 在 Pod 中使用 Airflow 设置 Git-Sync 的问题

问题描述

我目前正在尝试将 Airflow 设置为在类似 Kubernetes 的环境中工作。为了让气流变得有用,我需要能够使用 Git-Sync 功能,以便 DAG 可以与 Pod 分开存储,从而在 Pod 缩小或重新启动时不会被重置。我正在尝试使用 ssh 进行设置。

我一直在寻找有关 Airflow 配置的良好文档或有关如何正确设置它的教程,但这无济于事。我非常感谢这里的一些帮助,因为我已经为此苦苦挣扎了一段时间。

以下是我设置相关配置的方法,请注意,由于安全原因,我有一些链接和一些信息的替代品:

git_repo = https://<git-host>/scm/<project-name>/airflow
git_branch = develop
git_subpath = dags
git_sync_root = /usr/local/airflow
git_sync_dest = dags
git_sync_depth = 1
git_sync_ssh = true
git_dags_folder_mount_point = /usr/local/airflow/dags
git_ssh_key_secret_name = airflow-secrets
git_ssh_known_hosts_configmap_name = airflow-configmap
dags_folder = /usr/local/airflow/
executor = KubernetesExecutor
dags_in_image = False

以下是我设置我的 origin/config repo 的方式:

-root
 |-configmaps/airflow
   |-airflow.cfg
   |-airflow-configmap.yaml
 |-environment
   |-<environment specific stuff>
 |-secrets
   |-airflow-secrets.yaml
 |-ssh
   |-id_rsa
   |-id_rsa.pub
 |-README.md

气流配置图和机密如下所示:

apiVersion: v1
kind: Secret
metadata:
  name: airflow-secrets
data:
  # key needs to be gitSshKey
  gitSshKey: <base64 encoded private sshKey>

apiVersion: v1
kind: ConfigMap
metadata:
  name: airflow-configmap
data:
  known_hosts: |
      https://<git-host>/ ssh-rsa <base64 encoded public sshKey>

我尝试同步到的存储库将公钥设置为访问密钥,并且只是一个名为 dags 的文件夹,里面有 1 个 dag。

我的问题是我现在不知道我的问题是什么。我无法知道我的配置的哪一部分设置正确,哪一部分设置不正确,并且有关该主题的文档非常乏味。

如果需要更多信息,我将很乐意提供。

感谢您的时间

标签: gitkubernetesairflow

解决方案


您在执行此操作时看到的错误是什么?

您需要考虑的几件事:

  • 使用此链接在本地创建 SSH 密钥,然后:

    1. 存储库名称 > 设置 > 部署密钥 > ssh_key.pub 的值

    2. 确保选中“写访问”

  • Dockerfile正在使用的看起来像:

    FROM apache/airflow:2.1.2
    
    COPY requirements.txt .
    
    RUN python -m pip install --upgrade pip
    RUN pip install -r requirements.txt
    
  • 来自values.yaml官方 Airflow Helm 存储库 ( helm repo add apache-airflow https://airflow.apache.org) 的 需要更新以下值gitSync

    • enabled: true

    • repo: ssh://git@github.com/username/repository-name.git

    • branch: master

    • subPaths: ""(如果 DAG 在存储库根目录中)

    • sshKeySecret: airflow-ssh-git-secret

    • credentialsSecret: git-credentials

  • 导出 SSH 密钥和known_hostsKubernetes 密钥以访问私有存储库

    kubectl create secret generic airflow-ssh-git-secret \
      --from-file=gitSshKey=/path/to/.ssh/id_ed25519 \
      --from-file=known_hosts=/path/to/.ssh/known_hosts \
      --from-file=id_ed25519.pub=/path/to/.ssh/id_ed25519.pub \
      -n airflow
    
  • 创建和应用清单:

    apiVersion: v1
    kind: Secret
    metadata:
      namespace: airflow
      name: airflow-ssh-git-secret
    data:
      gitSshKey: <base64_encoded_private_key_id_ed25519_in_one_line>
    
    apiVersion: v1
    kind: Secret
    metadata:
      name: git-credentials
    data:
      GIT_SYNC_USERNAME: base64_encoded_git_username
      GIT_SYNC_PASSWORD: base64_encoded_git_password
    
    apiVersion: v1
    kind: ConfigMap
    metadata:
      namespace: airflow
      name: known-hosts
    data:
      known_hosts: |
        line 1 of known_host file
        line 2 of known_host file
        line 3 of known_host file
        ...
    
  • 更新气流版本

    helm upgrade --install airflow apache-airflow/airflow -n airflow -f values.yaml --debug

  • 在气流命名空间中获取 pod

    kubectl get pods -n airflow

  • airflow-scheduler-SOME-STRINGpod 将运行 3 个容器。git-sync-init如果您没有看到处于运行状态的 pod,请查看容器的日志


推荐阅读