版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接 ,博主地址: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 //虚拟网线
结语:
初入坑,网络部分理解了半天,一台电脑也不好搭建多虚机和跨三层的大二层打通环境,先到这,后面在继续。