我们使用托管实例组 (MIG) 在 GCE 中启动工作负载,以监督这些虚拟机的生命周期和健康状况。
新的虚拟机配有启动脚本 (bash),在极少数情况下,该脚本会以某种方式失败。但是,虚拟机仍然能够启动、启动其工作负载并通过其健康检查。
GCE / MIG 中是否有一些设置说“如果初始化脚本未成功执行,则终止虚拟机并重新创建它”?
如果遇到错误我可以关闭,例如:
...
exception() {
echo 'startup script error; shutting down!'
shutdown -h now
}
trap 'exception' ERR
...
但希望有一个更加可控的选择。
答案1
我想知道您的 MIG 日志中的错误消息,因为它可能是初始延迟的问题,所以我建议检查一下您的 MIG 中健康检查和自动修复策略的配置方式。其中,您可以调整一些探测和设置,例如您的 vm --initial-delay。如果虚拟机正在启动,此设置会延迟自动修复,以免过早重新创建虚拟机,并可能有助于解决启动脚本问题。有时,当虚拟机启动时,它需要更多时间来执行启动脚本。如果网络出现延迟,它也会有所帮助,因为某些启动脚本问题与元数据服务器的网络连接有关。因此,为了避免这种情况,您可以增加健康检查的初始延迟。您可以使用以下命令获取健康检查:
gcloud compute health-checks describe <health check name>
您可以使用更新命令更新您的健康检查,如下例所示:
gcloud compute instance-groups managed update my-mig \
--health-check example-check \
--initial-delay 300 \
--zone us-east1-b
在这里,你可以看到初始延迟设置为 5 分钟,在下面关联您将找到有关如何在 MIG 中设置健康检查和自动修复的更多信息。
您还可以随时使用此命令检查您的实例:
gcloud compute instance-groups managed list-instances your-instance-group
NAME ZONE STATUS HEALTH_STATE ACTION INSTANCE_TEMPLATE VERSION_NAME LAST_ERROR
igm-with-hc-fvz6 europe-west1 RUNNING HEALTHY NONE my-template
igm-with-hc-gtz3 europe-west1 RUNNING HEALTHY NONE my-template
要检查启动脚本在 GCP 中何时结束,您可以通过 ssh 到您的 VM 查询启动脚本状态 0(成功)或 1(失败),为此,您需要能够在 VM 上运行 ssh 命令来应用此命令:
gcloud compute ssh $VM_NAME --zone=$VM_ZONE --ssh-flag="-q" \
--command='grep -m 1 "startup-script exit status" /var/log/syslog' 2>&-
另外,还有一个解决方法可以知道启动脚本何时完成,您可以让脚本有条件地运行,在脚本执行结束时创建一个空文件,如果此文件不存在,则进行探测以重新创建虚拟机,我在这里找到了一个包含此解决方法的博客关联如果您想获取更多信息。
答案2
很高兴地报告 Google 正在将此功能添加到 GCE API。
具体来说,如果启动脚本没有以 rc 0 退出,该功能将通知 MIG,GCE VM 被视为不健康。
一旦实施,我将用链接更新此答案。