Openstack实践(1)部署使用实例及neutron网络

 版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址:http://www.cnblogs.com/SuperXJ/

 

 

    如何快速部署使用openstack,使用kolla吧,openstack技术结合容器分分钟部署(单点或者多节点,任选),分分钟升级,kolla项目是为了容器化openstack,目标是做到开箱即用,所有的组件的HA都具备。kolla是一个革命性的项目,我们以前积累的安装部署经验,全部都报废。使用kolla可以快速部署可扩展,可靠的生产就绪的openstack环境。,OpenStack Kolla项目是一个支持Openstack服务以容器的方式部署,借助ansible部署工具可以简单的扩展到多个节点。同时,又借助于使用 heat 来编排 Kolla 集群。我们也可以把 Kolla 镜像注册到一个内部的 Hub,并通过 Kubernetes(k8s)等工具来管理。kolla最终目标是为OpenStack的每一个服务都创建一个对应的Docker Image,通过Docker Image将升级的粒度减小到Service级别,从而使升级时,对OpenStack影响能达到最小,并且一旦升级失败,也很容易回滚。升级只需要三步:Pull新版本的容器镜像,停止老版本的容器服务,然后启动新版本容器。回滚也不需要重新安装包了,直接启动老版本容器服务就行,非常方便,kolla是openstack成功结合微服务和容器的开始。

目前,Kolla提供的镜像支持部署如下OpenStack项目:

Aodh

Ceilometer

Cinder

Designate

Glance

Gnocchi

Heat

Horizon

Ironic

Keystone

Magnum

Mistral

Murano

Nova

Neutron

Swift

Tempest

Zaqar

以及这些基础设施组件:

• Ceph implementation for Cinder, Glance and Nova 
• Openvswitch and Linuxbridge backends for Neutron 
• MongoDB as a database backend for Ceilometer and Gnocchi 
• RabbitMQ as a messaging backend for communication between services. 
• HAProxy and Keepalived for high availability of services and their endpoints. 
• MariaDB and Galera for highly available MySQL databases

 

1、准备工作:

The host machine must satisfy the following minimum requirements:

2 network interfaces(第一个是ens33,NAT网络 ,DHCP分配,IP:33192.168.226.137,Horizon访问就是通过这个IP地址 ; 第二个是 ens37,NAT网络 ,DHCP分配,IP:33192.168.226.138;,这个其实是让neutron的br-ex 绑定使用,虚拟机是通过这块网卡访问外网。 )

8GB main memory

40GB disk space

 

1.1、安装python pip最新版本

Yum install epel-release

说明:EPEL 是yum的一个软件源,里面包含了许多基本源里没有的软件。

Yum install python-pip

pip Install -U pip

说明:pip是 python可以跨平台的安装工具

 

1.2、安装依赖包

yum install python-devel libffi-devel gcc openssl-devel libselinux-python

pip install -U docker-py

#yum install -y python-docker-py

 

1.3、安装ansible,kolla通过ansible来部署openstack

Yum install ansible

 

1.4、安装docker

yum install docker-engine-1.12.5 docker-engine-selinux-1.12.5

Systemctl enable docker

说明:根据kolla安装要求,安装1.12.5版本的docker

 

1.5、配置(当使用Systemd  建立docker引擎,如果不设置MountFlags 选项, kolla-ansible的neutron-dhcp-agent会部署失败并抛出 APIError/HTTPError.)

Tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'

[Service]

MountFlags=shared

EOF

 

或者再/usr/lib/systemd/system/docker.service

[service]里加上

#MountFlags=shared

ExecStart=/usr/bin/dockerd --insecure-registry 192.168.226.134:4000

说明:增加一个本地registry

 

Systemctl daemon-reload

Systemctl restart docker

说明:重新加载并启动

 

1.6、配置ntp 多机部署需要配置,否则会调度错误

Yum install ntp

Systemctl enable ntpd.service

Systemctl start ntpd.service

 

1.7、禁用libvirtd

Systemctl stop libvirtd.service

Systemctl disable libvirtd.service

 

1.8、关闭防火墙和selinux

systemctl stop firewalld && systemctl disable firewalld sed -i '7d;1a SELINUX=disabled' /etc/selinux/config

 

2、安装kolla

Kolla安装包有两种模式:

(1)evaluation是使用pip来安装kolla,先安装kolla-ansible,然后通过kolla-ansile将openstack的各项目镜像从互联网拉取下来。

(2)Development是使用源码来安装kolla,下载源码,本地编译构建安装,相对比第一种要复杂一些。

 

