AWS ALB负载均衡

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”

image-20220405214053861

VPC配置

  • 仅VPC
  • 名称:my-vpc-02
  • IPv4 CIDR:10.0.0.0/22

点击创建

image-20220405214158370

1.2 创建互联网网关

点击“创建互联网网关”

image-20220405214408258

设置IGW的名称为:my-igw-02,点击创建

image-20220405214537236

将创建的这个互联网网关关联到VPC上

image-20220405214645641

选择创建的这个VPC,点击关联

image-20220405214712929

在路由表页面选中my-vpc-02的路由表,并点击“编辑路由”

image-20220405215548240

增加一条新的路由信息,将IGW加入路由表,点击“保存更改”

image-20220405215821313

1.3 创建子网

在子网页面选择创建子网

image-20220405214829109

子网的配置信息

  • 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

点击创建

注:这里设置两个子网的可用区不同

image-20220405214950454

image-20220405215012077

1.4 创建安全组

在安全组页面,点击“创建安全组”

image-20220405220012731

安全组配置

  • 名称: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

    配置完成之后点击创建

    image-20220405221347361

    image-20220405221358408

1.5 创建EC2

1.5.1 第一台

点击“启动新实例”

image-20220405220624810

AMI选中centos7

image-20220405220732793

类型选择含免费套餐的这个,点击下一步

image-20220405220823711

EC2的网络配置:

  • VPC:my-vpc-02
  • 子网:us-east-1a
  • 自动分配公有IP:禁用

点击下一步

image-20220405220946235

添加存储,保持默认,点击下一步

image-20220405221020586

标签设置,Name:test-net2-01,点击下一步

image-20220405221120138

安全组配置,选择现有的安全组,选择my-sg-02,点击审核和启动

image-20220405221633072

审核完成之后点击启动

image-20220405221703945

密钥对,如果没有就新建,输入密钥对的名称;如果有,就使用现有的密钥对。

1.5.2 第二台

大部分配置都与第一台相同

不同的配置如下

  • 子网设置与第一台不同,子网选择us-east-1b

image-20220405222054658

  • 标签设置为Name:test-net2-02

image-20220405222129756

1.6 创建弹性IP

  1. 在弹性IP页面,点击“分配弹性IP”

image-20220406010756355

  1. 直接点击分配即可

image-20220406010816653

  1. 将弹性IP分配到刚创建的EC2上

image-20220406011312797

选择对应的EC2,选择IP,点击分配

image-20220406011445860

  1. 重复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
2
3
4
5
6
#修改hostname
[centos@ip-10-0-1-59 ~]$ sudo -i
[root@ip-10-0-1-59 ~]# hostnamectl set-hostname test-net2-01
[root@ip-10-0-1-59 ~]# exit
logout
[centos@ip-10-0-1-59 ~]$ sudo -i

安装pip包管理工具

1
2
3
4
5
6
#安装pip包管理工具
[root@test-net2-01 ~]# yum install -y wget
[root@test-net2-01 ~]# wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
[root@test-net2-01 ~]# sudo python get-pip.py
[root@test-net2-01 ~]# pip -V
pip 20.3.4 from /usr/lib/python2.7/site-packages/pip (python 2.7)

安装flask模块

1
2
#安装flask模块
[root@test-net2-01 ~]# pip install flask

编写脚本文件

1
[root@test-net2-01 ~]# vi http_test

将以下内容复制到脚本文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#coding=utf-8

from flask import Flask
from flask import Response
import socket,json

def get_hostname():
# 获取本机计算机名称
hostname = socket.gethostname()

return {"hostname":hostname}


app = Flask(__name__)

@app.route("/")
def index():
result = get_hostname()
return Response(json.dumps(result), mimetype='application/json')
if __name__=="__main__":
app.run(host='0.0.0.0')

保存后退出

后台运行脚本文件

1
2
[root@test-net2-01 ~]# nohup python http_test > nohup.log 2>&1 &
[1] 9315

测试5000端口上的服务

1
2
[root@test-net2-01 ~]# curl 127.0.0.1:5000
{"hostname": "test-net2-01"}

3.创建ALB负载均衡器

3.1 创建目标组

在目标群组页面点击“创建目标组”

image-20220406014556009

创建目标组,配置设置

  • 目标类型:实例
  • 目标组名称:my-targer-02
  • 协议:HTTP:5000(!此处不能修改成别的,一定要是HTTP协议
    • 端口为5000,是因为EC2上对应的服务在5000端口
  • VPC:my-vpc-02

image-20220406015522649

点击下一步

image-20220406015535658

将两个实例添加为目标,点击创建目标组

image-20220406015820921

3.2 创建ALB负载均衡器

在负载均衡器页面,点击“新建负载均衡器”

image-20220406014046173

选择“Application Load Balancer”

image-20220406014124888

ALB配置

  • 名称:my-alb-02
  • VPC:my-vpc-02
  • 映射:选择有公共子网的可用区,选好可用区之后选择子网
  • 安全组:选择创建的my-sg-02
  • 侦听器和路由:创建2个侦听器,分别是80和5000端口,流量转发至my-target-02

配置完成之后,点击创建负载均衡器

image-20220406020101041

image-20220406020144666

image-20220406020221584

image-20220406020501241

负载均衡器需要一定的配置时间,等待10分钟左右会创建完成

3.3 ALB测试

复制负载均衡器my-alb-02的DNS名称

image-20220406021530401

在终端进行访问,可以看到有在进行负载均衡

1
2
3
4
5
6
7
8
9
10
11
[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
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}

image-20220406021612612

4.域名解析

4.1 获得免费域名

获取途径Freenom

本次实验使用的域名是modu2022.cf

4.2 Route 53 创建域

4.2.1 创建托管区域

在Route 53的托管区域页面,点击“创建托管区域”

image-20220406022118864

填入域名:modu2022.cf

image-20220406022005423

4.2.2 修改域名的名称服务器

记录下托管区域modu2022.cf的名称服务器

image-20220406022356427

将Freenom中对应域名的名称服务器改为上面的4个服务器

image-20220406022529216

4.2.3 创建记录

点击“创建记录”

image-20220406022740304

创建2条记录

记录1和记录2除了“记录名称”之外的地方都一致

记录1:

  • 类型:A
  • 流量路由至:别名
    • 选择Application和Classic Load Balancer的别名
    • 选择美国东部us-east-1
    • 选择创建的alb-02

点击“创建记录”

image-20220406022843968

4.3 域名测试

可以使用域名访问服务

1
2
3
4
5
6
7
8
9
10
11
[root@test-net2-01 ~]# for i in $(seq 1 10); do curl http://modu2022.cf &&echo ""; done
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}

image-20220406023531357

5.HTTPS访问

5.1 创建证书

使用AWS的ACM证书托管服务创建SSL证书

image-20220406023739857

请求证书,点击下一步

image-20220406023804895

填入域名,设置标签

  • 域名:modu2022.cf
  • 标签:Name:modu2022.cf

点击请求

image-20220406023922000

点击证书的链接,进入到证书设置中去

image-20220406024015520

点击“在Route 53中创建记录”

image-20220406024043744

点击“创建记录”

image-20220406024105623

证书的状态为”已颁发”

image-20220406024244882

5.2 ALB添加侦听器

给my-alb-02新增侦听内容

image-20220406024401239

侦听设置

  • HTTPS协议,443端口
  • 操作:转发至
  • 目标组:my-target-02
  • 安全侦听器设置
    • 安全策略:默认
    • SSL证书:选择创建的证书modu2022.cf

配置完成之后点击“添加”

image-20220406104955591

5.3 访问测试

1
2
3
4
5
6
7
8
9
10
11
[root@test-net2-01 ~]# for i in $(seq 1 10); do curl https://modu2022.cf &&echo ""; done
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}

image-20220406110211724

测试完成之后可以将2台EC2的弹性IP释放掉。

HTTPS访问(自建证书)

申请免费证书

笔者申请腾讯云的免费证书。

在搜索框输入“SSL证书”,进入“我的证书”页面,点击“申请免费证书”

image-20220407155954040

选择证书类型,保持默认就行,点击“确定”

image-20220407160119701

“提交资料”这一步只需要按照要求填写内容即可,点击“下一步”

image-20220407160315832

验证方式选择推荐的DNS验证,点击“下一步”

image-20220407160409715

将腾讯云上域名验证的部分,添加到托管的记录中

在托管域中新增一条CNAME类型的记录,把名称和值都填进去,点击创建记录

记录创建完成之后,在腾讯云平台上进行域名验证

image-20220407203509147

等待证书颁发,过程可能需要2个小时

okay,证书颁发完整之后,下载证书

image-20220408111659212

选择Nginx类型,下载

image-20220408112122014

在ACM中导入证书

在ACM页面中选择,导入证书

image-20220408113215099

将下载下来证书的对应内容复制进去

填写规则:

  • 对于 Certificate body(证书正文),粘贴要导入的 PEM 编码证书。它应以 -----BEGIN CERTIFICATE----- 开头并以 -----END CERTIFICATE----- 结尾。
  • 对于 Certificate private key(证书私有密钥),粘贴证书的 PEM 编码的未加密私有密钥。它应以 -----BEGIN PRIVATE KEY----- 开头并以 -----END PRIVATE KEY----- 结尾。
  • (可选) 对于 Certificate chain (证书链),粘贴 PEM 编码的证书链。

导入之后,点击“下一步”

image-20220408113452118

为证书添加标签,Name:modu2022.cg_SSL。标签不添加也可以。

image-20220408113709930

审核完成之后点击导入

image-20220408113752537

证书导入完毕

image-20220408115936587

修改负载均衡器

在负载均衡器中添加侦听器

image-20220408111521838

侦听器内容设置如下

  • 协议:HTTPS 443端口
  • 操作:转发
    • 目标组:my-target-02
  • 侦听器证书设置:“从ACM中”,选择新增的modu2022.cf证书

点击添加

测试访问

1
2
3
4
5
6
7
8
9
10
11
[root@test-net2-02 ~]# for i in $(seq 1 10); do curl https://modu2022.cf &&echo ""; done
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-01"}
{"hostname": "test-net2-02"}
{"hostname": "test-net2-01"}

image-20220408121453351

okay,自建证书也实现了ALB的负载均衡。

Part4 问题总结

  1. part3的3.1目标组配置的协议要是HTTP协议的5000端口。因为创建的ALB是对7层的流量进行负载均衡,所以协议要选择是7层协议。如果创建NLB,那么协议选择TCP的5000端口。

  2. part3的5.2部分添加侦听器时的协议要选择HTTPS协议的443端口。

    注意:HTTP协议的443端口和HTTPS协议的443端口不是同一个。

Part5 参考文献

AWS Application Load Balancer用户指南

将Route 53作为非活动域的DNS服务

亚马逊云服务器AWS配置ssl https证书