GCP Nat背后的超时

时间:2020-05-14 14:46:14

标签: google-cloud-platform nat google-cloud-networking

我似乎有一个与this问题类似的问题,因为在GCP上使用gitlab运行器构建docker映像时,我得到了以下超时时间

Put https://registry.gitlab.com/v2/[redacted-repo]: dial tcp 35.227.35.254:443: i/o timeout

此刻,我的Google云NAT提供以下日志输出:

{
   "insertId": "rh7b2jfleq0wx",
   "jsonPayload": {
     "allocation_status": "DROPPED",
     "endpoint": {
       "project_id": "gitlab-autoscale-runners",
       "vm_name": "runner-5dblbjek-auto-scale-runner-1589446683-0b220f90",
       "region": "europe-west4",
       "zone": "europe-west4-b"
     },
     "connection": {
       "protocol": 6,
       "src_port": 42446,
       "src_ip": "some-ip",
       "dest_ip": "some-ip",
       "dest_port": 443
     },
     "vpc": {
       "vpc_name": "default",
       "subnetwork_name": "default",
       "project_id": "gitlab-autoscale-runners"
     },
     "gateway_identifiers": {
       "gateway_name": "gitlab-runner-gateway",
       "router_name": "gitlab-runner-router",
       "region": "europe-west4"
     }
   },
   "resource": {
     "type": "nat_gateway",
     "labels": {
       "region": "europe-west4",
       "router_id": "7964886332834186727",
       "gateway_name": "gitlab-runner-gateway",
       "project_id": "gitlab-autoscale-runners"
     }
   },
   "timestamp": "2020-05-14T10:17:55.195614735Z",
   "labels": {
     "nat.googleapis.com/nat_ip": "",
     "nat.googleapis.com/instance_name": "runner-5dblbjek-auto-scale-runner-1589446683-0b220f90",
     "nat.googleapis.com/network_name": "default",
     "nat.googleapis.com/subnetwork_name": "default",
     "nat.googleapis.com/router_name": "gitlab-runner-router",
     "nat.googleapis.com/instance_zone": "europe-west4-b"
   },
   "logName": "projects/gitlab-autoscale-runners/logs/compute.googleapis.com%2Fnat_flows",
   "receiveTimestamp": "2020-05-14T10:18:00.422135520Z"
 }

上述问题似乎表明过度使用NAT端口存在问题。通过使用Google云端CLI,我们已经确认这对我们而言不是问题,

$ gcloud compute routers get-nat-mapping-info gitlab-runner-router
---
instanceName: runner-5dblbjek-auto-scale-runner-1589446683-0b220f90
interfaceNatMappings:
- natIpPortRanges:
  - some-id:1024-1055
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: some-ip
- natIpPortRanges:
  - some-ip:32768-32799
  numTotalDrainNatPorts: 0
  numTotalNatPorts: 32
  sourceAliasIpRange: ''
  sourceVirtualIp: some-ip

我似乎只使用了64个端口。

Google云路由器发布以下状态:

kind: compute#routerStatusResponse
result:
  natStatus:
  - autoAllocatedNatIps:
    - some-ip
    minExtraNatIpsNeeded: 0
    name: gitlab-runner-gateway
    numVmEndpointsWithNatMappings: 3
  network: https://www.googleapis.com/compute/v1/projects/gitlab-autoscale-runners/global/networks/default  

相同的docker-images在本地运行或在共享gitlab运行器中运行时(即不在NAT后面时)确实可以成功构建。

在Google Cloud nat后面构建此docker映像时,如何防止超时?

1 个答案:

答案 0 :(得分:5)

查看Cloud NAT输出,它显示分配已删除状态。建议的操作是将每个VM实例的最小端口数增加到足够的范围(4096个端口),并使其运行几天。我建议这个数字达到我们将停止滴落的位置,如果这有助于减少滴落,我们可能必须增加2倍,直到没有滴落。如果您在4k端口上没有收到任何DROPPED状态,则可以降低它,直到找到一个不再接收DROPPED状态或没有打开大量NAT端口的中间值。您正在建立64个连接。端口使用情况表示虚拟机到单个唯一目标(目标IP:port,协议)的连接数

查看配置,当前每个VM分配了64个端口(如描述中所述)。这意味着,该vpc中的每个VM实例都获得64个NAT IP:PORT组合以进行外部连接。这意味着,您可以连接到64个唯一的唯一目的地(目的地IP地址,目的地端口和协议)。当您进行测试时,您似乎已达到极限。

分配给云nat网关的每个NAT IP都有64512个端口,因此,默认情况下,每个虚拟机配置64个端口,NAT网关会将64个NAT IP:PORT的块分配给指定子网中在NAT网关配置中选择的每个VM 。因此,这意味着您可以运行1008 VM(64512除以64)。但是每个虚拟机可以同时连接到64个唯一的目标。现在,根据您的应用程序/用例,如果需要更多同时连接,则需要增加每个VM的最小端口。

例如,每个虚拟机具有1个NAT IP和1024分钟的端口,则可以运行63个虚拟机。您可以为每个虚拟机连接到1024个唯一目标。如果需要运行更多的VM,则需要分配更多的NAT IP。通过添加第二个IP,可以使NAT容量增加一倍。由于选择了NAT IP的自动分配,因此当您在子网中创建更多VM时,将自动创建并分配NAT IP。在这种情况下,您只需调整每个虚拟机配置的最小端口即可满足您的流量需求。

请注意,一旦连接终止,NAT网关将具有2分钟的计时器,然后才能使用NAT IP:PORT。 [1],因此您可以使端口配置比峰值流量高一点。

有关端口计算的更多详细信息,请参见[2]

[1] https://cloud.google.com/nat/docs/overview#specs-timeouts

[2] https://cloud.google.com/nat/docs/ports-and-addresses#ports