云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

谷歌云_华为云数据_三重好礼

小七 141 0

使用HashiCorp Terraform实现零停机更新

HashiCorp Terraform使您能够安全和可预测地创建、更改和改进基础设施。它是一个开源工具,它将api编码成声明性配置文件,可以在团队成员之间共享,作为代码处理、编辑、审阅和版本控制。更改是管理基础设施的一部分,没有任何东西会保持不变,也不应该保持不变,我们经常需要更新和修补虚拟机,我们需要能够做到这一点,而不会对我们的用户造成任何干扰。当您更改资源(例如VM的映像)的特定属性时,Terraform需要销毁资源并重新创建它。如果管理不当,此行为可能会导致系统停机。在这篇文章中,我们将研究Terraform中的两个简单特性,它们允许我们避免由更新引起的停机时间,并允许不间断地替换资源。本文中的示例使用了DigitalOcean提供程序,但是所解释的技术并不是特定于任何特定的提供者,而是构建在Terraform核心中的特性。»问题1:如何确保在旧的基础设施被摧毁之前创建新的基础设施考虑使用以下资源创建一个简单的液滴:资源"digitalocean_droplet""web"{计数=2图像="${变量图像}"name="网络-${计数.索引}"region="lon1"size="512mb"标记=示例"]}如果这个资源已经存在于以前的terraform apply中,然后我们修改图像,那么下次运行plan时,terraform会通知我们,在创建新资源之前,现有资源将被销毁。已生成执行计划,如下所示。资源操作用以下符号表示:~更新到位-/+销毁然后创建替代品Terraform将执行以下操作:-/+数字海洋_水滴网[0](需要新资源)id:"92822972"=>(强制新资源)磁盘:"20"=>原因是不可能更新资源的这个特定属性,Terraform需要删除现有实例和新实例。Terraform的标准行为是首先销毁资源,一旦销毁完成,它将创建替代资源。在生产环境中,这将导致意外的短暂停机。为了避免这种情况,我们可以利用Terraform资源节块生命周期中可用的元参数。lifecycle配置块允许您设置三个不同的标志来控制资源的生命周期。create_before_destroy-此标志用于确保在销毁原始实例之前创建资源替换。prevent_destroy-此标志提供额外的保护,防止破坏给定的资源。忽略更改-自定义如何计算资源的差异,允许通过更改忽略单个属性。我们感兴趣的标志是create_before_destroy,我们可以将其添加到资源节中,如下所示:资源"digitalocean_droplet""web"{计数=2图像="${变量图像}"#...生命周期{create_before_destroy=真}}随着生命周期钩子的添加,当我们运行terraform apply时,terraform首先创建新资源,然后再销毁旧资源。»问题2:一个正在运行的虚拟机并不一定意味着一个正在工作的应用程序因为虚拟机已经启动,这并不意味着应用程序可以为请求提供服务。当一个VM启动时,它会经历一个启动生命周期;VM启动后,需要运行systemd或startup脚本。最后,您的应用程序需要时间来启动。Terraform不知道您的应用程序生命周期,根据类型和复杂性,这可能是在Terraform创建实例后几分钟。为了解决这个问题,我们可以向资源中添加一个供应器,它可以执行应用程序运行状况检查。Terraform不会声明资源已成功创建,直到provisioner没有错误地完成。供应器延迟对旧资源的销毁,直到我们确定我们的新资源已经创建并且能够满足请求。资源"digitalocean_droplet""web"{计数=2图像="${变量图像}"#...生命周期{create_before_destroy=真}供应人"本地执行人"{命令="./check_健康.sh${自身ipv4地址}"}}在本例中,我们运行的是一个shell脚本,该脚本将卷曲应用程序并查找HTTP状态代码200。根据应用程序的不同,您可能需要编写更复杂的内容。例如,如果您正在运行consur,并且应用程序向consur注册了一个运行状况检查,那么您的provisioner命令可以查询consur的服务目录来检查应用程序的运行状况。因为您可以利用所有可用的供应器,Terraform为您提供了根据您的资源定制此步骤的灵活性。一旦provisioner成功完成,Terraform将声明资源已成功创建并继续删除旧资源。如果provisioner失败,Terraform将污染资源并使apply步骤失败,旧资源不会被删除,您可以纠正任何问题并重新运行Terraform plan和Terraform apply。»摘要实现生命周期钩子并利用供应器确保在Terraform删除旧实例之前,您的新资源已经创建并可用于服务请求,从而为您提供了一个无缝且不间断的升级过程。要尝试这些示例,请参阅示例代码,该代码位于:https://github.com/nicholasjackson/terraform-digitalocean-lifecycle此示例的完整演练可在以下视频中看到:有关Terraform的更多信息,请访问https://www.hashicorp.com/terraform。