我更像是一个 Java 开发人员,而不是系统/云架构师,但我却陷入了困境,看不到出路。
在 Google Cloud 上,我有一个自定义网络,名为 t,其子网t-eu
具有主 ipv4 范围,192.168.0.0/24
这应该会为连接到网络的 254 个网络设备提供范围。此网络上的一些 VM 使用 Google Cloud Optimized OS,我们通过 Cloud SDK(在管道中)部署 Docker 容器。其中一个 VM 是Spring Boot Cloud Gateway
(java)A我们正在使用它在虚拟机(服务)之间路由流量。直到今天,我们的设置都运行正常,没有任何问题。然而,突然间,这个 Compute Engine 虚拟机(我们依赖的heavily on Instance Templates, and Instance groups
)基本上停止了工作。查看端口 8080/80 上的防火墙规则(入口/出口),启用日志记录后不会失败。
Spring Cloug Gateway with Eureka
(服务发现)乙似乎依赖于 dns 域名。使用跟踪日志,我可以清楚地看到流量被路由到C- 所需服务。来自A我清楚地看到以下内容:
Pattern "/file-storage-swagger" matches against value "/file-storage-swagger"
Route matched: FILE-STORAGE-SERVICE
RouteToRequestUrlFilter start
LoadBalancerClientFilter url chosen: http://my-service-managed-n03f.europe-west1-b.c.project-name.internal:8080/v3/api-docs
Connecting to [my-service-managed-n03f.europe-west1-b.c.project-name.internal/192.168.1.20:8080]
然后连接突然中断。我们的实例组前面是负载均衡器,它会在 30 秒后终止流量,我相信这是默认值。因此每次我们到达网关时A
它问乙关于位置C其域名位于t-eu
- 子网内,IP 地址为192.168.1.20
。但是它总是超时。
我尝试使用Connectivity Tests
我路由流量的地方A到C使用正确的端口和 IP,它总是成功。日志中没有任何内容,网络智能工具等中也没有任何内容。I tried to use tcpdump
以及其他网络工具来捕获细微的细节,但云优化操作系统在这里确实很有限。我可以直接 pingCvm,但 telnet、trace 不起作用。
概括:
- 虚拟机A无法访问虚拟机乙
- 虚拟机乙访问虚拟机没有问题A
- A可以 ping乙和乙可以 pingA
- A无法使用 traceroute、telnet、curl 等乙
- 防火墙规则似乎正在发挥作用(连接测试、日志)
编辑:问题出在自动模板创建中
我曾经通过 bitbucket 管道在实例模板中创建模板
这是命令
gcloud compute instance-templates create-with-container <name>-$ENV-$BITBUCKET_BUILD_NUMBER \
--project=<project-name>\
--machine-type=$MACHINE_TYPE \
--network-interface=subnet=<subnet>,no-address \
--maintenance-policy=MIGRATE \
--service-account=<service-acc> \
--scopes=<scopes> \
--region=<region> \
--container-image=<docker-image> \
--container-restart-policy=always \
--container-privileged \
--container-env=<envs> \
--boot-disk-size=25 \
--boot-disk-type=pd-balanced \
--no-shielded-secure-boot \
--shielded-vtpm \
--shielded-integrity-monitoring \
--labels=container-vm=<container-vm-name>
这停止了工作,仍然不知道为什么,但是当我手动创建模板时,一切都正常工作,所以现在作为一种解决方法,我在 docker 镜像上使用最新标签,并通过 bitbucket 管道中的脚本删除托管组中的活动实例
我会进一步调查,为什么它停止工作,我现在的 bcs 方法不合适,如果需要更改某些配置,我需要手动创建单独的模板
手动创建非常简单,我指定了机器的必要配置,附加了 docker 镜像,设置了对 sql 和存储的单独访问,并将模板放在我的网络和子网中
答案1
请允许我分享您的评论作为解决方案,以帮助遇到类似问题的其他用户。该问题围绕 VM 实例之间的通信问题,可能源于模板的自动创建。
为了解决这个问题,手动创建模板并利用 Docker 镜像上的最新标签似乎是一种可行的解决方法。此外,通过 Bitbucket Pipeline 中的脚本删除托管组中的活动实例也可以解决此问题。