小心 Alpine 3.14.0 的破坏性变更!即使 Terraform Enterprise 也可能突然崩溃
这篇文章是Recruit Advent Calendar 2021上第19天的文章。
我们的Terraform Enterprise操作
Terraform Enterprise是一款由HashiCorp开发的产品,可以在自己的基础设施上运行类似于Terraform Cloud的Terraform CI/CD环境。
如果在EC2上运行,则需要m5.xlarge实例作为最低要求,因此为了成本优化,我们使用了SpotFleet进行操作。
当使用SpotFleet时,由于Spot请求被中止,可能会导致实例被替换。因此,在我们的环境中,当实例被替换时,我们设置它启动最新版的Terraform Enterprise。
通常情况下,如果Spot请求被中断,正在运行的实例将停止,并立即创建另一个实例的Spot请求,以启动最新版本的Terraform Enterprise。此时的健康主机计数指标将呈现如下形式。
在这种情况下,虽然会有几分钟的服务中断,但不会引起大问题。(我们选择容忍这种中断以实现成本最优化)
发生在11月13日的事件
然而,11/13那天,在重新创建的Spot实例上,Terraform Enterprise未能成功启动。因此,HealtyHostCount仍保持为0。
以下是相同时间段的CPUUtilization指标。某些操作似乎无法正常运行,同时占用了半数以上的虚拟CPU。
就在那一天,Terraform Enterprise发布了版本号为v202111-1。
在那里,有这样的Breaking Changes的描述。
某些应用程序容器镜像已更新为使用Alpine 3.14,该版本有特定的Docker、runc和libseccomp版本要求。在升级之前,请参考Alpine 3.14发布说明,确定您的安装是否满足这些新要求。
另外,Alpine 3.14的发布说明中包含以下描述。
Docker 20.10.0版本(其中包含moby版本的提交a181391)或更高版本,并且libseccomp 2.4.4版本(其中包含反向移植libseccomp版本的提交5696c89)或更高版本。
换句话说,由于Terraform Enterprise依赖的Alpine升级到了3.14版本,导致Docker和libseccomp的版本不再满足要求,引发了问题。
恢复正常
我们使用的环境是基于AmazonLinux2。使用AmazonLinux2上的常规yum安装的Terraform Enterprise环境的Docker版本如下。
$ docker --version
Docker version 18.09.9-ce, build 039a7df
这不符合本次的需求。经过调查发现,amazon-linux-extras 中有 Docker 20.10.7-3.amzn2 的版本可用,因此我们将安装该版本。
$ sudo amazon-linux-extras install docker
$ docker --version
Docker version 20.10.7, build f0df350
这样一来,Docker的版本满足了要求。
下一个是libseccomp。通常情况下,使用yum安装时版本为2.4.1-1.amzn2,无法满足要求。而且amazon-linux-extras中也没有此软件。
因此,将从源代码构建。
$ sudo yum install gcc
$ wget https://github.com/seccomp/libseccomp/releases/download/v2.4.4/libseccomp-2.4.4.tar.gz
$ tar -xvzf libseccomp-2.4.4.tar.gz
$ cd libseccomp-2.4.4
$ ./configure
$ make
$ sudo make install
由于libseccomp二进制文件已安装在/usr/local/lib/libseccomp.so.2.4.4中,因此请更改符号链接的目标。
$ sudo ln -s -f /usr/local/lib/libseccomp.so.2.4.4 /usr/lib64/libseccomp.so.2
现在,Terraform Enterprise v202111-1已经成功启动了。
对策 (duì cè)
为了避免中断时遇到同样的问题,我们决定创建一个包含自定义的libseccomp的AMI,并从该AMI启动Terraform Enterprise,而不是使用现有的SpotFleet。同时,我们还决定将SpotFleet更换为AutoScaling Group,以保持Spot请求的稳定性。
此外,为了能够及早检查Terraform Enterprise的升级情况,我们在Github上进行更新时,使用以下RSS订阅源将通知发送到Slack。订阅源链接为:https://github.com/hashicorp/terraform-enterprise-release-notes/commits/master.atom。
我们也可以通过在Terraform Enterprise中固定启动版本来实现此目的,但在本次防护措施中我们没有采用该方法。这是因为为了方便升级Terraform的运行版本,我们希望尽可能地保持最新的Terraform Enterprise运行。
在最后
由于Docker基础映像的升级,可能导致基础设施中的中间件不满足要求,从而导致应用程序无法正常运行并产生CPU负载,这就是这次教训所教导我们的。由于最初没有预料到这个问题,因此花费了一些时间才意识到其原因。
关于这个问题,我们已向HashiCorp提供了反馈,并要求他们在Terraform Enterprise的要求中迅速进行了更新。
https://www.terraform.io/enterprise/before-installing#docker-engine-requirements
此外,该问题已在支持知识库中发布了文章。(需要登录支持中心)
https://support.hashicorp.com/hc/en-us/articles/4410546606995
感谢HashiCorp的yohei先生、jacopen先生和kabu先生的支持和配合!
我們的團隊提交了一個 Terraform AWS Provider 的 Pull Request。該請求旨在讓 AWS WAFv2 可以指定管理規則的版本。如果可以的話,請幫忙查看一下,謝謝!
https://github.com/hashicorp/terraform-provider-aws/pull/21732