mil*_*526 1 nat google-cloud-platform google-cloud-networking
我似乎有一个与此问题类似的问题,因为在 GCP 上使用 gitlab runner 构建 docker 映像时出现以下超时
Put https://registry.gitlab.com/v2/[redacted-repo]: dial tcp 35.227.35.254:443: i/o timeout
Run Code Online (Sandbox Code Playgroud)
此时我的谷歌云 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"
}
Run Code Online (Sandbox Code Playgroud)
上述问题似乎表明过度使用的 NAT 端口存在问题。我已经通过使用谷歌云 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
Run Code Online (Sandbox Code Playgroud)
我似乎只使用了一些 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
Run Code Online (Sandbox Code Playgroud)
相同的 docker-images 在本地运行或在共享 gitlab 运行器中运行时会成功构建,即不在 NAT 后面时。
在 google cloud nat 后面构建此 docker 映像时,如何防止超时?
小智 5
查看 Cloud NAT 输出,它显示分配已删除状态。建议的操作是将每个 VM 实例的最小端口增加到足够的范围(4096 个端口)并让它运行几天。我建议使用这个数字来实现我们将停止下降的位置,如果这有助于减少下降,我们可能需要增加 2 倍,直到没有下降。如果您在 4k 端口没有收到任何 DROPPED 状态,您可以减少它,直到找到一个中位数,您不再收到 DROPPED 状态,也没有大量 NAT 端口打开。您已达到 64 个连接。端口使用情况表示 VM 到单个唯一目标(目标 IP:端口、协议)的连接数
查看您的配置,目前每个 VM 分配了 64 个端口(如您在描述中提到的)。这意味着,该 vpc 中的每个 VM 实例都会获得 64 个 NAT IP:PORT 组合以进行外部连接。这意味着,您可以连接到 64 个唯一的唯一目标(目标 IP 地址、目标端口和协议)。当您进行测试时,您似乎已达到该限制。
分配给 cloud nat 网关的每个 NAT IP 都有 64512 个端口,因此在每个 VM 64 个端口的默认配置下,NAT 网关将为在 NAT 网关配置中选择的指定子网中的每个 VM 分配 64 个 NAT IP:PORT 块。所以这意味着使用此配置您可以运行 1008 个 VM(64512 除以 64)。但是每个虚拟机可以同时连接到 64 个唯一的目的地。现在,根据您的应用程序/用例,如果您需要更多的同时连接,您需要增加每个 VM 的最小端口数。
例如,如果每个 VM 有 1 个 NAT IP 和 1024 分钟端口,则可以运行 63 个 VM。并且您可以连接到每个 vm 的 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
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |