如何使用 Cloud Composer 调度外部集群中的 Kubernetes 工作负载
How to use Cloud Composer to schedule Kubernetes workloads in external clusters
我打算使用 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,它可以创建一个外部 Kubernetes 集群,该集群具有 运行 此步骤所需的适当资源,然后在完成后拆除。这听起来像是一种有效的方法吗?实现这个的最佳方法是什么?我正在考虑将 BashOperator 与 gcloud 命令一起用于 kubectl。
TLDR:使用 Cloud Composer 管理外部 Kubernetes 集群作为处理资源密集型处理步骤的方式是否有效?
我认为将您自己的 pods 与现有 Airflow pods(在 Cloud Composer Kubernetes 集群的默认节点池上执行)不同的节点分开是一个很好的做法。这样做,您不会以任何方式干扰现有的 Airflow pods。
如果您不想使用外部 Kubernetes 集群,您可以直接在 Cloud Composer Kubernetes 集群内创建一个节点池,最少 0 个节点并启用自动缩放。当没有pod运行时,节点池中将没有节点(你不会付费)。当您启动一个 pod(使用节点亲和力)时,一个节点将自动启动。还有一个好处就是可以根据需要选择节点池的节点机器类型
要在特定节点池上安排 pod,请使用 KubernetesPodOperator
的 affinity
参数:
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,
)
我在生产中使用它并且它工作正常。
我打算使用 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,它可以创建一个外部 Kubernetes 集群,该集群具有 运行 此步骤所需的适当资源,然后在完成后拆除。这听起来像是一种有效的方法吗?实现这个的最佳方法是什么?我正在考虑将 BashOperator 与 gcloud 命令一起用于 kubectl。
TLDR:使用 Cloud Composer 管理外部 Kubernetes 集群作为处理资源密集型处理步骤的方式是否有效?
我认为将您自己的 pods 与现有 Airflow pods(在 Cloud Composer Kubernetes 集群的默认节点池上执行)不同的节点分开是一个很好的做法。这样做,您不会以任何方式干扰现有的 Airflow pods。
如果您不想使用外部 Kubernetes 集群,您可以直接在 Cloud Composer Kubernetes 集群内创建一个节点池,最少 0 个节点并启用自动缩放。当没有pod运行时,节点池中将没有节点(你不会付费)。当您启动一个 pod(使用节点亲和力)时,一个节点将自动启动。还有一个好处就是可以根据需要选择节点池的节点机器类型
要在特定节点池上安排 pod,请使用 KubernetesPodOperator
的 affinity
参数:
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,
)
我在生产中使用它并且它工作正常。