26、在 AWS 上部署 Kubernetes 环境的详细指南

在 AWS 上部署 Kubernetes 环境的详细指南

1. 公有云的优势

公有云具有简单、快速的特点,这使其不仅适用于临时使用,也适合长期使用,具备高度的灵活性和便利性。

2. AWS 组件概述

AWS 提供了一些用于配置网络和存储的组件,了解这些组件对于理解公有云的工作原理以及如何配置 Kubernetes 至关重要。

3. VPC 和子网
  • VPC 创建 :在 AWS 上,首先需要创建自己的网络,即虚拟专用云(VPC),它采用了软件定义网络(SDN)技术。可以创建一个或多个 VPC,每个 VPC 可根据需要相互连接。创建 VPC 时,只需定义一个网络 CIDR 块和 AWS 区域,例如在 us - east - 1 区域创建 10.0.0.0/16 的 CIDR 块。无论是否能访问公共网络,都可以在 /16 到 /28 的子网掩码范围内定义任何网络地址范围。创建 VPC 非常快速,创建完成后,需要在 VPC 内创建一个或多个子网。
# 指定 CIDR 块为 10.0.0.0/16
# 返回 VPC ID 为 "vpc - 0ca37d4650963adbb"
$ aws ec2 create - vpc --cidr - block 10.0.0.0/16
{
    "Vpc": {
        "CidrBlock": "10.0.0.0/16",
        "DhcpOptionsId": "dopt - 3d901958",
        "State": "pending",
        "VpcId": "vpc - 0ca37d4650963adbb",
...
  • 子网创建 :子网是一个逻辑网络块,必须属于一个 VPC 和一个可用区,且其网络 CIDR 必须在 VPC 的 CIDR 范围内。例如,若 VPC 的 CIDR 为 10.0.0.0/16(10.0.0.0 - 10.0.255.255),则一个子网的 CIDR 可以是 10.0.1.0/24(10.0.1.0 - 10.0.1.255)。下面将在 vpc - 0ca37d4650963adbb 中创建四个子网,具体步骤如下:
    1. 在 us - east - 1a 可用区创建第一个子网 10.0.1.0/24:
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.1.0/24 --availability - zone us - east - 1a
{
    "Subnet": {
        "AvailabilityZone": "us - east - 1a",
        "AvailabilityZoneId": "use1 - az6",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.1.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "pending",
        "SubnetId": "subnet - 09f8f7f06c27cb0a0",
        "VpcId": "vpc - 0ca37d4650963adbb",
...
2. 在 us - east - 1b 可用区创建第二个子网 10.0.2.0/24:
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.2.0/24 --availability - zone us - east - 1b
{
    "Subnet": {
        "AvailabilityZone": "us - east - 1b",
        "AvailabilityZoneId": "use1 - az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.2.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "pending",
        "SubnetId": "subnet - 04b78ed9b5f96d76e",
        "VpcId": "vpc - 0ca37d4650963adbb",
...
3. 在 us - east - 1b 可用区再次创建第三个子网 10.0.3.0/24:
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.3.0/24 --availability - zone us - east - 1b
{
    "Subnet": {
        "AvailabilityZone": "us - east - 1b",
        "AvailabilityZoneId": "use1 - az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.3.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "pending",
        "SubnetId": "subnet - 026058e32f09c28af",
        "VpcId": "vpc - 0ca37d4650963adbb",
...
4. 在 us - east - 1a 可用区再次创建第四个子网 10.0.4.0/24:
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.4.0/24 --availability - zone us - east - 1a
{
    "Subnet": {
        "AvailabilityZone": "us - east - 1a",
        "AvailabilityZoneId": "use1 - az6",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.4.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "pending",
        "SubnetId": "subnet - 08e16157c15cefcbc",
        "VpcId": "vpc - 0ca37d4650963adbb",
...

接下来,将前两个子网设置为面向公共网络的子网,后两个子网设置为私有子网。面向公共网络的子网可以从互联网访问,具有公共 IP 地址;而私有子网无法从互联网访问。要实现这一点,需要设置网关和路由表。

4. 互联网网关和 NAT - GW
  • 互联网网关(IGW) :在大多数情况下,VPC 需要与公共互联网连接,此时需要创建一个互联网网关(IGW)并将其附加到 VPC 上。
# 创建 IGW,返回 IGW ID 为 igw - 01769bff334dcc035
$ aws ec2 create - internet - gateway
{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw - 01769bff334dcc035",
        "Tags": []
    }
}
# 将 igw - 01769bff334dcc035 附加到 vpc - 0ca37d4650963adbb
$ aws ec2 attach - internet - gateway --vpc - id vpc - 0ca37d4650963adbb --internet - gateway - id igw - 01769bff334dcc035

IGW 附加完成后,为子网设置一个指向 IGW 的路由表(默认网关)。如果默认网关指向 IGW,则该子网可以拥有公共 IP 地址并可以与互联网进行通信;否则,该子网将被确定为私有子网,无法进行公共访问。

# 在 vpc - 0ca37d4650963adbb 内创建路由表
# 返回路由表 ID 为 rtb - 0f45fc46edec61d8f
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb - 0f45fc46edec61d8f",
...
# 设置默认路由(0.0.0.0/0)为 igw - 01769bff334dcc035
$ aws ec2 create - route --route - table - id rtb - 0f45fc46edec61d8f --gateway - id igw - 01769bff334dcc035 --destination - cidr - block 0.0.0.0/0
# 更新两个公共子网以使用此路由表
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 09f8f7f06c27cb0a0
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 026058e32f09c28af
# 公共子网在启动 EC2 时可以分配公共 IP
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 09f8f7f06c27cb0a0 --map - public - ip - on - launch
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 026058e32f09c28af --map - public - ip - on - launch
  • 网络地址转换网关(NAT - GW) :私有子网不需要公共 IP 地址,但有时需要访问互联网,例如下载软件包或访问 AWS 服务。此时,可以使用网络地址转换网关(NAT - GW)。NAT - GW 允许私有子网通过它访问公共互联网,因此 NAT - GW 必须位于公共子网中,私有子网的路由表将 NAT - GW 作为默认网关。需要注意的是,要在公共网络上访问 NAT - GW,需要将一个弹性 IP(EIP)附加到 NAT - GW 上。
# 分配 EIP,返回分配 ID 为 eipalloc - 044f4dbafe870a04a
$ aws ec2 allocate - address
{
    "PublicIp": "54.161.228.168",
    "AllocationId": "eipalloc - 044f4dbafe870a04a",
    "PublicIpv4Pool": "amazon",
    "Domain": "vpc"
}
# 在公共子网(subnet - 09f8f7f06c27cb0a0)上创建 NAT - GW,并分配 EIP eipalloc - 044f4dbafe870a04a
$ aws ec2 create - nat - gateway --subnet - id subnet - 09f8f7f06c27cb0a0 --allocation - id eipalloc - 044f4dbafe870a04a
{
    "NatGateway": {
        "CreateTime": "2018 - 12 - 09T20:17:33.000Z",
        "NatGatewayAddresses": [
            {
                "AllocationId": "eipalloc - 044f4dbafe870a04a"
            }
        ],
        "NatGatewayId": "nat - 05e34091f53f10172",
        "State": "pending",
        "SubnetId": "subnet - 09f8f7f06c27cb0a0",
        "VpcId": "vpc - 0ca37d4650963adbb"
    }
}

与 IGW 不同,NAT - GW 可以部署在单个可用区(AZ)中。如果需要高可用性的 NAT - GW,则需要在每个 AZ 上部署一个 NAT - GW。但是,AWS 会对弹性 IP 和 NAT - GW 收取额外的每小时费用。因此,如果想节省成本,可以像上述示例一样在单个 AZ 上启动一个 NAT - GW。创建 NAT - GW 需要几分钟时间,创建完成后,更新私有子网的路由表,使其指向 NAT - GW,这样任何 EC2 实例都可以访问互联网,但由于私有子网没有公共 IP 地址,因此公共互联网无法直接访问私有子网中的 EC2 实例。

# 与公共路由一样,首先需要创建一个路由表
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb - 08572c332e7e4f14e",
...
# 然后将默认网关设置为 NAT - GW
$ aws ec2 create - route --route - table - id rtb - 08572c332e7e4f14e --nat - gateway - id nat - 05e34091f53f10172 --destination - cidr - block 0.0.0.0/0
# 最后更新私有子网的路由表
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 04b78ed9b5f96d76e
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 08e16157c15cefcbc
5. 子网配置总结
子网类型 CIDR 块 可用区 子网 ID 路由表 ID 默认网关 EC2 启动时分配公共 IP
公共 10.0.1.0/24 us - east - 1a subnet - 09f8f7f06c27cb0a0 rtb - 0f45fc46edec61d8f igw - 01769bff334dcc035 (IGW)
私有 10.0.2.0/24 us - east - 1b subnet - 04b78ed9b5f96d76e rtb - 08572c332e7e4f14e nat - 05e34091f53f10172 (NAT - GW) 否(默认)
公共 10.0.3.0/24 us - east - 1b subnet - 026058e32f09c28af rtb - 0f45fc46edec61d8f igw - 01769bff334dcc035 (IGW)
私有 10.0.4.0/24 us - east - 1a subnet - 08e16157c15cefcbc rtb - 08572c332e7e4f14e nat - 05e34091f53f10172 (NAT - GW) 否(默认)
6. 子网部署建议
  • 若在公共子网中启动 EC2 实例,该实例将面向公共网络,可用于提供应用服务。
  • 若在私有子网中启动 EC2 实例,它仍可通过 NAT - GW 访问互联网,但互联网无法直接访问该实例。不过,它可以从公共子网的 EC2 主机进行访问。因此,理想情况下,可以在私有子网中部署数据库、中间件和监控工具等内部服务。
7. 安全组

当 VPC、子网以及相关的网关和路由配置完成后,就可以创建 EC2 实例了。但在此之前,需要至少创建一个访问控制,即安全组。安全组可以定义入站(传入网络访问)和出站(传出网络访问)防火墙规则。
- 公共子网安全组 :创建一个用于公共子网主机的安全组和规则,允许从您的机器的 IP 地址进行 SSH 访问,并在全球范围内开放 HTTP(80/tcp)访问。

# 为公共子网创建一个安全组
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name public --description "public facing host"
{
    "GroupId": "sg - 03973d9109a19e592"
}
# 检查您机器的公共 IP(如果不确定,可临时使用 0.0.0.0/0)
$ curl ifconfig.co
98.234.106.21
# 面向公共网络的机器仅允许从您的机器进行 SSH 访问
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 22 --cidr 98.234.106.21/32
# 面向公共网络的机器允许任何主机进行 HTTP 访问(0.0.0.0/0)
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 80 --cidr 0.0.0.0/0
  • 私有子网安全组 :创建一个用于私有子网主机的安全组,允许从公共子网主机进行 SSH 访问。在这种情况下,指定公共子网安全组 ID(sg - 03973d9109a19e592)而不是 CIDR 块会更方便。
# 为私有子网创建安全组
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name private --description "private subnet host"
{
    "GroupId": "sg - 0f4058a729e2c207e"
}
# 私有子网仅允许从公共子网主机的安全组进行 SSH 访问
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 22 --source - group sg - 03973d9109a19e592
# 它还允许从公共子网安全组进行 HTTP(80/TCP)访问
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 80 --source - group sg - 03973d9109a19e592

在为公共子网定义安全组时,强烈建议由安全专家进行审核。因为一旦将 EC2 实例部署到公共子网,它将拥有公共 IP 地址,包括黑客和机器人在内的任何人都可以直接访问您的实例。

8. 安全组总结
名称 安全组 ID 允许 SSH (22/TCP) 允许 HTTP (80/TCP)
公共 sg - 03973d9109a19e592 您的机器 (98.234.106.21) 0.0.0.0/0
私有 sg - 0f4058a729e2c207e 公共安全组 (sg - 03973d9109a19e592) 公共安全组 (sg - 03973d9109a19e592)
9. EC2 和 EBS
  • EC2 实例创建 :EC2 是 AWS 中一项重要的服务,可用于在 VPC 上启动虚拟机。根据硬件规格(CPU、内存和网络),AWS 提供了多种类型的 EC2 实例。启动 EC2 实例时,需要指定 VPC、子网、安全组和 SSH 密钥对,因此这些都必须事先创建好。由于前面已经完成了大部分步骤,现在只需创建 SSH 密钥对。
# 创建密钥对 (aws_rsa, aws_rsa.pub)
$ ssh - keygen - f ~/.ssh/aws_rsa - N ""
# 将 aws_rsa.pub 密钥注册到 AWS
$ aws ec2 import - key - pair --key - name = my - key --public - key - material "`cat ~/.ssh/aws_rsa.pub`"
{
    "KeyFingerprint": "73:89:80:1f:cc:25:94:7a:ba:f4:b0:81:ae:d8:bb:92",
    "KeyName": "my - key"
}
# 启动面向公共网络的主机,使用 Amazon Linux (ami - 009d6802948d06e52) 在 us - east - 1 区域
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 03973d9109a19e592 --subnet - id subnet - 09f8f7f06c27cb0a0
# 启动私有子网主机
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 0f4058a729e2c207e --subnet - id subnet - 04b78ed9b5f96d76e

几分钟后,在 AWS 网页控制台检查 EC2 实例的状态,可以看到公共子网主机有公共 IP 地址,而私有子网主机没有公共 IP 地址。

# 将私钥添加到 ssh - agent
$ ssh - add ~/.ssh/aws_rsa
# 使用 - A(转发 ssh - agent)选项 SSH 连接到公共子网主机
$ ssh - A ec2 - user@54.208.77.168
  • EBS 磁盘管理 :除了 EC2,AWS 还提供了一项名为弹性块存储(EBS)的重要磁盘管理服务。可以创建一个或多个持久数据存储,并将其附加到 EC2 实例上。从 EC2 的角度来看,EBS 就像一个 HDD/SSD。当终止(删除)EC2 实例时,EBS 及其内容可能会保留,并可以重新附加到另一个 EC2 实例上。
# 在 us - east - 1a 创建一个 40GB 的磁盘(与 EC2 公共子网实例所在区域相同)
$ aws ec2 create - volume --availability - zone us - east - 1a --size 40 --volume - type standard
{
    "CreateTime": "2018 - 12 - 09T22:13:41.000Z",
    "VolumeType": "standard",
    "SnapshotId": "",
    "VolumeId": "vol - 006aada6fa87c0060",
    "AvailabilityZone": "us - east - 1a",
    "Size": 40,
    "State": "creating",
    "Encrypted": false
}
# 将磁盘作为 /dev/xvdh 附加到公共子网主机
$ aws ec2 attach - volume --device xvdh --instance - id i - 0f2750f65dd857e54 --volume - id vol - 006aada6fa87c0060
{
    "State": "attaching",
    "InstanceId": "i - 0f2750f65dd857e54",
    "AttachTime": "2018 - 12 - 09T22:15:32.134Z",
    "VolumeId": "vol - 006aada6fa87c0060",
    "Device": "xvdh"
}

将 EBS 卷附加到 EC2 实例后,Linux 内核会识别指定的 /dev/xvdh,然后需要进行分区才能使用该设备。在这个例子中,创建了一个分区 /dev/xvdh1,并在其上创建 ext4 格式的文件系统,然后将其挂载到 EC2 实例上使用。卸载卷后,可以随时分离该卷并重新附加。

$ aws ec2 detach - volume --volume - id vol - 006aada6fa87c0060
{
    "InstanceId": "i - 0f2750f65dd857e54",
    "VolumeId": "vol - 006aada6fa87c0060",
    "State": "detaching",
    "Device": "xvdh",
    "AttachTime": "2018 - 12 - 09T22:15:32.000Z"
}

在 AWS 上部署 Kubernetes 环境的详细指南(下)

10. EC2 实例操作与验证

在完成 EC2 实例的创建和 EBS 磁盘的挂载后,我们可以进一步对 EC2 实例进行操作和验证。
- 登录公共子网 EC2 实例 :使用之前创建的 SSH 私钥登录到公共子网的 EC2 实例。

# 将私钥添加到 ssh - agent
$ ssh - add ~/.ssh/aws_rsa
# 使用 - A(转发 ssh - agent)选项 SSH 连接到公共子网主机
$ ssh - A ec2 - user@54.208.77.168

登录成功后,可以查看实例的网络信息。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ ifconfig eth0
eth0: flags = 4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
        inet 10.0.1.41 netmask 255.255.255.0 broadcast 10.0.1.255
        inet6 fe80::cf1:1ff:fe9f:c7b2 prefixlen 64 scopeid 0x20<link>
...

从输出可以看出,该公共子网主机不仅有公共 IP 地址,还有内部(私有)IP 地址,因为它部署在 10.0.1.0/24 子网中,私有地址范围为 10.0.1.1 - 10.0.1.254。
- 在公共子网主机上安装服务 :接下来,在公共子网主机上安装 nginx 网络服务器。

$ amazon - linux - extras |grep nginx
  4 nginx1.12 available [ = 1.12.2 ]
$ sudo amazon - linux - extras install nginx1.12
$ sudo systemctl start nginx

安装并启动 nginx 后,回到本地机器,通过公共 IP 地址检查网站是否正常运行。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ exit
logout
Connection to 54.208.77.168 closed.
$ curl - I 54.208.77.168
HTTP/1.1 200 OK
Server: nginx/1.12.2
...

如果返回 200 OK 状态码,说明 nginx 服务器已成功启动并可以正常访问。
- 从公共子网主机访问私有子网主机 :在同一 VPC 内,不同可用区之间是可达的。可以使用 SSH 从公共子网的 EC2 主机访问私有子网的主机。由于使用了 ssh - A 选项转发 ssh - agent,因此无需在 EC2 主机上创建 ~/.ssh/id_rsa 文件。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ ssh 10.0.2.116
...
       __| __|_ )
       _| ( / Amazon Linux 2 AMI
      ___|\___|___|
https://aws.amazon.com/amazon - linux - 2/
1 package(s) needed for security, out of 5 available
Run "sudo yum update" to apply all updates.
[ec2 - user@ip - 10 - 0 - 2 - 116 ~]$

通过以上操作,验证了公共子网和私有子网之间的通信以及服务的正常运行。

11. EBS 磁盘的使用与管理
  • EBS 磁盘分区与挂载 :在将 EBS 卷附加到 EC2 实例后,需要对其进行分区和格式化才能使用。在之前的例子中,我们创建了一个 40GB 的 EBS 卷并将其附加到公共子网主机的 /dev/xvdh 设备上。接下来,对该设备进行分区。
# 假设已经完成分区,创建了 /dev/xvdh1 分区
# 在 /dev/xvdh1 上创建 ext4 文件系统
$ sudo mkfs.ext4 /dev/xvdh1
# 创建挂载点
$ sudo mkdir /mnt/ebs
# 挂载 EBS 卷
$ sudo mount /dev/xvdh1 /mnt/ebs

挂载完成后,就可以在 /mnt/ebs 目录下存储数据了。
- EBS 磁盘卸载与分离 :当不再需要使用 EBS 卷时,可以先卸载它,然后将其从 EC2 实例中分离。

# 卸载 EBS 卷
$ sudo umount /mnt/ebs
# 分离 EBS 卷
$ aws ec2 detach - volume --volume - id vol - 006aada6fa87c0060
{
    "InstanceId": "i - 0f2750f65dd857e54",
    "VolumeId": "vol - 006aada6fa87c0060",
    "State": "detaching",
    "Device": "xvdh",
    "AttachTime": "2018 - 12 - 09T22:15:32.000Z"
}

分离后,EBS 卷及其数据仍然保留,可以在需要时重新附加到其他 EC2 实例上。

12. 整体架构总结

为了更清晰地理解整个 AWS 环境的架构,下面通过一个 mermaid 流程图来展示各个组件之间的关系。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px

    A(VPC):::process --> B1(公共子网 10.0.1.0/24):::process
    A --> B2(公共子网 10.0.3.0/24):::process
    A --> C1(私有子网 10.0.2.0/24):::process
    A --> C2(私有子网 10.0.4.0/24):::process
    B1 --> D(IGW):::process
    B2 --> D
    C1 --> E(NAT - GW):::process
    C2 --> E
    D --> F(公共互联网):::process
    E --> F
    B1 --> G(公共子网 EC2 实例):::process
    B2 --> G
    C1 --> H(私有子网 EC2 实例):::process
    C2 --> H
    G --> I(EBS 卷):::process

从流程图可以看出,VPC 包含了公共子网和私有子网,公共子网通过 IGW 与公共互联网相连,而私有子网通过 NAT - GW 访问公共互联网。公共子网和私有子网中分别部署了 EC2 实例,公共子网的 EC2 实例还可以挂载 EBS 卷来存储数据。

13. 操作步骤总结

为了方便大家参考,下面将整个部署过程的操作步骤进行总结。
1. 创建 VPC

$ aws ec2 create - vpc --cidr - block 10.0.0.0/16
  1. 创建子网
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.1.0/24 --availability - zone us - east - 1a
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.2.0/24 --availability - zone us - east - 1b
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.3.0/24 --availability - zone us - east - 1b
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.4.0/24 --availability - zone us - east - 1a
  1. 创建 IGW 并附加到 VPC
$ aws ec2 create - internet - gateway
$ aws ec2 attach - internet - gateway --vpc - id vpc - 0ca37d4650963adbb --internet - gateway - id igw - 01769bff334dcc035
  1. 为公共子网设置路由表
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
$ aws ec2 create - route --route - table - id rtb - 0f45fc46edec61d8f --gateway - id igw - 01769bff334dcc035 --destination - cidr - block 0.0.0.0/0
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 09f8f7f06c27cb0a0
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 026058e32f09c28af
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 09f8f7f06c27cb0a0 --map - public - ip - on - launch
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 026058e32f09c28af --map - public - ip - on - launch
  1. 创建 NAT - GW
$ aws ec2 allocate - address
$ aws ec2 create - nat - gateway --subnet - id subnet - 09f8f7f06c27cb0a0 --allocation - id eipalloc - 044f4dbafe870a04a
  1. 为私有子网设置路由表
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
$ aws ec2 create - route --route - table - id rtb - 08572c332e7e4f14e --nat - gateway - id nat - 05e34091f53f10172 --destination - cidr - block 0.0.0.0/0
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 04b78ed9b5f96d76e
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 08e16157c15cefcbc
  1. 创建安全组
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name public --description "public facing host"
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name private --description "private subnet host"
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 22 --cidr 98.234.106.21/32
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 80 --cidr 0.0.0.0/0
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 22 --source - group sg - 03973d9109a19e592
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 80 --source - group sg - 03973d9109a19e592
  1. 创建 SSH 密钥对
$ ssh - keygen - f ~/.ssh/aws_rsa - N ""
$ aws ec2 import - key - pair --key - name = my - key --public - key - material "`cat ~/.ssh/aws_rsa.pub`"
  1. 创建 EC2 实例
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 03973d9109a19e592 --subnet - id subnet - 09f8f7f06c27cb0a0
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 0f4058a729e2c207e --subnet - id subnet - 04b78ed9b5f96d76e
  1. 创建并挂载 EBS 卷
$ aws ec2 create - volume --availability - zone us - east - 1a --size 40 --volume - type standard
$ aws ec2 attach - volume --device xvdh --instance - id i - 0f2750f65dd857e54 --volume - id vol - 006aada6fa87c0060
$ sudo mkfs.ext4 /dev/xvdh1
$ sudo mkdir /mnt/ebs
$ sudo mount /dev/xvdh1 /mnt/ebs
14. 总结与建议

通过以上步骤,我们详细介绍了在 AWS 上部署 Kubernetes 环境所需的网络、存储和计算资源的配置过程。在实际应用中,还可以根据具体需求对这些配置进行调整和优化。例如,可以根据业务负载选择合适的 EC2 实例类型,或者根据数据存储需求调整 EBS 卷的大小和类型。同时,在设置安全组时,要严格控制访问权限,避免安全漏洞。希望本文能帮助大家更好地理解和使用 AWS 平台来构建自己的云计算环境。

在 AWS 上部署 Kubernetes 环境的详细指南(下)

10. EC2 实例操作与验证

在完成 EC2 实例的创建和 EBS 磁盘的挂载后,我们可以进一步对 EC2 实例进行操作和验证。
- 登录公共子网 EC2 实例 :使用之前创建的 SSH 私钥登录到公共子网的 EC2 实例。

# 将私钥添加到 ssh - agent
$ ssh - add ~/.ssh/aws_rsa
# 使用 - A(转发 ssh - agent)选项 SSH 连接到公共子网主机
$ ssh - A ec2 - user@54.208.77.168

登录成功后,可以查看实例的网络信息。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ ifconfig eth0
eth0: flags = 4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 9001
        inet 10.0.1.41 netmask 255.255.255.0 broadcast 10.0.1.255
        inet6 fe80::cf1:1ff:fe9f:c7b2 prefixlen 64 scopeid 0x20<link>
...

从输出可以看出,该公共子网主机不仅有公共 IP 地址,还有内部(私有)IP 地址,因为它部署在 10.0.1.0/24 子网中,私有地址范围为 10.0.1.1 - 10.0.1.254。
- 在公共子网主机上安装服务 :接下来,在公共子网主机上安装 nginx 网络服务器。

$ amazon - linux - extras |grep nginx
  4 nginx1.12 available [ = 1.12.2 ]
$ sudo amazon - linux - extras install nginx1.12
$ sudo systemctl start nginx

安装并启动 nginx 后,回到本地机器,通过公共 IP 地址检查网站是否正常运行。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ exit
logout
Connection to 54.208.77.168 closed.
$ curl - I 54.208.77.168
HTTP/1.1 200 OK
Server: nginx/1.12.2
...

如果返回 200 OK 状态码,说明 nginx 服务器已成功启动并可以正常访问。
- 从公共子网主机访问私有子网主机 :在同一 VPC 内,不同可用区之间是可达的。可以使用 SSH 从公共子网的 EC2 主机访问私有子网的主机。由于使用了 ssh - A 选项转发 ssh - agent,因此无需在 EC2 主机上创建 ~/.ssh/id_rsa 文件。

[ec2 - user@ip - 10 - 0 - 1 - 41 ~]$ ssh 10.0.2.116
...
       __| __|_ )
       _| ( / Amazon Linux 2 AMI
      ___|\___|___|
https://aws.amazon.com/amazon - linux - 2/
1 package(s) needed for security, out of 5 available
Run "sudo yum update" to apply all updates.
[ec2 - user@ip - 10 - 0 - 2 - 116 ~]$

通过以上操作,验证了公共子网和私有子网之间的通信以及服务的正常运行。

11. EBS 磁盘的使用与管理
  • EBS 磁盘分区与挂载 :在将 EBS 卷附加到 EC2 实例后,需要对其进行分区和格式化才能使用。在之前的例子中,我们创建了一个 40GB 的 EBS 卷并将其附加到公共子网主机的 /dev/xvdh 设备上。接下来,对该设备进行分区。
# 假设已经完成分区,创建了 /dev/xvdh1 分区
# 在 /dev/xvdh1 上创建 ext4 文件系统
$ sudo mkfs.ext4 /dev/xvdh1
# 创建挂载点
$ sudo mkdir /mnt/ebs
# 挂载 EBS 卷
$ sudo mount /dev/xvdh1 /mnt/ebs

挂载完成后,就可以在 /mnt/ebs 目录下存储数据了。
- EBS 磁盘卸载与分离 :当不再需要使用 EBS 卷时,可以先卸载它,然后将其从 EC2 实例中分离。

# 卸载 EBS 卷
$ sudo umount /mnt/ebs
# 分离 EBS 卷
$ aws ec2 detach - volume --volume - id vol - 006aada6fa87c0060
{
    "InstanceId": "i - 0f2750f65dd857e54",
    "VolumeId": "vol - 006aada6fa87c0060",
    "State": "detaching",
    "Device": "xvdh",
    "AttachTime": "2018 - 12 - 09T22:15:32.000Z"
}

分离后,EBS 卷及其数据仍然保留,可以在需要时重新附加到其他 EC2 实例上。

12. 整体架构总结

为了更清晰地理解整个 AWS 环境的架构,下面通过一个 mermaid 流程图来展示各个组件之间的关系。

graph LR
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke - width:2px

    A(VPC):::process --> B1(公共子网 10.0.1.0/24):::process
    A --> B2(公共子网 10.0.3.0/24):::process
    A --> C1(私有子网 10.0.2.0/24):::process
    A --> C2(私有子网 10.0.4.0/24):::process
    B1 --> D(IGW):::process
    B2 --> D
    C1 --> E(NAT - GW):::process
    C2 --> E
    D --> F(公共互联网):::process
    E --> F
    B1 --> G(公共子网 EC2 实例):::process
    B2 --> G
    C1 --> H(私有子网 EC2 实例):::process
    C2 --> H
    G --> I(EBS 卷):::process

从流程图可以看出,VPC 包含了公共子网和私有子网,公共子网通过 IGW 与公共互联网相连,而私有子网通过 NAT - GW 访问公共互联网。公共子网和私有子网中分别部署了 EC2 实例,公共子网的 EC2 实例还可以挂载 EBS 卷来存储数据。

13. 操作步骤总结

为了方便大家参考,下面将整个部署过程的操作步骤进行总结。
1. 创建 VPC

$ aws ec2 create - vpc --cidr - block 10.0.0.0/16
  1. 创建子网
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.1.0/24 --availability - zone us - east - 1a
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.2.0/24 --availability - zone us - east - 1b
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.3.0/24 --availability - zone us - east - 1b
$ aws ec2 create - subnet --vpc - id vpc - 0ca37d4650963adbb --cidr - block 10.0.4.0/24 --availability - zone us - east - 1a
  1. 创建 IGW 并附加到 VPC
$ aws ec2 create - internet - gateway
$ aws ec2 attach - internet - gateway --vpc - id vpc - 0ca37d4650963adbb --internet - gateway - id igw - 01769bff334dcc035
  1. 为公共子网设置路由表
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
$ aws ec2 create - route --route - table - id rtb - 0f45fc46edec61d8f --gateway - id igw - 01769bff334dcc035 --destination - cidr - block 0.0.0.0/0
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 09f8f7f06c27cb0a0
$ aws ec2 associate - route - table --route - table - id rtb - 0f45fc46edec61d8f --subnet - id subnet - 026058e32f09c28af
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 09f8f7f06c27cb0a0 --map - public - ip - on - launch
$ aws ec2 modify - subnet - attribute --subnet - id subnet - 026058e32f09c28af --map - public - ip - on - launch
  1. 创建 NAT - GW
$ aws ec2 allocate - address
$ aws ec2 create - nat - gateway --subnet - id subnet - 09f8f7f06c27cb0a0 --allocation - id eipalloc - 044f4dbafe870a04a
  1. 为私有子网设置路由表
$ aws ec2 create - route - table --vpc - id vpc - 0ca37d4650963adbb
$ aws ec2 create - route --route - table - id rtb - 08572c332e7e4f14e --nat - gateway - id nat - 05e34091f53f10172 --destination - cidr - block 0.0.0.0/0
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 04b78ed9b5f96d76e
$ aws ec2 associate - route - table --route - table - id rtb - 08572c332e7e4f14e --subnet - id subnet - 08e16157c15cefcbc
  1. 创建安全组
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name public --description "public facing host"
$ aws ec2 create - security - group --vpc - id vpc - 0ca37d4650963adbb --group - name private --description "private subnet host"
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 22 --cidr 98.234.106.21/32
$ aws ec2 authorize - security - group - ingress --group - id sg - 03973d9109a19e592 --protocol tcp --port 80 --cidr 0.0.0.0/0
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 22 --source - group sg - 03973d9109a19e592
$ aws ec2 authorize - security - group - ingress --group - id sg - 0f4058a729e2c207e --protocol tcp --port 80 --source - group sg - 03973d9109a19e592
  1. 创建 SSH 密钥对
$ ssh - keygen - f ~/.ssh/aws_rsa - N ""
$ aws ec2 import - key - pair --key - name = my - key --public - key - material "`cat ~/.ssh/aws_rsa.pub`"
  1. 创建 EC2 实例
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 03973d9109a19e592 --subnet - id subnet - 09f8f7f06c27cb0a0
$ aws ec2 run - instances --image - id ami - 009d6802948d06e52 --instance - type t2.nano --key - name my - key --security - group - ids sg - 0f4058a729e2c207e --subnet - id subnet - 04b78ed9b5f96d76e
  1. 创建并挂载 EBS 卷
$ aws ec2 create - volume --availability - zone us - east - 1a --size 40 --volume - type standard
$ aws ec2 attach - volume --device xvdh --instance - id i - 0f2750f65dd857e54 --volume - id vol - 006aada6fa87c0060
$ sudo mkfs.ext4 /dev/xvdh1
$ sudo mkdir /mnt/ebs
$ sudo mount /dev/xvdh1 /mnt/ebs
14. 总结与建议

通过以上步骤,我们详细介绍了在 AWS 上部署 Kubernetes 环境所需的网络、存储和计算资源的配置过程。在实际应用中,还可以根据具体需求对这些配置进行调整和优化。
- 资源调整
- EC2 实例类型 :根据业务负载选择合适的 EC2 实例类型。如果业务流量较小,可选择 t2.nano 等较小规格的实例;如果业务需要高计算能力,可选择计算优化型实例。
- EBS 卷 :根据数据存储需求调整 EBS 卷的大小和类型。对于需要高读写性能的应用,可选择 SSD 类型的 EBS 卷;对于对性能要求不高的存储场景,可选择标准类型的 EBS 卷。
- 安全优化 :在设置安全组时,要严格控制访问权限,避免安全漏洞。例如,只允许必要的 IP 地址和端口进行访问,定期审查和更新安全组规则。
- 高可用性 :如果需要高可用性的服务,可以在多个可用区部署 EC2 实例和 NAT - GW,以防止单个可用区出现故障导致服务中断。

希望本文能帮助大家更好地理解和使用 AWS 平台来构建自己的云计算环境。

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了高并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中高级研发人员,尤其是希望深入理解高并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下高并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握高并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值