如何从KubernetesPodOperator启动的Pod访问Google Cloud Composer的数据文件夹
解决方案
你的推测是正确的,Cloud Composer默认仅给Airflow工作节点Pod挂载GCS FUSE目录,自定义启动的Kubernetes Pod不会默认继承该挂载,可通过以下两种方案实现目录访问:
方案一(推荐,性能更稳定):直接通过GCS API访问存储桶
无需为Pod配置挂载,只需给Pod配置对应存储桶的访问权限,修改应用代码直接操作GCS对象即可:
- 第一步:从Composer环境详情页获取对应的托管GCS存储桶名称,你要访问的
/home/airflow/gcs/data路径对应存储桶下的/data前缀 - 第二步:为Pod使用的服务账号授予该存储桶
data目录的读写权限,默认可直接使用Composer工作节点的服务账号,只需为其添加存储桶对象管理员权限即可 - 第三步:在你的.NET应用中引入GCS SDK,直接对
gs://<存储桶名>/data/路径下的对象进行读写操作
方案二(无需修改应用代码):为Pod挂载GCS FUSE目录
如果要保留应用对/home/airflow/gcs/data本地路径的读写逻辑,可以给KubernetesPodOperator添加卷挂载配置,直接把存储桶的data目录挂载到Pod内对应路径,修改后的代码示例如下:
from airflow.contrib.operators import kubernetes_pod_operator # ... splitter = kubernetes_pod_operator.KubernetesPodOperator( task_id='splitter', name='splitter', namespace='default', image='europe-west1-docker.pkg.dev/redacted/splitter:2.3', cmds=["dotnet", "splitter.dll"], # 新增配置开始 volumes=[ { "name": "gcs-data-dir", "csi": { "driver": "gcs.csi.ofek.dev", "volumeAttributes": { "bucketName": "<替换为你的Composer托管GCS桶名>", "subPath": "data", "mountOptions": "implicit-dirs,uid=999,gid=999" } } } ], volume_mounts=[ { "name": "gcs-data-dir", "mountPath": "/home/airflow/gcs/data", "readOnly": False } ], service_account_name="<替换为Composer工作节点服务账号名>", # 新增配置结束 )
注意事项
- FUSE挂载的读写性能低于直接调用GCS API,大文件读写场景下可能出现延迟或数据不一致问题,优先选择方案一
- 配置权限时最小化权限范围,仅给必要的服务账号开放对应存储桶
data目录的读写权限即可
内容的提问来源于stack exchange,提问作者urig
相关产品推荐
相关产品推荐

