如何在私有子网上 运行 数据流 python?

How to run Dataflow python on a private subnetwork?

Apache Beam 2.1.0 添加了对在 Dataflow 运行ner 私有子网上提交作业的支持,并且没有 public IP,我们需要满足我们的防火墙规则。我计划使用 squid 代理访问 apt-getpip 等以安装 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

资源: Creating Cloud NAT instance