对于我们的项目,由于IP白名单,我们需要与我们的Google Cloud VM实例建立静态IP绑定。 由于托管组是可抢占的,因此VM会偶尔终止。
但是,当它终止时,我会在操作日志compute.instances.preempted
中直接看到compute.instances.repair.recreateInstance
并注明:
实例组管理器'xxx'在实例上启动了recreateInstance 'XXX'。 原因:实例的意图是RUNNING但实例的状态是 STOPPING。
之后执行delete
和insert
操作以恢复实例。
文档The Repo:
您可以通过停止实例来模拟实例抢占。
在这种情况下,当VM再次启动时,IP地址将保持连接状态。
A)所以我的问题是,是否有可能让实例组管理器在抢占的情况下停止并启动VM,而不是重新创建?由于重新创建意味着静态IP将被分离,并且每次都需要手动附加。
B)如果无法使用选项A,如何自动附加静态IP地址,以便在重新创建VM时不必手动附加它?我宁愿没有额外的NAT VM实例来处理这个问题。
提前致谢!
答案 0 :(得分:2)
我想出了一个解决方法(特别是,在重新创建之间将静态IP地址分配给可抢占的VM实例),但需要注意的是,托管实例组具有以下属性:
您需要遵循的步骤是:
gcloud
从VM实例派生的新实例模板(请参见https://cloud.google.com/compute/docs/instance-templates/create-instance-templates#gcloud_1)。关于步骤6,我的gcloud
命令如下所示:
gcloud compute instance-templates create vm-template-with-static-ip \
--source-instance=source-vm-id \
--source-instance-zone=us-east4-c
几乎不用说,这种设置仅在您想要进行以下操作时有用:
如果您不介意在抢占虚拟机之后手动将其重新打开(并且可能不知道谁知道该虚拟机已关闭多长时间),那么请帮自己一个忙,不要理会MiG和只是站立单个VM。
答案 1 :(得分:1)
回答你的问题:
(A)目前不可能,我不确定是否有可能。通过设计,可删除的VM被删除以为正常VM腾出空间(如果给定区域中存在容量限制)或定期将它们与正常VM区分开。在后一种情况下,抢占可能看起来像是一个启动/停止事件,但在前者中,可能需要花费大量时间才能重新创建虚拟机。
(B)目前还没有很好的方法来实现它。
答案 2 :(得分:0)
一种解决方案是让实例动态选择临时IP,但将该组设置为具有静态IP的负载均衡器的目标。这种方式即使在创建或销毁实例时,LB也可以作为一个前端,随着时间的推移保持IP的连续性。
答案 3 :(得分:0)
我发现了一种确保网络中所有VM都具有相同的传出IP地址的方法。使用Cloud NAT,您可以分配所有虚拟机都将使用的静态IP,但是有一个缺点:
仅当没有其他情况时,GCP才使用Cloud NAT转发流量 匹配流量的路线或路径。 Cloud NAT未在 以下情况,即使已配置:
您可以在VM的接口上配置外部IP。
如果在VM的接口上配置外部IP,则以VM的内部IP作为源IP的IP数据包将使用VM的 外部IP到达Internet。不会在上执行NAT 这样的数据包。但是,分配给接口的别名IP范围 仍然可以使用NAT,因为他们无法使用外部IP到达 互联网。使用此配置,您可以直接连接到 通过SSH的GKE虚拟机,但GKE容器/容器使用Cloud NAT可以到达Internet。
请注意,只要虚拟机网络能够通过负载平衡器外部IP访问虚拟机,就不会阻止虚拟机使用NAT。 接口本身没有外部IP地址。
删除虚拟机的外部IP也会阻止您直接SSH访问虚拟机,甚至是从gcloud控制台本身进行SSH访问。上面的引用显示了一种使用负载平衡器的替代方法,另一种方法是a bastion,但不能直接解决来自Kubernetes / kubectl的访问。
如果这对您没有问题,这就是方法。