跨命名空间tftp服务

作者 Billy 日期 2018-10-17
跨命名空间tftp服务

跨命名空间tftp服务

背景

裸金属多租户网络对客户现有的网络结构有较高的要求,大多数客户并不能具备所有条件,比如提供上联交换机的控制权限。

在几个试点协调资源过程中发现,大多数客户可以提供“半自动化”的裸金属多租户网络,即上联交换机已经将裸金属的vlan设置好,openstack使用相同vlan号的网络创建裸金属实例。网络节点的对应网卡做成trunk,以保证裸金属广播的dhcp报文能够到达。

这样问题就来了,ironictftp服务器地址是以ip格式写在配置文件的方式配置的,这个ip大多是属于管理网的,并不是动态的。给裸金属分配不同vlanip,一定不能访问管理网的tftp服务。

因此,有一个方法,就是将tftp服务部署到网络节点上,并在多个命名空间里启动服务,裸金属获取到ip后,可以直接访问网络节点的命名空间里的tftp来继续工作。

tftp服务

tftp是一个udp服务,端口为69

目前CentOS 7里,已经将tftp服务纳入到xinetd中:

# systemctl status xinetd
● xinetd.service - Xinetd A Powerful Replacement For Inetd
   Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2018-10-16 17:09:42 CST; 2s ago
  Process: 20011 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 20012 (xinetd)
   CGroup: /system.slice/xinetd.service
           └─20012 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid

Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing daytime
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing discard
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing discard
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing echo
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing echo
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing tcpmux
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing time
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: removing time
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: xinetd Version 2.3.15 started with libwrap loadavg labeled-networking options compiled in.
Oct 16 17:09:42 Openstack-Controller01 xinetd[20012]: Started working: 1 available service

命名空间

我们这里的命名空间指的是网络命名空间netns

netns可以让一台机器上模拟多个网络设备,是网络虚拟化的重要组成,将不同类型的网络应用隔离。

一个net namespace有自己独立的路由表,iptables策略,设备管理。说来说去,它就是用来隔离的。比如将eth0加入了netns 1,那么netns 2中的应用程序就找不到eth0了。netns 1中的iptables策略,不会去影响netns 2中的iptables策略。

openstack中的命名空间,在网络开启dhcp后,由程序在网络节点上创建,名称为qdhcp-< 网络uuid >

命名空间内起tftp服务

从上面systemctl命令中可以看到,启动的shell命令是

/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid

指定了进程文件/var/run/xinetd.pid,那么我们需要复制新的进程文件,再在命名空间里使用新的进程文件启动程序。

# cp /var/run/xinetd.pid ~/

# ip netns exec qdhcp-7b1fbda3-8615-4a55-8af5-aca76896d3d9 /usr/sbin/xinetd -stayalive -pidfile /root/xinetd.pid

再查询一下进程,发现有2个xinetd进程

# ps -ef|grep xinetd
root      20012      1  0 Oct16 ?        00:00:00 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
root     105828      1  0 09:03 ?        00:00:00 /usr/sbin/xinetd -stayalive -pidfile /root/xinetd.pid
root     107701   1585  0 09:23 pts/0    00:00:00 grep --color=auto xinetd