跨命名空间tftp服务
背景
裸金属多租户网络对客户现有的网络结构有较高的要求,大多数客户并不能具备所有条件,比如提供上联交换机的控制权限。
在几个试点协调资源过程中发现,大多数客户可以提供“半自动化”的裸金属多租户网络,即上联交换机已经将裸金属的vlan
设置好,openstack
使用相同vlan
号的网络创建裸金属实例。网络节点的对应网卡做成trunk
,以保证裸金属广播的dhcp
报文能够到达。
这样问题就来了,ironic
中tftp
服务器地址是以ip
格式写在配置文件的方式配置的,这个ip
大多是属于管理网的,并不是动态的。给裸金属分配不同vlan
的ip
,一定不能访问管理网的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