云计算架构学习整理(六):网络资源管理的机制

185 阅读11分钟

前言

云计算架构作为一种基础设施服务几乎已经成为了现代Web开发的标配,它显著地降低了 DevOps(Development and Operations)的门槛,通过云服务商提供的管理平台,Web应用开发人员可以轻松地在云上搭建自己的系统。作为一名云时代的全栈开发工程师,了解云计算架构背后的机制可以让我们更好地利用这个强大的基础设施,在设计、开发、部署和维护应用程序时做出更明智的决策。同时云计算是互联网技术的延伸,通过学习云计算架构,可以更深入地掌握互联网基础知识,这对于个人的技术水平也是一个很大的提升。

为了对云计算有一个全面的了解,最近在读 《图解云计算架构——基础设施和API》 一书,这本书主要以OpenStackAWS为例,通过API来重点讲解IaaS云服务的本质。下面是边读边整理的学习笔记,一方面可以随时回顾,另一方面希望通过输出来促进自己思考。

正文

1. 网络资源的基本操作和API

云网络的特性和基本思路

在云环境中,网络的基础也依然是TCP/IP,而网络功能大致分为两类:

  • L2数据链路层网络功能:用于支持同一网络内设备之间的通信;
  • L3网络层网络功能:用于连接不同的L2网络。

虚拟交换机和子网

虚拟交换机:相当于网络交换机,提供了L2网络的功能。接入到同一台虚拟交换机上的云服务器之间可以直接通信,不需要配置路由规则。另外还可以将L3网络使用的IP地址范围作为“子网”关联到虚拟交换机上。

  • OpenStack Neutron:Neutron网络还是在模拟物理网络。虚拟交换机称为“网络”,子网仍叫做“子网”。用户可以任意指定子网的IP地址范围,还可以将多个子网关联到一个网络上。
  • AWS VPC:VPC(Virtual Private Cloud)仅仅指定了“子网”,没有定义虚拟交换机对应的资源。

子网:来自子网中的IP地址被分配到已接入该子网的服务器后,服务器就可以在启动时通过DHCP获取该IP地址,进而开始通信了。虚拟子网只允许服务器用分配到的IP地址,且服务器只能在被分配的网络之内通信。

IP地址范围

在OpenStack和AWS中,创建子网时所指定的IP地址范围都被称为CIDR(Classless Inter-Donmain Routing,无类别域间路由)。

为什么用CIDR来表示IP地址呢?

  • IP地址由标识子网的网络地址和标识子网内每台主机的主机地址构成,其中网络地址的长度(比特数)被称为子网掩码。
  • 早期网络方案:使用IP地址前几位的值来决定子网掩码的长度,把子网分为A类、B类、C类。
    • A类地址子网掩码长度是8个比特,地址数为1600万;
    • B类地址子网掩码长度是16位,地址数是65536个;
    • C类地址子网掩码长度是24位,地址数是256个。
    子网的大小由地址本身决定,导致IP地址的利用率不高,互联网用户的增长引起IP地址短缺。
  • CIDR方案:不使用地址分类的路由规则,采用CIDR记法,如172.16.193.0/16,后面的16表示子网掩码的长度,CIDR的子网大小是可变的,这样就可以按需分配子网的大小,从而合理分配IP地址。

虚拟路由器

跟物理路由器一样,虚拟路由器也具备连接不同网络的功能:

  • 内部->内部:连接多个网络,实现服务器之间的跨网络通信。多用于连接同一租户内或VPC内的多个网络
  • 内部->外部:将云环境的专用网络和互联网等外部网络连接起来。从内到外的通信过程中,虚拟路由器会进行NAT转换(IP伪装),将内部网络使用的私有IP地址转换为公用的公有IP地址。
  • 外部->内部:支持从外部网络访问云网络内部的服务器。用户先从地址池申请公有IP地址(这个公有IP地址在OpenStack中称为浮动IP,在AWS中称为弹性IP或EIP),申请成功后将该IP地址关联到服务器的逻辑端口上。这样一来,通过在虚拟服务器上进行NAT网络地址转换,将公有IP地址转换为服务器的私有IP地址,就可以实现从外部网络访问云网络内部的服务器。

逻辑端口

我们可以把逻辑端口想象成在虚拟网络上创建的交换机端口。在OpenStack Neutron中它是连接到虚拟交换机上的,因此称为“逻辑端口”;在AWS中是服务器接入网络的接口,因此称为ENI(Elastic Network Interface,弹性网络接口)

创建逻辑端口时,云会从逻辑端口所属的虚拟子网中获取一个IP地址,然后将这个IP地址分配给逻辑端口。一个逻辑端口可以分配到多个IP地址,因此虚拟服务器的NIC也可以带有多个IP地址。另外,还可以给一台服务器关联多个逻辑端口。

安全组

安全组提供了对进出虚拟服务器的网络流量进行过滤的功能。安全组的应用以逻辑端口为单位,它是在网络层级别上进行的,对安全组的管理和控制不依赖于虚拟服务器的操作系统和应用程序,这样对租户管理网络来说应用安全策略的过程就相对简单。

安全组中的规则

我们可以在规则中指定流量的方向、协议类型、端口号以及通信对象。

  • 流量方向:输入表示从外部网络到虚拟服务器的方向,输出则相反
  • 通信对象:如果是输入方向,那么通信对象就是发送方,反之就是接收方。指定通信对象的方法有两种:一种是指定IP地址范围,另一种是指定整个安全组

