如何使用 Cloud Composer 在外部集群中调度 Kubernetes 工作负载



我打算使用Google Cloud Composer(Apache Airflow(来管理我们的数据管道。某些处理步骤是在 Docker 映像中定义的,我想触发该映像以在 Google Kubernetes Engine 上运行。这些处理步骤通常是资源密集型工作,我想知道安排它们的最佳方式是什么。

我研究了 Kubernetes Operator 来构建一个托管在 Google Container Registry 上的 Docker 镜像。但是,据我了解,此工作负载将在现有的Cloud Composer Kubernetes集群中创建。因此,可用于运行工作负载的资源受分配给 Cloud Composer 群集的资源量的限制。将大量资源分配给 Cloud Composer 群集以仅在此特定任务运行时可用似乎是浪费。在 Cloud Composer 群集级别是否有任何类型的自动缩放可以处理此问题?

作为替代方案,我认为Cloud Composer可以有一个DAG,该DAG创建一个具有适当资源的外部Kubernetes集群来运行此步骤,然后在完成后拆除。这听起来像是一种有效的方法吗?实现这一点的最佳方法是什么?我正在考虑使用带有gcloud命令的BashOperator来kubectl。

TLDR:使用 Cloud Composer 管理外部 Kubernetes 集群作为处理资源密集型处理步骤的一种方式是否是一种有效的模式?

我认为将您自己的 pod 分离到与现有 Airflow pod(在 Cloud Composer Kubernetes 集群的默认节点池上执行(不同的节点上是一种很好的做法。这样做,您不会以任何方式干扰现有的气流吊舱。

如果您不想使用外部 Kubernetes 集群,可以直接在 Cloud Composer Kubernetes 集群中创建一个节点池,至少 0 个节点并启用自动扩展。当没有 Pod 运行时,节点池中将没有节点(您无需付费(。当您启动 Pod 时(使用节点亲和性(,将自动启动节点。另一个优点是,您可以根据需要选择节点池的节点计算机类型。

要在特定节点池上调度 Pod,请使用KubernetesPodOperatoraffinity参数:

KubernetesPodOperator(
task_id=task_id,
namespace='default',
image=image,
arguments=arguments,
name=task_id.replace('_', '-'),
affinity={
'nodeAffinity': {
'requiredDuringSchedulingIgnoredDuringExecution': {
'nodeSelectorTerms': [{
'matchExpressions': [{
'key': 'cloud.google.com/gke-nodepool',
'operator': 'In',
'values': [
'<name_of_your_node_pool>',
]
}]
}]
}
}
},
is_delete_operator_pod=True,
hostnetwork=False,
)

我在生产中使用它,它工作正常。

最新更新