Ironic的网络方案系列(二)

Ironic的网络方案系列(一)给大家描述了ironic的组网概况以及各个阶段的网络要求,本系列重点讲解inspect阶段的详细流程。

创建ironic node

使用ipmitool的LAN接口可以远程访问物理服务器。为了便于统一管理,我们不使用默认的IPMI用户(root),而是创建一个新的用户专门给ironic使用。对于ipmitool来说,无论创建新的IPMI用户还是修改已有用户的密码,都需要指定user id。

BMC的LAN channel可用的user id有数十个,除了user id 2被默认的root用户占用。ironic只管自己使用的IPMI用户,管理员也可以创建其它的用户,这会导致并非每一台物理服务器上分配给ironic用户的user id都一样。所以在批量操作时,如果物理服务器上可用的user id不尽相同,需要逐一处理。

ironic node作为物理服务器在ironic中的管理对象,一台被ironic管理的物理服务器需要对应一个ironic node。ironic node中不仅包含IPMI地址、登录信息,而且还包含电源状态和操作状态等。管理员可以直接设置ironic node的状态或者由用户通过创建资源的方式间接设置ironic node的状态。

如前文所述,ironic使用ipmitool对物理服务器进行电源控制、启动顺序调整等。虽然针对每台物理服务器的操作并不频繁且单个IPMI消息传输的数据量并不大,但也需要可靠的BMC和 IPMI网络做支撑。

这是因为,ironic会定期通过IPMI查询并同步每一台物理服务器的电源状态。在实际使用过程中,我们发现由于物理服务器BMC自身或者交换机的问题,存在部分物理服务器的IPMI访问偶尔会出现延时增大或者连接失败的情况。

当一个ironic-conductor管理许多台物理服务器时,部分物理服务器的IPMI访问延时增大会影响整体任务的执行。而连接失败则会导致获取电源状态失败。

一旦某一个时刻获取电源状态失败,ironic出于维护需要会自动将对应的ironic node置为维护状态。即使下一次可以获取到电源状态,ironic也不会取消这个ironic node的维护状态。只能通过人工操作的方式,这样会增加运维开销。

ironic-inspector服务支持自动创建ironic node,简单来说是在inspect时获取物理服务器的BMC地址,并根据该地址查询数据库。如果找不到对应的ironic node,则创建一个新的node,并按照inspect预置的规则去设置新的IPMI用户名和密码。但这种方法存在潜在的风险,比如多个物理服务器的BMC地址冲突,误配置等。

inspect阶段

ironic-inspector服务概述

ironic-inspector作为一个发现硬件信息的辅助服务,依附于ironic但独立运行。硬件信息的发现是由运行在物理服务器上的ironic-python-agent和ironic-inspector服务共同完成。ironic-python-agent负责信息的采集和传输。ironic-inspector服务负责信息的处理。

agent采集的信息,包括CPU个数、CPU feature flag、memory size、disk size、网卡IP、MAC地址等。有了这些信息,可用构造出基本的资源信息,供调度使用。

如果对接SDN网络,还需要监听业务网卡上收到的LLDP报文。这个报文由对端接入交换机发送。LLDP消息中包含了chassis ID和port ID,用于标记交换机的端口,使得SDN控制器可以将指定的转发规则下发到指定的交换机端口上。

ironic-inspect网络示意图

图三,ironic-inspect网络示意图

上图展示了ironic控制节点与物理服务器之间的网络通信,既有承载IPMI消息的OOB network(带外管理网),也有承载PXE和ironic-inspect API消息的inspection network。

将物理服务器连接到IPMI接入交换机并进行初始配置,使得控制节点上的ironic-conductor服务可以通过ipmitool控制物理服务器。

如图一的描述,物理服务器和ironic控制节点的业务网卡均连接到业务网接入交换机,inspection network承载于业务网之上。

组网说明

在实际的项目中,我们主要使用VLAN和VxLAN网络。VxLAN网络适合大规模、复杂环境。

inspection network不能通过neutron创建,需要由管理员通过SDN控制器进行配置。

VLAN网络

业务网络为VLAN网络,inspection network通过Native VLAN互通。使用VLAN网络,只能提供一个inspection network。

物理服务器在inspect阶段收发untagged报文,而ironic控制节点根据配置既可以收发untagged报文,也可以收发VLAN tagged报文。

图四, VLAN网络

以上图为例,交换机SW1,SW2的port 1和port 2均配置成truck port,且Native VLAN为2。Native VLAN也可以不用配置,如果没有配置,默认的Native VLAN和Default VLAN一样,为VLAN 1。

