Multi-tenancy 是openstack ironic从Ocata版本开始支持的新特性,通过network-generic-switch插件控制交换机,Ironic可以实现在不同租户间机网络隔离,并且可以使得物理机和虚拟机工作在同一个二层中。本文记录了在基于kolla 的OpenStack Ocata版本上,如何配置相关服务,启用multi-tenancy功能。阅读本文需要有一定ironic基础。

基础环境:

  1. ALL-IN-ONE openstack ocata 集群
  2. cisco 300 交换机
  3. dell r720 服务器

网络拓扑图如下:

实验步骤:

1. 网络设置

将网线按照拓扑图接好,并配置好被部署机器的IPMI信息,cisco交换机对应的管理口ip,打开交换机的ssh权限。创建出要使用的vlan。配置GE5为trunk 模式:

[root@kolla-aio ~]# telnet 10.200.43.200
Trying 10.200.43.200...
Connected to 10.200.43.200.
Escape character is '^]'.
User Name:cisco
Password:********** switch797d1f#configure
switch797d1f(config-if)#vlan 2-1024
switch797d1f(config)#interface GE 3
switch797d1f(config-if)#switchport mode trunk
switch797d1f(config-if)#switchport trunk allowed vlan add all
switch797d1f(config-if)#do show interfaces switchport GE 3
Port : gi3
Port Mode: Trunk
Gvrp Status: disabled
Ingress Filtering: true
Acceptable Frame Type: admitAll
Ingress UnTagged VLAN ( NATIVE ): 1

2. 主机调整

关闭主机防火墙 :

systemctl stop iptables.service

systemctl disable iptables.service

关闭主机iscsi服务:

systemctl stop iscsid.socket

systemctl stop iscsid

systemctl disable iscsid.socket

systemctl disable iscsid

2. 配置neutron

我们使用kolla-aio eth0的10.200.43.196作为管理ip,所有的openstack服务都监听这个地址。裸机在部署过程中,要通过访问10.200.43.196的地址 call-back到控制节点上,所以部署网络要和10.200.43.196打通。由于本人不熟悉该交换机的配置,这里选择使用openstack的虚拟路由器功能,打通网络。我们需要在neutron额外配置一个flat网络,连接到kolla-aio的eth0上。

修改 /etc/kolla/neutron-server/ml2_conf.ini,和 /etc/kolla/neutron-openvswitch-agent/ml2_conf.ini 配置虚拟机使用的网桥是br-data,配置flat网络使用的网桥是br-ex。

[ml2_type_vlan]
network_vlan_ranges = default [ml2_type_flat]
flat_networks = external [ovs]
bridge_mappings = default:br-data,external:br-ex

在openvswitch容器中,要保证eth0在br-data网桥中,eth1在br-ex网桥中:

ovs-vsctl add-port br-data eth1
#接下来的操作会导致网络中断,需要到机房执行
ovs-vsctl add-port br-ex eth0
ifconfig eth0 0.0.0.0
ifconfig br-ex 10.200.43.196/24 up

3. 创建相关网络和路由

我们选择vlan102作为部署网络,需要创建虚拟路由和相关网络,打通部署网络和管理网,步骤如下:

  1. 在horizon上,分别创建vlan id为100,101,102的网络,子网信息可以随意分配,只要避免ip冲突就好。此例中我们为vlan102创建了子网192.168.102.0/24
  2. 创建一个flat网络,禁用网关,分配数个和kolla-aio同网段的ip,数量等于1+你想同时支持部署的裸机数量,在此例中,分配的ip是 10.200.43.197和10.200.43.198
  3. 创建router,不设置网关
  4. 在router中添加到vlan102网络的接口,接口ip不输入
  5. 5在router中添加到flat网络的接口,接口ip输入一个我们分配的ip,此例中输入了10.200.43.197
  6. 在控制器上添加一条路由router add -net 192.168.102.0/24 gw 10.200.43.197

4. 配置ironic

配置ironic,enable multi-tenancy,要修改的内容如下:

