我正在尝试运行需要连接到 Kafka 集群的数据流作业。出于安全原因,Kafka 集群需要一个 IP 地址白名单,因此我需要确保 Dataflow 作业始终从相同的 IP 地址连接。
我怎样才能做到这一点?是否可以为 Dataflow 作业指定一个可预测的 IP 地址?如果不是,有哪些替代解决方案可以确保作业始终从防火墙已知的 IP 地址/“白名单”进行连接?
要“强制”Dataflow 工作人员使用可预测的 IP 地址,您需要设置多个 Google Cloud 资源:
最后,当您启动 Dataflow 作业时,您需要在您选择的子网中启动它,并禁止使用外部 IP 地址。
在实践中,这看起来像这样:
首先在特定区域创建网络和子网:
gcloud compute networks create $NETWORK_NAME \
--subnet-mode custom
gcloud compute networks subnets create $SUBNETWORK_NAME \
--network $NETWORK_NAME \
--region $REGION \
--range 192.168.1.0/28 # This range can be changed for a larger address space
# Also enable private Google Access:
# https://cloud.google.com/vpc/docs/configure-private-google-access#gcloud
gcloud compute networks subnets update $SUBNETWORK_NAME \
--region=$REGION \
--enable-private-ip-google-access
现在创建路由器和路由器的NAT规则:
gcloud compute routers create $ROUTER_NAME \
--network $NETWORK_NAME \
--region $REGION
## Also create a static IP address for this network
gcloud compute addresses create $ADDRESS_NAME \
--region=$REGION
gcloud compute routers nats create $ROUTER_CONFIG_NAME \
--router-region $REGION \
--router $ROUTER_NAME \
--nat-all-subnet-ip-ranges \
--nat-external-ip-pool=$ADDRESS_NAME
这就是您需要的所有网络设置。现在您可以启动您的 Dataflow 作业了。
启动数据流作业时,需要传递
subnetwork
参数和禁用公共IP地址。
在 Python 中:
python sample_pipeline.py \
--runner=DataflowRunner \
--project=$PROJECT \
--region=$REGION \
--subnetwork=regions/$REGION/subnetworks/$SUBNETWORK_NAME \
--no_use_public_ips
在 Java 中:
mvn compile exec:java -Dexec.mainClass=my.main.pipeline.Klass \
-Dexec.args="--runner=DataflowRunner \
--project=$PROJECT \
--region=$REGION \
--subnetwork=regions/$REGION/subnetworks/$SUBNETWORK_NAME \
--usePublicIps=false" \
-Pdataflow-runner