【发布时间】:2015-01-23 02:31:39
【问题描述】:
我正在尝试让AutoScalingRollingUpdate 在我的自动缩放组上工作,方法是使新实例联机,然后仅在新实例接受流量时,终止旧实例。 AutoScalingRollingUpdate 似乎就是为此目的而设计的。
我将 AutoScalingGroup 的 HealthCheckType 设置为“ELB”。我还将 ELB 上的 HealthCheck 设置为要求:
- 3 次成功的“健康”请求
- 10 次针对“不健康”的不成功请求
- 无宽限期(零,0)
现在,从 ELB 的角度来看,当新实例上线时,它们会在几分钟内不处于 InService 状态,这是我所期望的。但是,从 AutoScalingGroup 的角度来看,它们几乎立即被视为 InService,因此,我的 AutoScalingGroup 在新实例实际准备好接收流量之前将健康的实例停止服务。当 HealthCheckType 显式设置为“ELB”时,为什么 ASG 认为实例在 ELB 之前是健康的,我对此感到困惑。
我尝试过设置宽限期,但这并没有改变任何东西。事实上,我删除了 300 秒的宽限期,因为我认为实例在宽限期内可能是隐含的“InService”。
我知道我可以在滚动更新策略上设置 PauseTime,但这很脆弱,因为有时会在实例上线时发生故障,并且它们在完成配置之前就被删除和替换,所以 有时 ,可能会超出 PauseTime 窗口。另外,我想尽量减少我的应用同时运行两个不同版本的时间。
... ELB stuff ...
"HealthCheck": {
"HealthyThreshold": "3",
"UnhealthyThreshold": "10",
"Interval": "30",
"Timeout": "15",
"Target": {
"Fn::Join": [
"",
[
{"Fn::Join": [":", ["HTTP", {"Ref": "hostPort"}]]},
{"Ref": "healthCheckPath"}
]
]
}
},
... ASG Stuff ...
{
... snip ...
"HealthCheckType": "ELB",
"HealthCheckGracePeriod": "0",
"Cooldown": "300"
},
"UpdatePolicy" : {
"AutoScalingRollingUpdate" : {
"MinInstancesInService" : "1",
"MaxBatchSize" : "1"
}
}
【问题讨论】:
-
查看您的代码,我认为问题不在 ASG
AutoScalingGroup设置中,而在您的 ELB 设置中。` "HealthCheckGracePeriod": "0",` 给我一种奇怪的感觉,你能改变吗到300。之后,ELB 将负责可用性,而不是 ASG。 ASG 将根据 ELB 状态进行扩展和缩减。 -
即使有宽限期,ASG 也会在 ELB 之前考虑实例 InService。对我来说,这似乎是 CloudFormation 中的一个错误。为了解决这个问题,我实际上将时间设置为零。
-
您确定负载均衡器将实例报告为“不健康”吗?您在哪里看到这种状态?控制台有时不会立即更新。 AWS CLI 是否为您提供相同的状态?您的应用程序启动时的 HTTP 状态代码是什么?它是否返回 HTTP 200 OK ?您可以使用 'curl -I ...' 进行检查
-
是的,我很肯定。 ELB 的实际措辞是“OutOfService”,而 ASG 说的是“InService”。该应用程序实际上只是一个使用 Apache 在 Docker 中运行的静态网站。 “几分钟”只是拉下 Docker 映像所需的时间。在那段时间里,80 端口甚至都没有打开。
标签: amazon-web-services autoscaling amazon-elb amazon-cloudformation