[DEFAULT]
enabled_drivers = pxe_ipmitool,pxe_ilo
enabled_network_interfaces=noop,flat,neutron [neutron]
url = http://10.200.43.196:9696
cleaning_network = vlan102
provisioning_network = vlan102 [pxe]
pxe_append_params = nofb nomodeset vga=normal console=tty0 console=ttyS0,115200n8
tftp_server=10.200.43.196
tftp_root=/tftpboot

配置完成后需要重启ironic-conductor服务

5. 更新networking-generic-switch代码

O版本networking-generic-switch插件不支持此例中使用的cisco300交换机,需要backport最新的代码来支持。

docker exec -u 0 -it neutron_server bash
cd /var/lib/kolla/venv/lib/python2.7/site-packages/networking_generic_switch/devices/netmiko_devices
curl -o cisco300.py https://raw.githubusercontent.com/openstack/networking-generic-switch/master/networking_generic_switch/devices/netmiko_devices/cisco300.py vim /var/lib/kolla/venv/lib/python2.7/site-packages/networking_generic_switch-0.2.1.dev9-py2.7.egg-info/entry_points.txt
在generic_switch.devices 段 插入:
netmiko_cisco_s300 = networking_generic_switch.devices.netmiko_devices.cisco300:Cisco300

6. 将交换机信息配置给配置neutron

配置 /etc/kolla/neutron-server/ml2_conf.ini,添加交换机的信息,此例中的交换机信息是:

型号: cisco 300系列

主机名:switch797d1f

ip: 10.200.43.200

用户名:cisco

密码: ***

对应的配置文件内容是:

 [genericswitch:switch797d1f]
device_type = netmiko_cisco_s300
username = cisco
password = ***
ip = 10.200.43.200

重启neutron_server使得我们的配置生效。

7.创建ironic node

创建支持multi-tenancy功能的ironic node,和创建普通node几乎没有区别,唯一的区别是,需要指定网卡参数 --network-interface neutron,示例如下:

#创建部署镜像
glance image-create --name deploy-vmlinuz --visibility public --disk-format aki --container-format aki < ironic-agent.kernel
glance image-create --name deploy-initrd --visibility public --disk-format ari --container-format ari < ironic-agent.initramfs
DEPLOY_VMLINUZ_UUID=`glance image-list |grep deploy-vmlinuz|awk '{print $2}'`
DEPLOY_INITRD_UUID=`glance image-list |grep deploy-initrd|awk '{print $2}'` #创建node
ironic node-create -d pxe_ipmitool -n 197test --network-interface neutron
NODE_UUID=`ironic node-list|grep 197test|awk '{print $2}'` #设置node driver信息
USER=admin
PASS=***2014
ADDRESS=10.200.43.197
ironic node-update $NODE_UUID add driver_info/ipmi_username=$USER driver_info/ipmi_password=$PASS driver_info/ipmi_address=$ADDRESS #设置node 属性
CPU=4
RAM_MB=8192
DISK_GB=80
ARCH=x86_64 ironic node-update $NODE_UUID add \
properties/cpus=$CPU properties/memory_mb=$RAM_MB \
properties/local_gb=$DISK_GB properties/cpu_arch=$ARCH

8.创建ironic port

创建multi-tenancy功能的port和创建普通ironic port差异较大,需要额外提供此网卡所接入的交换机的端口信息,包括:交换机主机名,交换机mac地址,通过网线接入的交换机接口名。

由于默认ironic client的使用的API版本比较旧,不支持创建含有交换机信息的得port,所以还需要先设置API版本,示例如下:

export IRONIC_API_VERSION=1.20

#r720 网口2 mac地址
HW_MAC_ADDRESS=b8:2a:72:ce:10:c6 #网口2接入的交换机信息
SWITCH_MAC_ADDRESS=00:af:1f:79:7d:1f
SWITCH_HOSTNAME=switch797d1f
SWITCH_PORT=GE7 #创建端口
ironic port-create -a $HW_MAC_ADDRESS -n $NODE_UUID \
-l switch_id=$SWITCH_MAC_ADDRESS -l switch_info=$SWITCH_HOSTNAME \
-l port_id=$SWITCH_PORT --pxe-enabled true --physical-network physnet1
ironic port-show $PORT_UUID

9.创建裸机对应的flavor

