在 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 中创建四个子网,具体步骤如下:
- 在 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
- 创建子网 :
$ 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
- 创建 IGW 并附加到 VPC :
$ aws ec2 create - internet - gateway
$ aws ec2 attach - internet - gateway --vpc - id vpc - 0ca37d4650963adbb --internet - gateway - id igw - 01769bff334dcc035
- 为公共子网设置路由表 :
$ 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
- 创建 NAT - GW :
$ aws ec2 allocate - address
$ aws ec2 create - nat - gateway --subnet - id subnet - 09f8f7f06c27cb0a0 --allocation - id eipalloc - 044f4dbafe870a04a
- 为私有子网设置路由表 :
$ 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
- 创建安全组 :
$ 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
- 创建 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`"
- 创建 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
- 创建并挂载 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
- 创建子网 :
$ 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
- 创建 IGW 并附加到 VPC :
$ aws ec2 create - internet - gateway
$ aws ec2 attach - internet - gateway --vpc - id vpc - 0ca37d4650963adbb --internet - gateway - id igw - 01769bff334dcc035
- 为公共子网设置路由表 :
$ 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
- 创建 NAT - GW :
$ aws ec2 allocate - address
$ aws ec2 create - nat - gateway --subnet - id subnet - 09f8f7f06c27cb0a0 --allocation - id eipalloc - 044f4dbafe870a04a
- 为私有子网设置路由表 :
$ 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
- 创建安全组 :
$ 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
- 创建 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`"
- 创建 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
- 创建并挂载 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 平台来构建自己的云计算环境。
超级会员免费看
49

被折叠的 条评论
为什么被折叠?



