ALB负载均衡
Part1 AWS ALB介绍
ALB全称为Application Load Balancer,是AWS Elastic Load Balancing的一种。
ALB工作原理
Application Load Balancer 在应用程序层正常工作,该层是开放系统互连 (OSI) 模型的第 7 层。负载均衡器收到请求后,将按照优先级顺序评估侦听器规则以确定应用哪个规则,然后从目标组中选择规则操作目标。可以配置侦听器规则,以根据应用程序流量的内容,将请求路由至不同的目标组。每个目标组的路由都是单独进行的,即使某个目标已在多个目标组中注册。可以配置目标组级别使用的路由算法。默认路由算法为轮询路由算法;或者,可以指定最少未完成请求路由算法。
可以根据需求变化在负载均衡器中添加和删除目标,而不会中断应用程序的整体请求流。Elastic Load Balancing 根据传输到应用程序的流量随时间的变化对负载均衡器进行扩展。Elastic Load Balancing 能够自动扩展来处理绝大部分工作负载。
您可以配置运行状况检查,这些检查可用来监控注册目标的运行状况,以便负载均衡器只能将请求发送到正常运行的目标。
Part2 实验内容
- 网络环境:VPC设置2个公共子网,要求2个公共子网在不同的可用区,每个公共子网内各有1台EC2,EC2上有一个简单的http服务。
- 负载均衡:要求创建一个负载均衡器,实现访问流量分配到2个EC2上。
- 路由要求:要求通过域名访问负载均衡器,并且实现https的访问。
Part3 实验步骤
1.网络环境搭建
该部分主要的工作就是在VPC的两个不同可用区的公共子网内创建EC2,并部署http服务。
顺序:创建VPC–>创建IGW并关联VPC–>创建子网–>创建安全组–>创建EC2–>部署服务
1.1 创建VPC,不使用向导的方式创建
点击“创建VPC”
VPC配置
- 仅VPC
- 名称:my-vpc-02
- IPv4 CIDR:10.0.0.0/22
点击创建
1.2 创建互联网网关
点击“创建互联网网关”
设置IGW的名称为:my-igw-02,点击创建
将创建的这个互联网网关关联到VPC上
选择创建的这个VPC,点击关联
在路由表页面选中my-vpc-02的路由表,并点击“编辑路由”
增加一条新的路由信息,将IGW加入路由表,点击“保存更改”
1.3 创建子网
在子网页面选择创建子网
子网的配置信息
- VPC选择my-vpc-02
- 子网1
- 名称:my-net2-01
- 可用区:us-east-1a
- IPv4 CIDR:10.0.1.0/24
- 子网2
- 名称:my-net2-02
- 可用区:us-east-1b
- IPv4 CIDR:10.0.2.0/24
点击创建
注:这里设置两个子网的可用区不同
1.4 创建安全组
在安全组页面,点击“创建安全组”
安全组配置
名称:my-sg-02
描述:open 22 80 443 5000
VPC:选则my-vpc-02
入站规则
- TCP 22 0.0.0.0/0
- TCP 80 0.0.0.0/0
- TCP 443 0.0.0.0/0
- TCP 5000 0.0.0.0/0
配置完成之后点击创建
1.5 创建EC2
1.5.1 第一台
点击“启动新实例”
AMI选中centos7
类型选择含免费套餐的这个,点击下一步
EC2的网络配置:
- VPC:my-vpc-02
- 子网:us-east-1a
- 自动分配公有IP:禁用
点击下一步
添加存储,保持默认,点击下一步
标签设置,Name:test-net2-01,点击下一步
安全组配置,选择现有的安全组,选择my-sg-02,点击审核和启动
审核完成之后点击启动
密钥对,如果没有就新建,输入密钥对的名称;如果有,就使用现有的密钥对。
1.5.2 第二台
大部分配置都与第一台相同
不同的配置如下
- 子网设置与第一台不同,子网选择us-east-1b
- 标签设置为Name:test-net2-02
1.6 创建弹性IP
- 在弹性IP页面,点击“分配弹性IP”
- 直接点击分配即可
- 将弹性IP分配到刚创建的EC2上
选择对应的EC2,选择IP,点击分配
- 重复1、2、3步骤,给另一个EC2(test-net2-02)也分配弹性IP
2.EC2部署简单应用
SSH上EC2,以下均以test-net2-01实例为例进行展示(test-net2-01实例上配置基本相同)
修改EC2的hostname,一台改成test-net2-01,另一台test-net2-02
1 | #修改hostname |
安装pip包管理工具
1 | #安装pip包管理工具 |
安装flask模块
1 | #安装flask模块 |
编写脚本文件
1 | [root@test-net2-01 ~]# vi http_test |
将以下内容复制到脚本文件中
1 | #!/bin/bash |
保存后退出
后台运行脚本文件
1 | [root@test-net2-01 ~]# nohup python http_test > nohup.log 2>&1 & |
测试5000端口上的服务
1 | [root@test-net2-01 ~]# curl 127.0.0.1:5000 |
3.创建ALB负载均衡器
3.1 创建目标组
在目标群组页面点击“创建目标组”
创建目标组,配置设置
- 目标类型:实例
- 目标组名称:my-targer-02
- 协议:HTTP:5000(!此处不能修改成别的,一定要是HTTP协议)
- 端口为5000,是因为EC2上对应的服务在5000端口
- VPC:my-vpc-02
点击下一步
将两个实例添加为目标,点击创建目标组
3.2 创建ALB负载均衡器
在负载均衡器页面,点击“新建负载均衡器”
选择“Application Load Balancer”
ALB配置
- 名称:my-alb-02
- VPC:my-vpc-02
- 映射:选择有公共子网的可用区,选好可用区之后选择子网
- 安全组:选择创建的my-sg-02
- 侦听器和路由:创建2个侦听器,分别是80和5000端口,流量转发至my-target-02
配置完成之后,点击创建负载均衡器
负载均衡器需要一定的配置时间,等待10分钟左右会创建完成
3.3 ALB测试
复制负载均衡器my-alb-02的DNS名称
在终端进行访问,可以看到有在进行负载均衡
1 | [root@test-net2-01 ~]# for i in $(seq 1 10); do curl http://my-alb-02-126796059.us-east-1.elb.amazonaws.com/ &&echo ""; done |
4.域名解析
4.1 获得免费域名
获取途径Freenom
本次实验使用的域名是modu2022.cf
4.2 Route 53 创建域
4.2.1 创建托管区域
在Route 53的托管区域页面,点击“创建托管区域”
填入域名:modu2022.cf
4.2.2 修改域名的名称服务器
记录下托管区域modu2022.cf的名称服务器
将Freenom中对应域名的名称服务器改为上面的4个服务器
4.2.3 创建记录
点击“创建记录”
创建2条记录
记录1和记录2除了“记录名称”之外的地方都一致
记录1:
- 类型:A
- 流量路由至:别名
- 选择Application和Classic Load Balancer的别名
- 选择美国东部us-east-1
- 选择创建的alb-02
点击“创建记录”
4.3 域名测试
可以使用域名访问服务
1 | [root@test-net2-01 ~]# for i in $(seq 1 10); do curl http://modu2022.cf &&echo ""; done |
5.HTTPS访问
5.1 创建证书
使用AWS的ACM证书托管服务创建SSL证书
请求证书,点击下一步
填入域名,设置标签
- 域名:modu2022.cf
- 标签:Name:modu2022.cf
点击请求
点击证书的链接,进入到证书设置中去
点击“在Route 53中创建记录”
点击“创建记录”
证书的状态为”已颁发”
5.2 ALB添加侦听器
给my-alb-02新增侦听内容
侦听设置
- HTTPS协议,443端口
- 操作:转发至
- 目标组:my-target-02
- 安全侦听器设置
- 安全策略:默认
- SSL证书:选择创建的证书modu2022.cf
配置完成之后点击“添加”
5.3 访问测试
1 | [root@test-net2-01 ~]# for i in $(seq 1 10); do curl https://modu2022.cf &&echo ""; done |
测试完成之后可以将2台EC2的弹性IP释放掉。
HTTPS访问(自建证书)
申请免费证书
笔者申请腾讯云的免费证书。
在搜索框输入“SSL证书”,进入“我的证书”页面,点击“申请免费证书”
选择证书类型,保持默认就行,点击“确定”
“提交资料”这一步只需要按照要求填写内容即可,点击“下一步”
验证方式选择推荐的DNS验证,点击“下一步”
将腾讯云上域名验证的部分,添加到托管的记录中
在托管域中新增一条CNAME类型的记录,把名称和值都填进去,点击创建记录
记录创建完成之后,在腾讯云平台上进行域名验证
等待证书颁发,过程可能需要2个小时
okay,证书颁发完整之后,下载证书
选择Nginx类型,下载
在ACM中导入证书
在ACM页面中选择,导入证书
将下载下来证书的对应内容复制进去
填写规则:
- 对于 Certificate body(证书正文),粘贴要导入的 PEM 编码证书。它应以
-----BEGIN CERTIFICATE-----
开头并以-----END CERTIFICATE-----
结尾。 - 对于 Certificate private key(证书私有密钥),粘贴证书的 PEM 编码的未加密私有密钥。它应以
-----BEGIN PRIVATE KEY-----
开头并以-----END PRIVATE KEY-----
结尾。 - (可选) 对于 Certificate chain (证书链),粘贴 PEM 编码的证书链。
导入之后,点击“下一步”
为证书添加标签,Name:modu2022.cg_SSL。标签不添加也可以。
审核完成之后点击导入
证书导入完毕
修改负载均衡器
在负载均衡器中添加侦听器
侦听器内容设置如下
- 协议:HTTPS 443端口
- 操作:转发
- 目标组:my-target-02
- 侦听器证书设置:“从ACM中”,选择新增的modu2022.cf证书
点击添加
测试访问
1 | [root@test-net2-02 ~]# for i in $(seq 1 10); do curl https://modu2022.cf &&echo ""; done |
okay,自建证书也实现了ALB的负载均衡。
Part4 问题总结
part3的3.1目标组配置的协议要是HTTP协议的5000端口。因为创建的ALB是对7层的流量进行负载均衡,所以协议要选择是7层协议。如果创建NLB,那么协议选择TCP的5000端口。
part3的5.2部分添加侦听器时的协议要选择HTTPS协议的443端口。
注意:HTTP协议的443端口和HTTPS协议的443端口不是同一个。