首先要创建与裸机对应的flavor,并添加元数据,示例如下:

nova flavor-create my-baremetal-flavor auto $RAM_MB $DISK_GB $CPU
nova flavor-key my-baremetal-flavor set hypervisor_type=ironic

10. 创建裸机实例

使用上文创建的flavor和一个非部署网络(vlan102)的vlan网络,创建实例,示例如下:

nova boot --image centos --flavor 13bd7f12-27b6-4d6e-ae1b-393e63124595  --nic net-id=4745aadc-c201-4409-b4b8-0e8dae346d5e test

历史问题记录

  1. 测试发现,10.200.43.196环境,当开启主机iptables的时候,即使是同一个宿主机上同一个网络内的两台虚拟机,也不能相互通信,这是不正常的,原理未知。

  2. 测试时起初打算使用hp机器作为被部署机器测试,测试过程中发现HP机器ipmi命令和通用ipmi命令不一致,所以无法使用ironic pxe-ipmitool driver管理该机器。

  3. 只能使用pxe-ilodriver,此driver又限制了启动时只能使用UEFI启动,需要配置uefi后

  4. 配置uefi成功后,发现通过tftp拿不到镜像,原因是:我使用虚拟路由器打通flat网络和vlan网络时,将10.200.43.197设置成路由器的网关,这样从部署网络访问tftp服务时需要经过nat, tftp是局域网协议,不能通过nat访问。清除网关,将10.200.43.197作为接口加入路由器后,tftp能正常访问。(2018.07.26更新,之前的记录不够准确,tftp是否支持nat取决于路由器的设置,当我们不设置网关,而是通过添加接口到路由器中的方式来打通部署网络和管理网络,这种情况是不走nat的,所以没问题。当tftp通过nat访问的时候,因为tftp使用的是udp协议,这会出现一些问题,tftpclient向tftpserver的69端口发送请求,但是tftp server会随便选择一个自己的端口比如4362来向客户端建立连接发送回应,但是很多路由器/防火墙会丢弃这个回应,因为没有人请求tftpsever的4362端口,所以tftp连接无法建立成功。tftp跨网段拿不到镜像,还可能是tftp客户端的实现问题,tftp是刻在rom里面的,有的tftp实现不支持跨网段的tftp下载,比如这个bug,另外细节可以参考阅读tftprfc1350

  5. 拿到镜像后,uefi进入系统部署流程,部署失败,HP机器的默认license只能在系统引导界面使用remote console,无法调试。

  6. 改用dell机器测试,dell机器 网口1只支持uefi启动,部署过程中出现,LBR not supported错误,查看bios发现,dell r720上的网卡,网口1只支持从uefi启动,网口2只支持从pxe启动。将网线改插入eth2,更改dell机器bios设置,令机器从bios启动,pxe拿到镜像。

  7. 部署过程中ironic报告:无法连接到iscsi服务,发现是因为宿主机上启动了iscsi服务,kolla的容器没有启动iscsi服务,导致iscsi容易不能正常工作,关闭宿主机iscsi服务,重新部署,部署成功

  8. 进入部署成功的虚拟机,发现网络不通,原因是我们使用的镜像只有eth0网卡的配置文件,我们为了让虚拟机从pxe启动,把网线插到了网口2上,所以网络不通,手动更改网络后没问题。

Enable multi-tenancy on ironic的更多相关文章

  1. OpenStack Ironic 常见问题

    whole disk和partition 镜像 whole disk镜像部署可以支持windows,但是不能自定义分区(可以通过cloud-init实现),分区表是做镜像的人确定好的,partitio ...

  2. Phoenix综述(史上最全Phoenix中文文档)

    个人主页:http://www.linbingdong.com 简书地址:http://www.jianshu.com/users/6cb45a00b49c/latest_articles 网上关于P ...

  3. ABP框架系列之三十四:(Multi-Tenancy-多租户)

    What Is Multi Tenancy? "Software Multitenancy refers to a software architecture in which a sing ...

  4. ABP框架系列之十七:(Data-Filters-数据过滤)

    Introduction It's common to use the soft-deletepattern which is used to not delete an entity from da ...

  5. Filebeat+Kafka+Logstash+ElasticSearch+Kibana 日志采集方案

    前言 Elastic Stack 提供 Beats 和 Logstash 套件来采集任何来源.任何格式的数据.其实Beats 和 Logstash的功能差不多,都能够与 Elasticsearch 产 ...

  6. wazuh官方安装指南(中文译版本)

      安装Wazuh服务器 Wazuh服务器可以安装在任何类型的Unix操作系统上.最常见安装在Linux上.如果可以为您的系统提供自动化脚本,则安装过程会更容易,但是,从源码构建和安装也非常简单. 通 ...

  7. Deploying Cloud Foundry on OpenStack Juno and XenServer (Part I)

    link http://rabbitstack.github.io/deploying-cloud-foundry-on-openstack-juno-and-xenserver-part-i/ Cl ...

  8. phoenix从入门到精通

      第一章.phoenix入门简介 1. Phoenix定义 Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目. Phoenix是构建在HBase上的一个SQL ...

  9. ABP文档 :Overall - Introduction

    介绍 我们基于不同的需求创建不同的应用,但却在一次又一次地实现相同或相似的结构.至少在某种程度上,授权.验证.异常处理.日志.本地化.数据库连接管理.配置管理.审计日志属于通用的结构. 另外我们总是在 ...

  10. java:提示Could not initialize class sun.awt.X11GraphicsEnvironment

    前几天发现tomcat提示 Could not initialize class sun.awt.X11GraphicsEnvironment  问题.以为不验证,就没太关注,今天发现,有同事提示了个 ...

随机推荐

  1. JAVA学习,是一条漫长的道路

    我在Java 1.0正式问世前就开始学习Java,这么多年过去了,到现在我的Java学习历程还没有停过.我阅读原文书,研究原始码,撰写程序,自认为走得扎实,不奢望一步登天.像我这样老式的学习方式,显然 ...

  2. MYSQL 5.7 修改密码、登录问题

    mysql5.7 关于密码问题 报错: ERROR 1862 (HY000): Your password has expired. To log in you must change it usin ...

  3. Android Studio 下获取debug sha1和md5

    Open Android Studio Open Your Project Click on Gradle (From Right Side Panel, you will see Gradle Ba ...

  4. html页面不显示中文

    问题:HTML编辑中文后无法在网页上显示中文 原因:是适用的 Cufon字体包不支持中文造成的. 简单粗暴的解决方法:如果你本来打算是去掉Cufon,可以看一看<如何禁用Cufon功能>. ...

  5. 选择结构if、switch

    选择结构if.switch 一.if三种形式 if if-else 3.if -else if -else 二.switch 针对某个表达式的值做出判断,成为决定执行代码块 switch 语句特点: ...

  6. sizeof和strlen的使用

    sizeof和strlen的使用 1. sizeof 其值在编译时就计算好了,所以不能用来返回动态分配的内存空姐的大小. 当参数为下面内容是,所表达的含义: 数组——编译时分配的数组空间大小: 指针— ...

  7. ASP.NET没有魔法——ASP.NET MVC 模型验证

    在前面的文章中介绍了用户的注册及登录功能,在注册用户时可以通过代码的形式限制用户名及密码的格式,如果不符合要求那么就无法完成操作,如下图: 该功能的原理是Identity基于的Entity Frame ...

  8. Linux下使用skipfish扫描网站漏洞步骤

    skipfish是谷歌开发的网站安全扫描工具. 下载地址:http://pan.baidu.com/s/1kTC66lL svn更新地址(一般链接不上,网速很慢): http://skipfish.g ...

  9. ABP官方文档翻译 7.1 后台Jobs和Workers

    后台Jobs和Workers 介绍 后台Jobs 关于Job持久化 创建后台Job 在队列中添加一个新Job 默认的后台Job管理器 后台Job存储 配置 禁用Job执行 异常处理 Hangfire集 ...

  10. 51NOD 1227 平均最小公倍数 [杜教筛]

    1227 平均最小公倍数 题意:求\(\frac{1}{n} \sum_{i=1}^n lcm(n,i)\) 和的弱化版? \[ ans = \frac{1}{2}((\sum_{i=1}^n \su ...