2.1、我们这里使用Development方式安装valla:

git clone http://git.trystack.cn/openstack/kolla-ansible –b stable/ocata

cd kolla-ansible pip install .

 

说明:kolla-ansible 是一个将openstack部署到docker的工具

Cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/

Vi /etc/kolla/globals.yml

kolla_base_distro: "centos"

kolla_install_type: "source"

openstack_release: "4.0.3"

kolla_internal_vip_address: "192.168.226.222"

docker_registry: "192.168.226.134:4000"

network_interface: "ens33"

neutron_external_interface: "ens37"

enable_haproxy: "no"

api_interface: "{{ network_interface }}"

docker_namespace: "lokolla"

说明:该配置文件配置了kolla源信息

cp /usr/local/share/kolla-ansible/ansible/inventory/* .

说明:这里存放了单节点和多节点部署的配置文件,我们采用单节点部署

 

默认docker的registry是使用5000端口,对于OpenStack来说,有端口冲突,所以改成4000

docker run -d -v /opt/registry:/var/lib/registry -p 4000:5000 --restart=always --name registry registry:2

下载kolla官方提供的镜像

http://tarballs.openstack.org/kolla/images/

这是kolla官方提供的镜像给CI使用,只保留最新版本和最新的stable版本。大家可以下载Ocata版本

wget http://tarballs.openstack.org/kolla/images/centos-source-registry-ocata.tar.gz tar zxvf centos-source-registry-ocata.tar.gz -C /opt/registry/

这样就把kolla的docker镜像文件放到Regisitry服务器上。

 

2.2 配置/etc/kolla/globals.yml

network_interface: "ens33"

说明:ens33属于NAT网络里,设置的IP是:192.168.226.134,Horizon访问就是通过这个IP地址

neutron_external_interface: "ens37"

说明:ens37桥接模式,ip其实是dhcp分配,这个其实是让neutron的br-ex 绑定使用,虚拟机是通过这块网卡访问外网。

 

2.3 配置登录Dashboard的密码

kolla-genpwd

说明:自动生产复杂密码,对应文件/etc/kolla/passwords.yml

Vi /etc/kolla/passwords.yml

修改keystone_admin_password: xiongjian

 

2.4测试一下kolla-ansible -i all-in-one bootstrap-servers

kolla-ansible prechecks -i ~/kolla/all-in-one -vvv

如果是在虚拟机里装kolla,希望可以启动虚机后再启动nova虚拟机,那么你需要把virt_type=qemu,默认是kvm

mkdir -p /etc/kolla/config/nova

cat << EOF > /etc/kolla/config/nova/nova-compute.conf [libvirt] virt_type=qemu

EOF

 

2.5 部署 (测试环境采用all-in-one部署,生产环境请采用多节点部署)

kolla-ansible pull -i ~/kolla/all-in-one

kolla-ansible deploy -i ~/kolla/all-in-one

 

2.6 安装openstack 客户端

pip install -U python-openstackclient python-neutronclient

 

2.7 kolla-ansible post-deploy运行以下命令可以生成一个openrc文件(运行openstack CLI所需的环境变量):

 

openrc文件生成之后,使用以下命令可以帮你做一下openstack的初始化工作,包括上传一个glance镜像以及创建几个虚拟网络:

source /etc/kolla/admin-openrc.sh

[root@localhost ~]# cat /etc/kolla/admin-openrc.sh

export OS_PROJECT_DOMAIN_NAME=default

export OS_USER_DOMAIN_NAME=default

export OS_PROJECT_NAME=admin

export OS_TENANT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=xiongjian

export OS_AUTH_URL=http://192.168.226.222:35357/v3

export OS_INTERFACE=internal

export OS_IDENTITY_API_VERSION=3

 

编辑 /usr/share/kolla-ansible/init-runonce,

网络需要根据实际情况修改

EXT_NET_CIDR='192.168.226.0/24'

EXT_NET_RANGE='start=192.168.226.180,end=192.168.226.199'

EXT_NET_GATEWAY='192.168.226.1'

说明一下,192.168.226.0的网络,就是上面ens34接的网络,这个网络是通过路由器访问互联网,配置好这个,装完虚拟机就可以直接ping通。

 

2.8 执行nova demo1

Sh init-runonce

To deploy a demo instance, run:

 

openstack server create \

--image cirros \

--flavor m1.tiny \

--key-name mykey \

--nic net-id=40f71353-665a-4885-9cd6-8fccea8c908a \

demo1

 

+-------------------------------------+-----------------------------------------------+

| Field | Value |

+-------------------------------------+-----------------------------------------------+

| OS-DCF:diskConfig | MANUAL |

| OS-EXT-AZ:availability_zone | |

| OS-EXT-SRV-ATTR:host | None |

| OS-EXT-SRV-ATTR:hypervisor_hostname | None |

| OS-EXT-SRV-ATTR:instance_name | |

| OS-EXT-STS:power_state | NOSTATE |

| OS-EXT-STS:task_state | scheduling |

| OS-EXT-STS:vm_state | building |

| OS-SRV-USG:launched_at | None |

| OS-SRV-USG:terminated_at | None |

| accessIPv4 | |

| accessIPv6 | |

| addresses | |

| adminPass | 7RRu8kextShC |

| config_drive | |

| created | 2017-11-25T08:26:43Z |

| flavor | m1.tiny (1) |

| hostId | |

| id | 5cfdc7e2-25a8-4387-b462-2bf4100e2c37 |

| image | cirros (86705719-3402-4d9c-865a-f86646419905) |

| key_name | mykey |

| name | demo1 |

| progress | 0 |

| project_id | ffd2a5003e7f4cdb8cefa48fdb2bd767 |

| properties | |

| security_groups | name='default' |

| status | BUILD |

| updated | 2017-11-25T08:26:45Z |

| user_id | 4edc2043e5864941acd205f60838a744 |

| volumes_attached | |

+-------------------------------------+-----------------------------------------------+

 

通过openstack 控制台看一下,运行成功

 

查看是否支持kvm命令,我的显示不支持

egrep -c '(vmx|svm)' /proc/cpuinfo

0 表示不支持,1 表示支持。

 

[docker 构建镜像](https://docs.docker.com/engine/getstarted/step_four/)

[kolla-ansible 构建镜像](https://docs.openstack.org/developer/kolla/image-building.html)

[kolla 镜像仓库](https://hub.docker.com/u/kolla/)

[docker 服务配置](https://docs.docker.com/engine/admin/systemd/)

[问题debug](https://docs.openstack.org/developer/kolla-ansible/troubleshooting.html)

 

3、openstack Neutron

3.1先简单了解一下neutron

Neutron能提供虚拟的分布式(这样就可以实现跨物理机虚机在同一个vlan)二层vswitch(提供虚拟的network\subnet\port)、三层router、防火墙、负载均衡等抽象网络功能,能为每个租户提供独立的虚拟网络环境,neutron是用来创建虚拟网络的,所谓虚拟网络,就是虚拟机启动的时候会有一个虚拟网卡,虚拟网卡会连接到虚拟switch上,虚拟交换机连接到虚拟router上,虚拟路由器最终和物理网卡联通,从而虚拟网络和物理网络联通起来,可能用到的技术包括:

L2层:通过linux内核的bridge实现虚拟二层交换机,所有连接到linux bridge的设备(如tap)处于同一网段

L2层:Linux tap实现虚拟网卡,一个tap设备就是linux下一个进程,两个虚机通过tap通信实际上就是两个进程间通信,可以操作/dev/tap*,。

L2层:Linux veth实现虚拟网线,用于连接两个虚拟网络设备,如下面说的qbr和br-int)

L2层:在虚拟网桥中,如果希望虚机和外部通信,必须打开桥接到虚拟网桥中的物理网卡为混杂模式(ifconfig eth0 0.0.0.0 promisc up )。

L3层:通过ipv4 forward(将数据包从一块网卡路由到另一块网卡)和iptable的NAT实现静态路由及转发.(例如可以实现从物理机A的eth33发出的数据包像是从物理机B的eth34端口发出去一样)。

L3层:通过RIP OSPF BGP 自动学习建立路由表。

L2层:OVS,作用和linux bridge类似,也是实现二层vswitch,但是多了QOS\netflow流量监控能力。

L3层:GRE本职是在隧道的两端L4层建立UDP连接传输重新包装的L3层爆头,在目的地进行解包,因为是直接在隧道两端建立UDP连接,所以不需要像VLAN一样在物理交换机上配置TRUNK。GRE缺点是点点对的UDP连接占用端口资源和带宽资源。

L3层:Neutron中GRE,即使两台物理机上的两台虚机也不直接建立GRE,而是通过L3的网络节点进行中转,这样可以方便使用iptable做隔离网络流量。

L3 层:vxlan 的本职是重新定义L2层的数据帧再通过L4的UDP进行传输,对端对UDP拆包后查看L2数据帧可以看到和对端是在同一个2层。也是是通过L3L4层扩展L2层。VXLAN同样使用了GRE的隧道通过UDP传输重新封装的数据帧(其中的VNI类似于VLAN,但是为24Bit),通过VXLAN可以实现虚机跨中心迁移。

L4-7 LBAAS 为一个租户下的多台虚机提供负载均衡,根据负载均衡策略动态的将VIP绑定到具体提供服务的虚机固定IP上,注意这个VIP可以是内网IP也可以是外网IP,根据需要实现。底层技术是基于HAPROXY

L4-L7 FWAAS(基于iptables) 、vpnaas(基于 ipsec vpn or mpls vpn or ssl vpn)

 

3.2 neutron分成多个模块分布在三个节点上。

1.Controller节点:

运行neutron-server进程,用于接受RESTful API请求创建网络,子网,路由器等,然而创建的这些东西仅仅是一些数据结构在数据库里面。

2.Network节点:

neutron-l3-agent,用于创建和管理虚拟路由器,当neutron-server将路由器的数据结构创建好,neutron-l3-agent是做具体事情的,真正的调用命令行将虚拟路由器,路由表,namespace,iptables规则全部创建好。

neutron-dhcp-agent,用于创建和管理虚拟DHCP server,每个虚拟网络都会有一个DHCP server,这个DHCP server为这个虚拟网络里面的虚拟机提供IP。

neutron-openvswitch-plugin-agent,这个是用于创建L2的switch的,在Network节点上,Router和DHCP Server都会连接到二层的switch上。

3.Compute节点:

neutron-openstackvswitch-plugin-agent,这个是用于创建L2层switch的,在compute节点上,虚拟机的网卡也是连接到二层的switch上。

 

Neutron一般包括三种网络:

1、External Network/API Network,这个网络是链接外网的,无论是用户调用OpenStack的API,还是创建出来的虚拟机要访问外网,或者外网要ssh到虚拟机,都需要通过这个网络。

2、Data Network,数据网络,虚拟机之间的数据传输通过这个网络来进行,比如一个虚拟机要连接到另一个虚拟机,虚拟机要连接虚拟路由都是通过这个网络来进行

3、Management Network,管理网络,OpenStack各个模块之间的交互,连接数据库,连接Message Queue都是通过这个网络来进行。

 

3.3 看个例子:

假设虚拟机VM0网卡eth0(挂载在linux bridge上面,linux虚拟网卡,可以操作/dev/tap*向这个虚拟网卡写数)有网络数据包向外网发送,那么数据会依次经过qbr Linux Bridge设备,qvb(tap设备,通常叫qvb***,quantum veth bridge)和qvo(也是TAP,通常叫做qvo***,quantum veth ovs)虚拟网络设备,到达OVS网桥br-int(完成标记和去除内部即本地租户VLAN TAG,本机虚机2层流量的本地转发)上,br-int将数据包attach到OVS网桥br-tun上,数据包再从compute节点OVS网桥的br-tun(OVS虚拟出来的网桥,进行隧道封装,并完成VNI和VLAN映射,通过他将G于其他物理机联通起来,这样物理节点之间就可以形成一个GRE的点对点通信网络或者vxlan网络)和network节点OVS网桥br-tun构成的GRE隧道穿过,交付到Network节点的OVS网桥br-int上;网络节点的br-int通过qr设备借助Linux命名空间qrouter(就是上面介绍的网络节点上的neutron-l3-agent)连通到br-ex上的qg设备,将数据包交付到OVS网桥br-ex上,最后br-ex通过网络节点的外部物理端口eth1把数据包传送到外部路由器的网关。

注:

1、如果是VLAN模型则hr-tun会被替换成成 ovs br-eth*,完成流量送出送入,进行本地租户VLAN和物理网络租户VLAN的转换,例如将内部VLAN100转换为外部VLAN200

2、既然qbr和br-int都是网桥,为什么不直接连到br-int,还要通过qbr,qvb,qvo岂不是多余,为什么会有qbr呢?这是和security group的概念有关。简单说就是OVS网桥br-int没有设置iptables规则的功能,但openstack又要提供安全组服务,就借助了Linux bridge(qbr)的功能,虽然OVS的br-int和linux bridge (qbr)都是二层网桥,但是为了功能互补就同时出现了。具体了解,openstack中的security group开通哪些端口,屏蔽哪些端口是用iptables来实现的,然而br-int这些虚拟bridge都是openvswitch创建的,openstack的Kernel mode和netfilter的kernel mode不兼容。一个IP包进来要么走iptables规则进行处理,要么走openvswitch的规则进行处理,br-int上有很多openvswitch的规则,比如vlan tag等,所以iptables必须要另外建立一个linux bridge(qbr)来做,因而就有了qbr,在了解拓扑结构的时候,可以将qbr忽略,看到VM直接连接到br-int上就可以了

3、为什么会有namespace呢,java的namespace是为了在不同namespace下有相同类名,openstack也想做到这一点。不同Tenant都创建自己的router和private network,彼此不知道别人指定了哪些网段,很有可能两个tenant都指定了192.168.0.0/24,这样不同的private network的路由表,DHCP Server就需要隔离,不然就乱了,因而就有了namespace。

4、每个机器上都有了自己的br-int,但是对于虚拟机和虚拟router来说,它们仍然觉得自己连接到了一个大的L2的br-int上,通过这个br-int相互通信的,它们感受不到br-int下面的虚拟网卡br-tun。所以对于多节点结构,我们可以想象br-int是一个大的,横跨所有compute和network节点的二层switch。这是一种很重要的抽象思维,好像openstack环境中所有虚拟机都连接到了一个巨型的虚拟交换机上。然而br-int毕竟被物理的割开了,需要有一种方式将他们串联起来,openstack提供了多种方式,可以用GRE tunnel将不同机器的br-int连接起来,也可以通过VLAN将br-int连接起来,当然还可以使用vxlan。这就是为什么openstack有了br-int这个bridge,但是不把所有的openvswitch的规则都在它上面实现。就是为了提供这种灵活性,对于虚拟机来讲,看到的是一大整个br-int,不同机器的br-int可以有多种方式连接,这在br-int下面的网卡上面实现。

5\br-tun也是OVS创建的虚拟网桥,它是一个中间层,接收br-int的网络数据,然后在通过特定网络协议与各个节点的br-tun相连构成一个通道层。如果所有的br-int构成的抽象层定义为虚拟二层网络,那么所有的br-tun构成的抽象层边上虚拟三层网络了。

 

3.4 Horizon上创建一个neutron网络的过程:

1、为这个Tenant创建一个private network,不同的private network是需要通过VLAN tagging进行隔离的,互相之间广播(broadcast)不能到达,这里我们我们用的是GRE模式,也需要一个类似VLANID的东西,称为Segment ID(当然也可以是FLAT模式,不用vlan)

2、为private network创建一个subnet,subnet才是真正配置IP网段的地方,对于私网,我们常常用192.168.0.0/24这个网段

3、为这个Tenant创建一个Router,才能够访问外网

4、将private network连接到Router上

5、创建一个External Network((就是我们上面设置的192.168.226.138,ens37))

6、创建一个External Network的Subnet,这个外网逻辑上代表了我们数据中心的物理网络,通过这个物理网络,我们可以访问外网。因而PUBLIC_GATEWAY应该设为数据中心里面的Gateway,PUBLCI_RANGE也应该和数据中心的物理网络的CIDR一致,否则连不通。之所以设置PUBLIC_START和PUBLIC_END,是因为在数据中心中,不可能所有的IP地址都给OpenStack使用,另外的可能搭建了VMware Vcenter,可能有物理机,所以仅仅分配一个区间给OpenStack来用。

7、将Router连接到External Network

 

3.5下面我们看看kolla demo1都干了什么,打开horizon网络:

可看到有两个网络1、demo-net(采用vxlan网络)连接的子网 demo-subnet 10.0.0.0/24 ,这个是内网, 2、和 public1(采用flat网络)连接的子网public1-subnet 192.168.226.0/24,这个是外网

再看看路由,这里有一个demo-router ,是内网访问外网使用的。让demo-net连到这个路由上面。

看看网络拓扑

我们创建的demo1虚机连接到了demo-net上,demo-net连接到了demo-router后通过public1访问外网。

 

查看一下网络信息,只列出了第一行。

[root@localhost ~]# ifconfig

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

qbr349ef9d5-c1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 //linux bridge网桥

qvb349ef9d5-c1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1450 //qbr 连接qvo的网卡

qvo349ef9d5-c1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1450 //qbr 连接qvo的网卡

tap349ef9d5-c1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450 //直连虚机的网卡

veth51ddac5: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 //虚拟网线

 

结语:

初入坑,网络部分理解了半天,一台电脑也不好搭建多虚机和跨三层的大二层打通环境,先到这,后面在继续。

posted @ 2017-11-26 20:37  熊健  阅读(9962)  评论(2编辑  收藏  举报