Apache Airflow 与多个团队合作(多租户)
Apache Airflow working with multi teams (Multi Tenant)
我正在使用 Airflow,我希望将另一个团队添加到我的实例中。
我希望新团队只能看到他们自己的 DAGS,这意味着只有当其中一名团队成员是 DAG 的所有者时,他才能看到他的 DAG。
我正在使用 LDAP 身份验证。
我希望每个团队维护自己的 DAG。
我还想要一个解决方案,让团队可以上传 DAG,而不可能让他们直接访问 DAG 文件夹。也许通过使用 git 自动将 DAG 推送到目标。
任何指导将不胜感激!
目前 (Airflow 2.1) 无法阻止任何可以编写 DAG 的人访问实例中的任何内容。 Airflow(目前)还没有真正的多租户设置来提供这种隔离。这是在进行中,但它可能不会(完全)出现在 Airflow 3 之前,但它的元素将在未来几个月出现在 Airlfow 2 中,因此如果你愿意,你将能够配置越来越多的隔离。
目前 Airflow 2 与 1.10 相比引入了部分隔离:
解析DAG与调度器是分开的,所以erroneous/maliciousDAG不能直接影响调度过程。
Web 服务器不再执行 DAG 代码。
目前,任何编写 DAG 的人都可以:
- 直接访问 Airflow 的数据库并在数据库中执行任何操作(包括删除整个数据库)
- 读取任何配置变量、连接和机密
- 通过操作 DB
动态更改在 Airflow 中运行的任何 DAGS/Tasks 的定义
并且没有办法阻止它(通过设计)。
所有这些都计划在未来几个月内解决。
这基本上意味着您必须对编写 DAG 的用户有一定程度的信任。无法实现完全隔离,您应该依靠在生产中提交的 DAG 的代码审查来防止任何类型的滥用(与开发人员向您的代码库提交的任何代码的情况非常相似)。
目前唯一的“真正”隔离可以通过部署多个 Airlfow 实例来实现——每个实例都有自己的数据库、调度程序、网络服务器。这实际上并不像看起来那么糟糕——如果你有 Kubernetes 集群并使用 Airflow 的官方 Helm Chart https://airflow.apache.org/docs/helm-chart/stable/index.html。您可以轻松创建多个 Airflow 实例 - 每个实例都在不同的命名空间中,并且每个实例都使用自己的数据库模式(因此您仍然可以使用单个数据库服务器,但每个实例都必须有自己单独的模式)。然后,每个气流实例将拥有自己的工作人员,这些工作人员可以进行不同的身份验证(通过连接或通过其他机制)。
您甚至可以提供通用的身份验证机制 - 例如,您可以将 KeyCloak 放在 Airflow 前面,并将 Oauth/LDAP 身份验证与您的通用身份验证方法集成 - 对于所有此类实例(例如有不同的员工组授权用于不同的实例)。
这提供了很好的多租户可管理性、一定程度的资源重用(数据库、K8S 集群节点),并且如果您有 - 例如 - Terraform 脚本来管理您的基础设施,这实际上可以很容易地完成易于管理,因此您可以 add/remove 轻松租户。租户之间的隔离甚至更好——因为您可以单独管理每个租户使用的资源(工作人员数量、调度程序等)。
如果您认真对待隔离和多租户管理,我衷心推荐这种方法。即使在 Airflow 3 中我们将实现完全隔离,您仍然必须确保管理租户之间的“资源”隔离,并且拥有多个 Airflow 实例是使其变得非常容易的一种方式(因此它也将保持有效和推荐在某些情况下实现多租户的方式)。
更新(2022 年 1 月):我们开始讨论改进 Airflow 以允许进行多租户设置。这一切都在 Airflow Improvement Poposal-1 “AIP-1: Improve Airflow Security” 的保护伞下。目前我们正在研究两个 AIP:AIP-42 和 AIP-43,它们将使 Airflow 多租户更接近现实 - 查看更多:https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-1%3A+Improve+Airflow+Security
我正在使用 Airflow,我希望将另一个团队添加到我的实例中。 我希望新团队只能看到他们自己的 DAGS,这意味着只有当其中一名团队成员是 DAG 的所有者时,他才能看到他的 DAG。 我正在使用 LDAP 身份验证。 我希望每个团队维护自己的 DAG。 我还想要一个解决方案,让团队可以上传 DAG,而不可能让他们直接访问 DAG 文件夹。也许通过使用 git 自动将 DAG 推送到目标。 任何指导将不胜感激!
目前 (Airflow 2.1) 无法阻止任何可以编写 DAG 的人访问实例中的任何内容。 Airflow(目前)还没有真正的多租户设置来提供这种隔离。这是在进行中,但它可能不会(完全)出现在 Airflow 3 之前,但它的元素将在未来几个月出现在 Airlfow 2 中,因此如果你愿意,你将能够配置越来越多的隔离。
目前 Airflow 2 与 1.10 相比引入了部分隔离:
解析DAG与调度器是分开的,所以erroneous/maliciousDAG不能直接影响调度过程。
Web 服务器不再执行 DAG 代码。
目前,任何编写 DAG 的人都可以:
- 直接访问 Airflow 的数据库并在数据库中执行任何操作(包括删除整个数据库)
- 读取任何配置变量、连接和机密
- 通过操作 DB 动态更改在 Airflow 中运行的任何 DAGS/Tasks 的定义
并且没有办法阻止它(通过设计)。
所有这些都计划在未来几个月内解决。
这基本上意味着您必须对编写 DAG 的用户有一定程度的信任。无法实现完全隔离,您应该依靠在生产中提交的 DAG 的代码审查来防止任何类型的滥用(与开发人员向您的代码库提交的任何代码的情况非常相似)。
目前唯一的“真正”隔离可以通过部署多个 Airlfow 实例来实现——每个实例都有自己的数据库、调度程序、网络服务器。这实际上并不像看起来那么糟糕——如果你有 Kubernetes 集群并使用 Airflow 的官方 Helm Chart https://airflow.apache.org/docs/helm-chart/stable/index.html。您可以轻松创建多个 Airflow 实例 - 每个实例都在不同的命名空间中,并且每个实例都使用自己的数据库模式(因此您仍然可以使用单个数据库服务器,但每个实例都必须有自己单独的模式)。然后,每个气流实例将拥有自己的工作人员,这些工作人员可以进行不同的身份验证(通过连接或通过其他机制)。
您甚至可以提供通用的身份验证机制 - 例如,您可以将 KeyCloak 放在 Airflow 前面,并将 Oauth/LDAP 身份验证与您的通用身份验证方法集成 - 对于所有此类实例(例如有不同的员工组授权用于不同的实例)。
这提供了很好的多租户可管理性、一定程度的资源重用(数据库、K8S 集群节点),并且如果您有 - 例如 - Terraform 脚本来管理您的基础设施,这实际上可以很容易地完成易于管理,因此您可以 add/remove 轻松租户。租户之间的隔离甚至更好——因为您可以单独管理每个租户使用的资源(工作人员数量、调度程序等)。
如果您认真对待隔离和多租户管理,我衷心推荐这种方法。即使在 Airflow 3 中我们将实现完全隔离,您仍然必须确保管理租户之间的“资源”隔离,并且拥有多个 Airflow 实例是使其变得非常容易的一种方式(因此它也将保持有效和推荐在某些情况下实现多租户的方式)。
更新(2022 年 1 月):我们开始讨论改进 Airflow 以允许进行多租户设置。这一切都在 Airflow Improvement Poposal-1 “AIP-1: Improve Airflow Security” 的保护伞下。目前我们正在研究两个 AIP:AIP-42 和 AIP-43,它们将使 Airflow 多租户更接近现实 - 查看更多:https://cwiki.apache.org/confluence/display/AIRFLOW/AIP-1%3A+Improve+Airflow+Security