如何使用 AWS Auto Scaling 按需动态增加和减少实例

一、背景需求

当您不知道自己该选择何种类型的 EC2 实例的时候,也不清楚业务什么时候高峰,那我们使用 Auto Scaling 可以非常便捷的解决我们的问题,他根据我们设定的负载压力,自动进行扩展和缩容,以实现最小费用的情况下保证业务的正常运行。

二、配置步骤

2.1、创建 AMI

首先把我们正在运行的 EC2 的主机做一个镜像,内部服务设置为自启动,以保证扩容的时候所有服务可用。

![]( https://s1.51cto.com/images/blog/201906/25/e67ef1e07bfa713aa6535f9ad68134cf.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

2.2、创建负载均衡目标组

Auto Scaling 配合 ELB 来使用,动态把负载分发到后端机器,我们需要一个目标组来存储我们的 Auto Scaling 集群机器。

![]( https://s1.51cto.com/images/blog/201906/25/1f59ca4e5d02ed534f07eed7c9f31790.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

2.3、创建 Classic Load Balancer

![]( https://s1.51cto.com/images/blog/201906/25/e9152c40c883a093ff3ce975e6ccb3b9.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![]( https://s1.51cto.com/images/blog/201906/25/8e53ab6542f37ca24d5454aa151ba930.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

2.4、创建启动配置

为了实例可以稳定启动,可以选择按需实例,或者高于市场价的 Spot 实例,尽量高多一些,保证成功率。

![]( https://s1.51cto.com/images/blog/201907/09/1aeb3509e7135d6072165e916c2dcb94.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![]( https://s1.51cto.com/images/blog/201906/25/7b204dd8a647e3edd9887e62148f6bb6.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

2.5、创建 Auto Scaling 组

![]( https://s1.51cto.com/images/blog/201906/25/9e97c3718ad68da318f1ceb4ac80c1ef.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![]( https://s1.51cto.com/images/blog/201906/25/ecd231ebfae12e8dc1aac2a5bb7c0a54.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![]( https://s1.51cto.com/images/blog/201906/25/d46452e6557051ffd50eb1f5de2a8fb7.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

我这里因为选择了竞价实例,好几次都启动失败,所以我换了一个按需实例的启动配置。

2.6、测试

我们登陆到组中第一台机器,使用下面的命令对 CPU 进行增压,查看超过阈值之后是否会自动启动新的实例。

for i in `seq 1 $(cat /proc/cpuinfo |grep "processor" |wc -l)`; do dd if=/dev/zero of=/dev/null; done &

可以看到,CPU 的负载已经上去了:

![]( https://s1.51cto.com/images/blog/201906/25/1f0a489de309386e956b81a49a7a0f2b.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

我们查看一下事件,发现启动了一台新的实例:

![]( https://s1.51cto.com/images/blog/201906/25/408e5d7efc1cacffbfe242a2488f43f7.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

然后我们停掉压力测试,再等待一会查看:

![]( https://s1.51cto.com/images/blog/201906/25/6cfe3c5798c3f3d9054628e4a045a907.png?x-oss-process=image/watermark ,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

至此我们已经做完这次测试。

趣味玩法

我们可以安装 web 服务,让 ELB 负载到新实例,并给每个实例配置专属的内容,我们选定实例的元数据,在启动时候的时候,我们可以填写下面的启动参数:

#!/bin/bash
yum install nginx -y
systemctl start nginx
curl http://169.254.169.254/latest/meta-data/public-ipv4 > /var/www/html/index.html

http://169.254.169.254/latest/meta-data/ 是实例的元数据信息接口。
http://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

posted @ 2019-07-15 13:52  小水滴18  阅读(1203)  评论(0)    收藏  举报