inspect阶段所有的报文都将以untagged报文方式收发。但是如果交换机之间的port 2和ironic控制节点上联的SW2的port 1配置了tag native,则交换机发送VLAN tagged报文。tag native简单来说配置在交换机的端口上,使得从Native VLAN发送出去的报文也得打上Native VLAN tag。以cisco交换机为例,配置命令是vlan dot1q tag native。

通常这个配置,是出于安全考虑,不允许untagged报文在交换机间转发。与此对应,ironic控制节点上的业务网卡需要以VLAN的方式连接到inspection network。

VxLAN网络

业务网络为Overlay网络,以VxLAN为例说明。使用Overlay网络,可以提供多个inspection network。适用于规模大的环境,可以将物理服务器划分到不同的inspection network。

对于物理服务器而言,同一时刻只能加入到一个VxLAN网络。对于ironic控制节点而言,可以同时加入到多个VxLAN网络。

实际的组网又分为二层网络和三层网络,下面将分别说明。

二层网络

inspection network是一个二层网络。

管理员通过SDN控制器创建出多个VxLAN网络,针对业务网接入交换机或交换机端口配置Native VLAN与 VxLAN VNI映射关系。一旦完成配置,物理服务器就可以通过上联的业务网接入交换机连接到对应的VxLAN网络。对于物理服务器来说,它不用关心SDN侧的配置,仍然收发untagged报文。而一个ironic控制节点需要同时连接多个inspection network,它的内部通过VLAN子接口区分不同的VLAN ID。在业务网接入交换机上,配置多组VLAN ID与VxLAN VNI映射关系。

图五,同网段的VxLAN网络

以上图为例,ironic控制节点的业务网卡上(配置了bond)配置多个VLAN子接口,每一个VLAN子接口对应一个VxLAN网络。这样,物理服务器与ironic控制节点在一个大二层网络内通信。

从业务网接入交换机下联的物理服务器和ironic控制节点的端口来看,物理服务器在不同的状态需要连接到不同的网络,就需要网络切换;ironic控制节点需要同时连接inspection network和provision network等网络,不需要网络切换。

所以,一旦通过SDN控制器配置好VLAN ID与VxLAN VNI映射关系。表明物理服务器切换到inspection network,而后续在部署时需要切换到provision network。切换动作是否需要管理员去做,目前的做法分为两种: 一种是需要管理员手动将物理服务器从inspection network移除之后,才能加入到provision network;另外一种是不需要手动移除而是由后续的流程自动覆盖。这种方式可能有潜在的配置残留风险,可能导致物理服务器无法正常切换到provision network,从而影响部署。

三层网络

inspection network是一个三层网络。与二层网络一样,也需要创建多个VxLAN网络供物理服务器使用。与二层网络不同的是: 需要额外创建一个VxLAN网络供ironic控制节点使用;需要创建一个虚拟路由器,通过它将多个VxLAN网络关联起来,使得它们之间通过三层互通。

图六,跨网段的VxLAN网络

以上图为例,创建一个虚拟路由器,关联4个VxLAN网络。ironic控制节点的业务网卡上(配置了bond)不需要配置VLAN子接口,而是需要添加三条到VNI1000/10001/10002网段的路由。这样,物理服务器与ironic控制节点之间通过虚拟路由器实现三层互通,物理服务器之间不需要通信。ironic控制节点收发untagged报文。

VLAN ID与VxLAN VNI映射关系

VLAN ID与VxLAN VNI的映射关系背后具体对应SDN交换机的什么配置或转发规则,每家SDN厂商的实现不尽相同。我们关注的是,一种创建VxLAN网络并将相应的设备连接到该网络的可行方式。而这种方式,在其他地方也有很多用途。比如创建一个存储网络,它和inspection network一样也是VxLAN网络且一样承载在业务网络之上。物理服务器和ironic控制节点要使用这种网络,只需关心这个网络对应的VLAN ID。

虽然图五和图六中,每一台交换机上只有一条VLAN ID与VxLAN VNI映射关系。但实际上,一台交换机端口对应一条映射关系更为常见。而基于端口做配置,能实现交换机的不同端口连接不同的inspection network。一台物理服务器上的两张业务网卡对应两个交换机端口。管理员可以选择一个交换机端口做配置,也可以选择两个端口。

网卡高可用的使用场景

无论是VLAN网络还是VxLAN网络,对于ironic控制节点来说我们会将两张业务网卡配置成一个bond网卡。这个bond网卡的bond mode依赖于业务网接入交换机的配置,既可以支持active-backup模式也可以支持802.3ad(负载均衡)模式。

但对于物理服务器来说,PXE不支持也不需要做bond。在运行ramdisk时,虽然理论上可以配置bond,但实现有难度。因为通过pxelinux配置文件传递的参数较为简单不能应对复杂的bond配置。

