【问题标题】:Timeout behind GCP NatGCP Nat 超时
【发布时间】:2020-05-14 14:46:14
【问题描述】:

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

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

此时我的谷歌云 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 cloud 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 个端口。

谷歌云路由器通告如下状态:

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 镜像时如何防止超时?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    请注意,一旦连接终止,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

    【讨论】:

    • 感谢您的广泛回答;初步结果似乎表明成功,如果它在未来几天内有效,我会接受你的回答。
    • 虽然前两天你的回答似乎有很大帮助,但之后问题似乎又回来了。看起来好像有些东西没有正确释放,并且一直在消耗端口。
    【解决方案2】:

    GCP Cloud NAT 简而言之:allocation_status: "DROPPED"

    然后忙于配置“每个 VM 实例的最小端口”+ 以及更多 NAT IP 地址

    为什么谷歌不创建像 AWS NAT 网关这样的产品,为高流量做好最低配置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 2022-11-10
      相关资源
      最近更新 更多