永久性地将静态IP绑定到可抢占的Google云虚拟机

时间:2017-10-18 08:29:18

标签: google-cloud-platform google-compute-engine google-kubernetes-engine

对于我们的项目,由于IP白名单,我们需要与我们的Google Cloud VM实例建立静态IP绑定。 由于托管组是可抢占的,因此VM会偶尔终止。

但是,当它终止时,我会在操作日志compute.instances.preempted中直接看到compute.instances.repair.recreateInstance并注明:

  

实例组管理器'xxx'在实例上启动了recreateInstance   'XXX'。   原因:实例的意图是RUNNING但实例的状态是   STOPPING。

之后执行deleteinsert操作以恢复实例。

文档The Repo

  

您可以通过停止实例来模拟实例抢占。

在这种情况下,当VM再次启动时,IP地址将保持连接状态。

A)所以我的问题是,是否有可能让实例组管理器在抢占的情况下停止并启动VM,而不是重新创建?由于重新创建意味着静态IP将被分离,并且每次都需要手动附加。

B)如果无法使用选项A,如何自动附加静态IP地址,以便在重新创建VM时不必手动附加它?我宁愿没有额外的NAT VM实例来处理这个问题。

提前致谢!

4 个答案:

答案 0 :(得分:2)

我想出了一个解决方法(特别是,在重新创建之间将静态IP地址分配给可抢占的VM实例),但需要注意的是,托管实例组具有以下属性:

  1. 不自动缩放。
  2. 最大组大小为1(即该组中只能有一个虚拟机)
  3. 默认为“自动修复”(即,仅在终止VM后才重新创建VM)。

您需要遵循的步骤是:

  1. 保留静态IP。
  2. 创建一个配置为可抢占的实例模板。
  3. 创建您的托管组,将模板分配给该组。
  4. 等待该小组启动您的VM。
  5. 启动虚拟机后,将在步骤1中保留的静态IP分配给虚拟机。
  6. 创建一个通过gcloud从VM实例派生的新实例模板(请参见https://cloud.google.com/compute/docs/instance-templates/create-instance-templates#gcloud_1)。
  7. 在控制台中查看新创建的实例模板,并注意您会看到分配给模板的外部IP。
  8. 更新MiG(托管实例组)以使用在步骤6中创建的新模板。
  9. 使用Replace方法在MiG上进行主动滚动更新。
  10. 确认已使用相同的名称重新创建了VM,是否保留了磁盘(取决于您在原始模板中如何配置磁盘),并且VM保持了其IP地址。

关于步骤6,我的gcloud命令如下所示:

gcloud compute instance-templates create vm-template-with-static-ip \
    --source-instance=source-vm-id \
    --source-instance-zone=us-east4-c

几乎不用说,这种设置仅在您想要进行以下操作时有用:

  1. 使用单个可抢占式VM来最大限度地降低成本。
  2. 抢占虚拟机后,不必再处理再次打开虚拟机的麻烦,从而确保了尽可能多的正常运行时间。

如果您不介意在抢占虚拟机之后手动将其重新打开(并且可能不知道谁知道该虚拟机已关闭多长时间),那么请帮自己一个忙,不要理会MiG和只是站立单个VM。

答案 1 :(得分:1)

回答你的问题:

(A)目前不可能,我不确定是否有可能。通过设计,可删除的VM被删除以为正常VM腾出空间(如果给定区域中存在容量限制)或定期将它们与正常VM区分开。在后一种情况下,抢占可能看起来像是一个启动/停止事件,但在前者中,可能需要花费大量时间才能重新创建虚拟机。

(B)目前还没有很好的方法来实现它。

  • 如果您有一个特殊情况,您的组只有一个实例,您可以在实例模板中对IP地址进行硬编码
  • 否则目前我能想到的唯一解决方案(除了使用Load Balancer)就是编写一个可以附加NAT IP的启动脚本。

答案 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的访问。

如果这对您没有问题,这就是方法。