在ramdisk运行时不使用bond,如果选择两个交换机端口均做配置,两张业务网卡都能通过DHCP获取到IP。这样,会存在ironic控制节点与物理服务器的路由不对称问题。从ironic控制节点发送过来的报文如果从默认路由对应的网卡收到,物理服务器在回复报文时会查找路由表,根据路由从同样的网卡发出。但是如果不是从默认路由对应的网卡收到,就会出现丢包。因为Linux系统存在源IP地址反向路由过滤机制(rp_filter)。rp_filter简单来说根据报文的源IP地址查找路由表,当收包的网卡与路由表指示的接口不一致时,会触发丢包。

为了避免这个问题的出现:对于业务网接入交换机上的两个端口工作在负载均衡模式的,建议只将一个端口加入到inspection network,即单边加入。如果双边加入的话,需要在ramdisk中运行一个服务。该服务专门用于去除非BOOT INTERFACE(在PXE时,成功PXE的网卡叫做BOOT INTERFACE)的IP地址、路由配置。只保留BOOT INTERFACE的IP地址、路由配置;对于业务网接入交换机上的两个端口工作在主备模式的,不用担心会出现问题。

inspect流程

描述完inspect阶段的网络配置之后,接下来结合inspect流程图进一步分析。

图七,inspect流程图

如上图所示,第一步需要管理员针对特定的ironic node发起inspect请求。该请求经过ironic-api处理后,再通过ironic-conductor调用ironic-inspect服务的API。由ironic-inspector服务发起请求,设置物理服务器PXE启动并重启。当物理服务器重新启动后,尝试PXE启动。下面描述PXE启动过程。

图八,PXE流程图

如上图所示,在PXE时,物理服务器通过DHCP不仅可以获取IP地址、掩码、网关等标准的信息,而且还可以获取TFTP server 地址以及boot file name(也就是前文说的NBP)。以下面的dnsmasq配置文件为例,TFTP server 地址是10.40.136.11, boot file name是pxelinux.0。

根据NBP的执行结果,加载 kernel和root file system,进入ramdisk系统。ramdisk中的ironic-python-agent自运行,它将自动采集信息。对于硬件配置信息,agent执行相应的命令即可获取。例如,使用lscpu命令查看CPU信息。而对于LLDP信息,需要交换机上开启LLDP。agent将监听业务网卡上的报文,期望在一定的时间内收到来自交换机的LLDP报文。

当agent采集完信息,它将调用ironic-inspector服务的API,将收集好的数据发送给ironic-inspector服务。接着,由ironic-inspector服务校验和处理数据。数据的处理,分为1):将CPU、memory、disk等数据更新到ironic node中。2):根据网卡创建ironic port。3):我们在实践中,加入了根据策略创建portgroup这一功能。这个功能为后续的网卡做bond提供了基础数据。

当物理服务器完成inspect后,将其关机备用。

DHCP

在inspection network中需要部署DHCP server给物理服务器提供DHCP服务,或者采用SDN控制器代答的方式,但不能使用neutron的DHCP服务。这是因为neutron的DHCP服务是通过DHCP port提供。而创建neutron的DHCP port需要提供网卡的MAC,但在inspect之前我们并不知道物理服务器上网卡的MAC地址。

如果使用VLAN网络,inspection network和provision network是一张网络。可能会出现物理服务器在provision阶段拿到错误的DHCP信息。这是因为物理服务器发送的DHCP请求,既有可能是neutron的DHCP服务回复也有可能是其它的DHCP server回复,没法保证物理服务器一定选择neutron的DHCP服务。

为此,我们需要打开ironic-inspector服务的防火墙功能。该功能通过iptables规则阻止特定的DHCP报文。这些DHCP报文的源MAC地址属于非inspecting状态的ironic node。但是在规模大的环境中,firewall功能有比较严重的性能问题。

常见的DHCP server软件有dnsmasq和dhcpd,推荐使用dnsmasq。因为iptables配置的DROP DHCP请求报文规则,对于dhcpd软件无效,dhcpd依然会收到DHCP报文并正常回应。这样会影响insepct服务中的firewall功能。

根据DHCP协议规定,当DHCP client无法在配置IP地址前接收单播报文,那么它在发送的DHCP请求报文中需要置上broadcast bit,表示它期望DHCP server以广播的形式回复它。

大部分的软件或系统均支持在配置IP地址前接收单播报文,而网卡的PXE软件不支持。PXE网卡发送的DHCP discovery和DHCP request报文中,broadcast bit为1。DHCP server会以广播报文的形式回复DHCP offer和DHCP acknowledge报文。需要注意有的软件或者设备无法转发这种广播报文。

未完待续,敬请期待系列三,本系列的终章~~

END

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180410G1DCNQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券