如何在私有子网上 运行 数据流 python?
How to run Dataflow python on a private subnetwork?
Apache Beam 2.1.0 添加了对在 Dataflow 运行ner 私有子网上提交作业的支持,并且没有 public IP,我们需要满足我们的防火墙规则。我计划使用 squid 代理访问 apt-get
、pip
等以安装 python 依赖项;代理实例已经 运行ning,我们在 setup.py 脚本中设置代理。
python $DIR/submit.py \
--runner DataflowRunner \
--no_use_public_ips \
--subnetwork regions/us-central1/subnetworks/$PRIVATESUBNET \
--staging_location $BUCKET/staging \
--temp_location $BUCKET/temp \
--project $PROJECT \
--setup_file $DIR/setup.py \
--job_name $JOB_NAME
当我尝试通过 python API 运行 时,在我有机会启用代理之前,我在 worker-startup 期间出错了。在我看来,每个工作人员都首先尝试安装数据流 sdk:
在此期间它尝试更新 requests
但无法连接到 pip
:
None 我的代码此时已经执行完毕,所以在设置代理之前我看不到避免这个错误的方法。有什么方法可以在私有子网上启动数据流 python worker?
我设法用 NAT 网关而不是代理解决了这个问题。按照 special configurations 下的说明 - 我必须编辑其中一个步骤以通过网关自动路由 Dataflow worker 实例:
gcloud compute routes create no-ip-internet-route --network my-network \
--destination-range 0.0.0.0/0 \
--next-hop-instance nat-gateway \
--next-hop-instance-zone us-central1-a \
--tags dataflow --priority 800
我使用了标签 dataflow
而不是 no-ip
,这是所有 Dataflow worker 的网络标签。
在这种情况下,NAT 网关似乎是比代理更简单的解决方案,因为它无需配置工作人员即可路由流量。
现在仍然可以使用 Cloud NAT 完成此操作,如下所示:
($REGION_ID
是任何 GCP 区域,例如 us-central1
)
gcloud compute routers create nat-router \
--network=$NETWORK_NAME \
--region=$REGION_ID
gcloud compute routers nats create nat-config \
--router=nat-router \
--nat-custom-subnet-ip-ranges=$SUBNET \
--auto-allocate-nat-external-ips \
--region=$REGION_ID
如果您需要为 Cloud NAT 分配一个静态 IP 地址(可能是为了在防火墙规则中将 NAT IP 地址列入白名单),您也可以这样做:
gcloud compute addresses create nat-ip-address --network=$NETWORK_NAME
gcloud compute routers nats create nat-config \
--router=nat-router \
--nat-custom-subnet-ip-ranges=$SUBNET \
--nat-external-ip-pool=nat-ip-address # from above
--region=$REGION_ID
Apache Beam 2.1.0 添加了对在 Dataflow 运行ner 私有子网上提交作业的支持,并且没有 public IP,我们需要满足我们的防火墙规则。我计划使用 squid 代理访问 apt-get
、pip
等以安装 python 依赖项;代理实例已经 运行ning,我们在 setup.py 脚本中设置代理。
python $DIR/submit.py \
--runner DataflowRunner \
--no_use_public_ips \
--subnetwork regions/us-central1/subnetworks/$PRIVATESUBNET \
--staging_location $BUCKET/staging \
--temp_location $BUCKET/temp \
--project $PROJECT \
--setup_file $DIR/setup.py \
--job_name $JOB_NAME
当我尝试通过 python API 运行 时,在我有机会启用代理之前,我在 worker-startup 期间出错了。在我看来,每个工作人员都首先尝试安装数据流 sdk:
在此期间它尝试更新 requests
但无法连接到 pip
:
None 我的代码此时已经执行完毕,所以在设置代理之前我看不到避免这个错误的方法。有什么方法可以在私有子网上启动数据流 python worker?
我设法用 NAT 网关而不是代理解决了这个问题。按照 special configurations 下的说明 - 我必须编辑其中一个步骤以通过网关自动路由 Dataflow worker 实例:
gcloud compute routes create no-ip-internet-route --network my-network \
--destination-range 0.0.0.0/0 \
--next-hop-instance nat-gateway \
--next-hop-instance-zone us-central1-a \
--tags dataflow --priority 800
我使用了标签 dataflow
而不是 no-ip
,这是所有 Dataflow worker 的网络标签。
在这种情况下,NAT 网关似乎是比代理更简单的解决方案,因为它无需配置工作人员即可路由流量。
现在仍然可以使用 Cloud NAT 完成此操作,如下所示:
($REGION_ID
是任何 GCP 区域,例如 us-central1
)
gcloud compute routers create nat-router \
--network=$NETWORK_NAME \
--region=$REGION_ID
gcloud compute routers nats create nat-config \
--router=nat-router \
--nat-custom-subnet-ip-ranges=$SUBNET \
--auto-allocate-nat-external-ips \
--region=$REGION_ID
如果您需要为 Cloud NAT 分配一个静态 IP 地址(可能是为了在防火墙规则中将 NAT IP 地址列入白名单),您也可以这样做:
gcloud compute addresses create nat-ip-address --network=$NETWORK_NAME
gcloud compute routers nats create nat-config \
--router=nat-router \
--nat-custom-subnet-ip-ranges=$SUBNET \
--nat-external-ip-pool=nat-ip-address # from above
--region=$REGION_ID