一个逻辑端口可以应用多个安全组。对流量进行匹配时,只要流量与逻辑端口上的安全组中任意一条规则匹配,安全组就会允许(ACCEPT)通信,否则就会丢弃(DROP)流量。

一个安全组可以应用到多个逻辑端口。这样就可以创建通用的安全组,并将其统一应用到功能相同的逻辑端口上,提升规则管理的效率。

将安全组指定为通信对象

在云中经常需要增加或减少具有某种功能的服务器,安全组正好就可以定义出某种“组”,只要把安全组指定为通信对象,就可以方便地管理安全组的应用对象。

网络访问控制列表

在AWS中,除了安全组,还可以使用网络访问控制列表(NACL,Network Access Control List)功能。它对于进出子网的流量进行过滤。在NACL和安全组中,基础的过滤要素是一样的,区别是安全组的默认行为是拒绝,而NACL的默认行为是允许。因此NACL适用于需要明确指出丢弃哪些流量的情况。

另外,在NACL中配置的规则是无状态的,意味着它在处理网络流量时不会记住之前的通信会话或数据包。

  • 每个数据包都独立处理:无论是入站还是出站的数据包,NACL都会根据预设规则单独评估每个数据包,而不考虑之前的数据包或会话状态。
  • 不自动允许回应流量:如果一个请求数据包被允许进入(IN),其响应数据包必须也符合NACL的出站规则(OUT)才能被允许通过。这与有状态的防火墙不同,后者会自动允许合法连接的回应流量。

因此,在配置NACL时,需要确保为入站和出站流量设置适当的规则,以保证通信的连贯性。

2. 网络资源的API操作

用于搭建网络的API的调用流程

OpenStack Neutron中搭建网络的内部API调用流程:

  1. 创建虚拟网络:指定网络名称
  2. 创建子网:给定CIDR和网关的IP地址,以及要关联的虚拟网络的UUID
  3. 创建逻辑端口
  4. 创建虚拟路由器:提供名称
  5. 连接虚拟路由器和子网
  6. 连接虚拟路由器和外部网络

3. 网络资源的内部结构

云网络的隔离

多租户环境下不同用户共用同一子网地址的情况下,云是如何实现网络隔离的?

操作虚拟网络的进程:

  • OpenStack Neutron中有一类主机称为“控制节点”,里面运行着nova-api、neutron-server等进程,这些进程负责接收来自用户的API调用请求。
  • 另一种主机称为“计算节点”,里面运行着操作KVM的nova-compute进程和控制Open vSwitch的L2 agent,主要负责利用KVM实际启动虚拟服务器并通过Open vSwitch搭建虚拟网络。
  • 用户将创建虚拟服务器或操作虚拟网络的请求发送给控制节点后,控制节点就会一边控制nova-api、neutron-server及其他OpenStack进程,一边操作计算节点来搭建环境。
graph TD
client(client)
client --REST API--> nova-api
client --REST API--> neutron-server
nova-api -- AMQP --> nova-compute
neutron-server -- AMQP --> L2-agent
subgraph 控制节点
nova-api <--> neutron-server
end
subgraph 计算节点
nova-compute
kvm
L2-agent
OVS
end

标识网络:

  • 一个租户可以跨多个计算节点部署虚拟服务器;一个计算节点中可以包含不同租户的虚拟服务器
  • VLAN隔离:由于每个VLAN构成一个独立的广播域,因此即使两个VLAN位于同一物理网络上,它们之间也不会互相影响。例如,在云计算环境中,这允许租户A的流量完全与租户B隔离开来,即使它们使用的是同一个物理网络基础设施。
  • 跨节点通信:对于跨越多个计算节点的VLAN流量,数据包需要通过支持VLAN标记的交换机或路由器进行传输。这些中间设备依据数据包上的VLAN ID信息来决定如何正确路由数据包至目标节点或子网。
  • 一个计算节点中的不同租户的虚拟服务器用不同的VLAN ID标识,从而隔离不同的虚拟网络。这样,IP地址相同的虚拟服务器即使部署在同一台主机上,也不会影响通信。
  • VXLAN:VXLAN(虚拟扩展局域网)是一种网络虚拟化技术,旨在解决大型云计算环境中虚拟机迁移和多租户隔离的问题。VXLAN是通过封装以太网帧在L3网络上搭建L2网络的隧道协议。VXLAN根据要到达的虚拟接口,识别出虚拟服务器发出的数据包所属的虚拟网路,并为其分配用于标识虚拟网络的VLAN ID。

4. 云网络和SDN

  • SDN的定义:SDN(Software-Defined Networking,软件定义网络)是一种新型的网络架构设计和管理方式,它将传统网络设备中的数据平台(data plane)与控制平台(control plane)分离,从而实现了对网络流量的集中管理和动态配置。
  • SDN的核心思想:通过软件来控制和管理硬件资源,使得网络更加灵活、自动化且易于维护。
  • OpenStack Neutron和AWS VPC所实现的正是云上的SDN

小结

本节主要介绍了交换机、子网、路由器、端口、安全组和NACL等网络资源的概念,以及相关的API流程。通过将这些资源组合起来,就可以借助API搭建网络的拓扑结构。