FERNET_KEY 使用相同的 DAGS 创建新环境时缺少配置

FERNET_KEY configuration is missing when creating a new environment with the same DAGS

我在 Google Cloud 中使用 Composer (Airflow)。我想创建一个新环境,并将旧环境中的相同 DAG 和变量带入新环境。

为此,我执行以下操作:

但是,在新环境中,由于 FERNET_KEY configuration is missing,我的所有 DAG 都损坏了。我最好的猜测是,这与导入使用单独的 Fernet 密钥加密的变量有关,但我不确定。

有人遇到过这个问题吗?如果是,您是如何解决的?

我们在 FERNET_KEYs 上遇到了同样的错误。我认为新版本(composer-1.9.0)中存在错误。他们说 'The Fernet Key is now stored in Kubernetes Secrets instead of the Config Map.' 即使再次重新输入您的连接,它们也不工作。

他们已经在 1.9.1 版本中解决了这个问题:

https://cloud.google.com/composer/docs/release-notes

根据文档,Fernet Key 是由 Composer 生成的,它是唯一的。 fernet key 值可以从 Composer Airflow 配置 (Composer bucket -> airflow.cfg) 中检索。您需要检查 fernet_key 是否存在。

由于二进制推出中的竞争条件,存在一个已知问题,可能导致在网络服务器中设置新的 fernet 密钥,从而导致元数据库中先前加密的值无法解密。

您可以尝试在 Admin -> Variables 下的 Airflow UI 中重新创建关键的 Composer 对象路径。

我可以通过执行以下操作在 Composer 1.9 / Airflow 1.10.6 中可靠地重现该问题:

  1. 创建一个新的 Composer 集群
  2. 上传引用 Airflow 连接的 DAG
  3. 在 Composer 中设置环境变量
  4. 等待 airflow-schedulerairflow-worker 重新启动

除了 FERNET_KEY configuration is missing 之外,问题还表现为以下 Airflow 错误横幅:

Broken DAG: [/home/airflow/gcs/dags/MY_DAG.py] in invalid literal for int() with base 10: 'XXX'
Broken DAG: [/home/airflow/gcs/dags/MY_DAG.py] Expecting value: line 1 column 1 (char 0)

问题的根本原因是添加新环境变量会从 airflow-schedulerairflow-worker Kubernetes 部署规范 Pod 模板中删除 AIRFLOW__CORE__FERNET_KEY 环境变量:

 - name: AIRFLOW__CORE__FERNET_KEY
      valueFrom:
        secretKeyRef:
          key: fernet_key
          name: airflow-secrets

作为解决方法,可以应用 Kubernetes 部署规范补丁:

$ cat config/composer_airflow_scheduler_fernet_key_patch.yaml
spec:
  template:
    spec:
      containers:
      - name: airflow-scheduler
        env:
        - name: AIRFLOW__CORE__FERNET_KEY
          valueFrom:
            secretKeyRef:
              key: fernet_key
              name: airflow-secrets

$ kubectl patch deployment airflow-scheduler --namespace=$AIRFLOW_ENV_GKE_NAMESPACE --patch "$(cat config/composer_airflow_scheduler_fernet_key_patch.yaml)"

注意:此补丁也必须应用于 airflow-worker