Hello Joe

OpenStack Newton for Ubuntu 16.04 LTS安装部署教程

一、硬件服务器

  • 名称:Sugon CB60-G10/15
  • CPU :12个CPU × 2 GHz
  • 内存:16G
  • 存储器:280G
  • 网卡数目:2
  • 操作系统:VMware EXSi 5.0.0

二、OpenStack部署规划

硬件需求

这是官网给出的硬件需求。
这个需求是对于需要实际部署一些服务的场景而言的,尤其对于学生党来说,这个硬件需求很难达到,而且如果只是实验性的搭建一个小型OpenStack环境,硬件需求也不用达到这个标准。

硬件需求

图中实线框是不可缺少的核心,虚线框则是可选组件。本文只部署了实线框所示的Controller节点和Compute节点,对于对象存储节点(Object Storage Node)和块存储节点(Block Storage Node)可根据需要,按照本文搭建核心组件后,按照官网的步骤进行新节点部署。

网络模型

官网提供了两种网络模型架构:Provider Network & Self-Service Network

  • Provider Network
  1. 这是OpenStack最为简单的网络架构,主要是提供二层服务(layer-2,以网桥和交换机连接不同网络)和VLAN划分。其本质是将虚拟网络桥接到物理网络,并依靠物理网络基础设施来提供三层服务(layer-3,routing)。
  2. DHCP服务将向实例提供IP地址信息。

preovider-network

  • Self-Service Network
  1. 相当于Provider Network的增强版,在其基础上,增加了通过诸如VXLAN方式在自服务网络中提供三层路由服务。其本质是使用NAT的方式将虚拟网络路由到物理网络。
  2. 在这种网络模型下,还可以提供许多高级的服务,比如LBaaS(负载均衡即服务)和FWaaS(防火墙即服务)。

self-service-network

本文将采用Self-Service Network架构进行搭建

网络布局

  • 官网的建议网络布局

    官方为了突出网络隔离,对于管理网络使用了私有地址空间。每个节点应当可以访问网络,用于安装软件,DNS,NTP等,Provider网络应当可以通过NAT的方式向管理网络提供访问外网的功能。

官方网络布局

  • 本文使用的网络布局

自己的网络布局

ML2网桥选择

OpenStack在L版(Liberty)及之前,各个节点中官方搭建文档都默认使用的OVS(OpenvSwitch),从M版(Mitaka)开始,OpenStack默认使用的是Linux bridge来作为二层转发设备。

笔者因为涉及到后续工作需要基于OVS来实现,所以这里并未按照官方默认的使用Linux bridge,节点中的br-int和br-tun都是使用的OpenvSwitch。所以在后面Networking部分,插件及代理都是安装的openvswitch,ML2配置文件中的mechanism_drivers也设置为openvswitch,还有一些地方也做了相应修改。

如果你也刚好需要使用OVS作为二层转发设备,或者没有特别需求,可以直接按照本文进行安装配置。否则建议您直接按照官网的Installation Guide进行安装

网络配置

Node eth0 eth1 eth2
Controller 192.168.1.158 80.0.0.11 80.0.1.11
Compute1 192.168.1.180 80.0.0.21 80.0.1.21
Compute2 192.168.1.190 80.0.0.22 80.0.1.22

说明

  1. eth0:外部网络,本地局域网是192.168.1.0/24,可以根据自己情况进行修改。用于各个节点主机连通外网,安装软件。
  2. eth1:管理网络,网段可以自己定义。用于节点之间管理通信。
  3. eth2:数据网络(隧道网络),网段可以自己定义。用于虚拟机实例内网数据传输。

各项服务密码设置

密码可以根据自己情况设置,不一定按照本文要求的来。但是如果是萌新,建议直接按照本文设置的密码进行配置,防止后面服务使用出问题。新手搭环境很容易出现各种问题,切身体会。

  • OpenStack管理员及租户账号密码
OpenStackUser name password
admin admin
demo demo
  • 各项服务的用户名及密码
Service name User name password
Glance glance glance
Nova nova nova
Neutron neutron neutron
RabbitMQ openstack openstack
  • 数据库相关密码
DB name password
root openstack
keystone keystone
glance glance
nova nova
neutron neutron

总而言之,我一般将密码设置为与用户名相同,某些需自己设定账号密码的我都设置为openstack

三、物理主机基本配置

  1. 物理机基本配置

    • 物理机安装EXSi 5.0系统
  2. 物理机资源划分

    这里资源当然是多多益善啦,不过鉴于作者实际情况,只能先按此划分。
    建议资源划分最小不小于以下情况

    • Controller节点:内存4G, CPU 4核,磁盘 50G, 网络适配器 3个
    • Compute1节点: 2G, CPU 2核,磁盘 40G,网络适配器 3个
    • ComputeN节点: 同上

四、OpenStack基本配置

网络环境准备

如果使用VMware,将provider网络(本文是eth0)所在网络设置为混杂模式。

配置网卡

本文Host使用的是Ubuntu16.04 LTS,网卡名字为ens32这种类似的,出于习惯,我们将其改为eth0,eth1这种命名。

Controller Node & Compute Node

  1. 修改文件

    1
    2
    3
    # vim /etc/default/grub`
    GRUB_CMDLINE_LINUX=”net.ifnames=0 biosdevname=0”
    1
    2
    # grub-mkconfig -o /boot/grub/grub.cfg
    # reboot

    重启后通过ifconfig命令可以看到网卡名称已经变为eth0,eth1,eth2。

  2. 配置网卡信息

    对于外部网络可是使用dhcp获取ip,这里设置静态ip是为了防止每次重启后ip变化管理起来不方便。
    管理网络和隧道网络,根据自己为controller node和compute node设定的值进行配置即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # vim /etc/network/interfaces
    auto lo
    iface lo inet loopback
    #外部网络provider
    auto eth0
    iface eth0 inet static
    address 192.168.1.158
    gateway 192.168.1.1
    netmask 255.255.255.0
    dns-nameservers 61.139.2.69
    #管理网络
    auto eth1
    iface eth1 inet static
    address 80.0.0.11
    netmask 255.255.255.0
    #隧道网络
    auto eth2
    iface eth2 inet static
    address 80.0.1.11
    netmask 255.255.255.0

修改hostname及hosts

为了便于维护及管理,这里需要设置hosts及对应的ip。
这里暂时只给出一个Controller node和一个Compute node,后续有其他节点直接添加即可。

  1. 修改hosts

    1
    2
    3
    4
    5
    # vim /etc/hosts
    127.0.0.1 localhost
    80.0.0.11 controller
    80.0.0.21 compute1
  2. 修改hostname
    Controller Node

    1
    2
    3
    # vim /etc/hostname
    controller

    Compute Node

    后续的计算节点依次为compute2,compute3……

    1
    2
    3
    # vim /etc/hostname
    compute1

配置NTP

NTP(Network Time Protocal),用于节点之间的时间同步,这里使用的是Chrony。

Controller Node

  1. 安装chrony

    1
    # vim apt install chrony
  2. 配置

    1
    2
    3
    4
    5
    # vim /etc/chrony/chrony.conf
    server 192.168.1.xxx iburst #增加一条以自己作为server
    allow 80.0.0.0/24 #允许该网段,即管理网络
  3. 重启服务

    1
    # service chrony restart
  4. 验证配置是否成功

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # chrony sources
    210 Number of sources = 5
    MS Name/IP address Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^? 192.168.1.158 0 10 0 10y +0ns[ +0ns] +/- 0ns
    ^+ ntp4.itcompliance.dk 3 10 333 632 -57ms[ -56ms] +/- 246ms
    ^+ mx.comglobalit.com 2 10 304 67m +28ms[ +28ms] +/- 301ms
    ^* biisoni.miuku.net 2 10 333 69 +29ms[ +30ms] +/- 128ms
    ^+ 101.6.6.172 2 10 377 238 +24ms[ +24ms] +/- 219ms

    结果中有一项带*即可,表明当前节点与之同步。

Compute Node

  1. 安装chrony

    1
    # vim apt install chrony
  2. 配置

    1
    2
    3
    # vim /etc/chrony/chrony.conf
    server controller iburst #以controller作为server
  3. 重启服务

    1
    # service chrony restart
  4. 验证配置是否成功

    1
    2
    3
    4
    5
    6
    # chrony sources
    210 Number of sources = 1
    MS Name/IP address Stratum Poll Reach LastRx Last sample
    ===============================================================================
    ^* controller 3 6 377 38 +294us[+6630us] +/- 116ms

配置OpenStack版本

Controller Node & Compute Node

  1. 添加 Newton版本库

    1
    2
    # apt install software-properties-common
    # add-apt-repository cloud-archive:newton
  2. 更新包

    1
    2
    # apt update && apt dist-upgrade
    # reboot
  3. 安装openstack 客户端

    1
    # apt install python-openstackclient

SQL数据库

一般来说,数据库服务只运行在Controller Node上,这里OpenStack官方建议是使用MariaDB。

Controller Node

  1. 安装数据库,中途会提示为数据库设置密码,本人是将其设置为openstack,各位可以按自己喜好来,只要别忘了就行-0-

    1
    # apt install mariadb-server python-pymysql
  2. 新建并配置文件/etc/mysql/mariadb.conf.d/99-openstack.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # vim /etc/mysql/mariadb.conf.d/99-openstack.cnf
    [mysqld]
    bind-address = 80.0.0.11
    default-storage-engine = innodb
    innodb_file_per_table
    max_connections = 4096
    collation-server = utf8_general_ci
    character-set-server = utf8
  3. 完成安装,重启服务

    1
    2
    # service mysql restart
    # mysql_secure_installation
    • mysql_secure_installation是为了进行一些保障SQL安全性的操作,比如删除匿名用户,为root账户设置密码等。

消息队列

OpenStack使用消息队列来进行各项服务之间的协作以及状态信息交互的。一般来说,消息队列服务运行在Controller节点上。
OpenStack支持RabbitMQ,Qpid,ZeroMQ等消息队列服务。这里使用的是RabbitMQ。

  1. 安装软件

    1
    # apt install rabbitmq-server
  2. 添加名为openstack的用户

    1
    # rabbitmqctl add_user openstack openstack

    这里用户名和密码都设置为openstack

  3. 为openstack用户赋予配置、读、写权限

    1
    # rabbitmqctl set_permissions openstack ".*" ".*" ".*"

Memcached

Identity服务认证机制采用Memcached来缓存token。
Memcached服务运行在Controller节点上

  • Controller Node
  1. 安装软件包

    1
    # apt install memcached python-memcache
  2. 编辑配置文件/etc/memcached.conf

    将原有的 -l 127.0.0.1替换为如下内容

    1
    2
    3
    # vim /etc/memcached.conf
    -l 80.0.0.11 #即Controller节点的管理网络ip
  3. 重启服务

    1
    # service memcached restart

五、身份认证服务 Identity Service – Keystone

OpenStack认证服务提供身份认证,授权,服务目录的功能。

为Keystone创建数据库

  1. 以root身份登录进数据库

    1
    # mysql -uroot -popenstack
  2. 创建keystone数据库

    1
    > CREATE DATABASE keystone;
  3. 授予keystone数据库正确的访问权限

    1
    2
    3
    4
    5
    > GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
    IDENTIFIED BY 'keystone';
    > GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
    IDENTIFIED BY 'keystone';
    > exit

    将keystone数据库密码也设置为keystone

安装并配置组件

  1. 安装keystone

    1
    # apt install keystone
  2. 编辑配置文件/etc/keystone/keystone.conf

    1
    2
    3
    4
    5
    6
    7
    # vim /etc/keystone/keystone.conf
    [database]
    ……
    connection = mysql+pymysql://keystone:keystone@controller/keystone
    [token]
    ……
    provider = fernet

    配置文件中的……表明其余项不作修改,仅仅添加新项

  3. 将配置信息写入数据库,初始化数据库中的表

    1
    # su -s /bin/sh -c "keystone-manage db_sync" keystone
  4. 初始化Fernet keys

    1
    2
    # keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
    # keystone-manage credential_setup --keystone-user keystone --keystone-group keystone
  5. Identity service引导程序,创建endpoint等

    1
    2
    3
    4
    5
    # keystone-manage bootstrap --bootstrap-password admin \
    --bootstrap-admin-url http://controller:35357/v3/ \
    --bootstrap-internal-url http://controller:35357/v3/ \
    --bootstrap-public-url http://controller:5000/v3/ \
    --bootstrap-region-id RegionOne

    –bootstrap-password指定的是admin用户的密码,这里也设置为admin

配置Apache HTTP server

  1. 编辑配置文件/etc/apache2/apache2.conf,配置ServerName指向controller

    1
    2
    3
    # vim /etc/apache2/apache2.conf
    ServerName controller
  2. 删除默认的SQLite数据库

    1
    # rm -f /var/lib/keystone/keystone.db
  3. 配置admin账户,写一个脚本admin-openrc来导入环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    # vim admin-openrc
    export OS_USERNAME=admin
    export OS_PASSWORD=admin
    export OS_PROJECT_NAME=admin
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_AUTH_URL=http://controller:35357/v3
    export OS_IDENTITY_API_VERSION=3

    PASSWORD取值要与keystone-manage bootstrap中的password一致。

    接着执行以下命令导入环境变量

    1
    # . admin-openrc

创建 domain,project,user,role

认证服务结合了domain,project,user和role四个域

  1. 创建service project,其中的user为OpenStack的各项服务

    1
    # openstack project create --domain default --description "Service Project" service
  2. 为非admin用户创建project和user

    这里命名为demo

  • 创建demo project和user

    1
    2
    # openstack project create --domain default --description "Demo Project" demo
    # openstack user create --domain default --password-prompt demo

    demo user 的密码也设为demo

  • 创建user role

    1
    # openstack role create user
  • user role添加到demoproject的demouser上。

    1
    # openstack role add --project demo --user demo user

验证操作

  1. 出于安全考虑,取消掉临时token的验证机制
    编辑/etc/keystone/keystone-paste.ini文件,将[pipeline:public_api], [pipeline:admin_api], and [pipeline:api_v3]区域中的admin_token_auth移除。
  2. 撤销环境变量

    1
    # unset OS_AUTH_URL OS_PASSWORD
  3. 以admin用户身份去请求一个验证token

    1
    2
    3
    # openstack --os-auth-url http://controller:35357/v3 \
    --os-project-domain-name default --os-user-domain-name default \
    --os-project-name admin --os-username admin token issue

    输入admin用户的密码admin

环境变量脚本

admindemo project和user创建换了变量脚本。

  1. 在之前的admin-openrc中添加一项

    1
    2
    ......
    export OS_IMAGE_API_VERSION=2
  2. 新建demo-openrc脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # vim demo-openrc
    export OS_PROJECT_DOMAIN_NAME=default
    export OS_USER_DOMAIN_NAME=default
    export OS_PROJECT_NAME=demo
    export OS_USERNAME=demo
    export OS_PASSWORD=demo
    export OS_AUTH_URL=http://controller:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2
  3. 使用脚本添加换金变量,并请求一个token

    1
    2
    # . admin-openrc
    # openstack token issue
    • 有结果输出即表明keystone配置完成。

六、镜像管理服务 Image Service – Glance

镜像服务为用户提供虚拟机镜像的注册,检索服务
该服务只运行于Controller节点上

为Glance创建数据库

  1. 以root身份登录进数据库

    1
    # mysql -uroot -popenstack
  2. 创建glance数据库,并赋予正确的访问权限

    1
    2
    3
    4
    5
    6
    > CREATE DATABASE glance;
    > GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
    IDENTIFIED BY 'glance';
    > GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
    IDENTIFIED BY 'glance';
    >exit

    glance数据库的密码设为glance

为glance服务创建用户,服务实体,访问点

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 为glance服务在service project里创建一个用户

  • 创建glance用户

    1
    2
    3
    4
    # openstack user create --domain default --password-prompt glance
    User Password:
    Repeat User Password:

    将密码设置为glance

  • serviceproject中的glance用户赋予admin角色

    1
    # openstack role add --project service --user glance admin
  • 创建glance服务实体

    1
    # openstack service create --name glance --description "OpenStack Image" image
  1. 创建镜像服务的API访问点
    1
    2
    3
    # openstack endpoint create --region RegionOne image public http://controller:9292
    # openstack endpoint create --region RegionOne image internal http://controller:9292
    # openstack endpoint create --region RegionOne image admin http://controller:9292

安装和配置镜像服务

  1. 安装glance

    1
    # apt install glance
  2. 编辑配置文件/etc/glance/glance-api.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    # vim /etc/glance/glance-api.conf
    [database]
    ……
    connection = mysql+pymysql://glance:glance@controller/glance
    #注释或者删除掉keystone_authtoken中的其他所有选项
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = glance
    password = glance
    [paste_deploy]
    ...
    flavor = keystone
    [glance_store]
    ...
    stores = file,http
    default_store = file
    filesystem_store_datadir = /var/lib/glance/images/

    …表示只新增项,原有配置不变

  3. 编辑配置文件/etc/glance/glance-registry.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #vim /etc/glance/glance-registry.conf
    [database]
    ...
    connection = mysql+pymysql://glance:glance@controller/glance
    #注释或者删除掉keystone_authtoken中的其他所有选项
    [keystone_authtoken]
    ...
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = glance
    password = glance
    [paste_deploy]
    ...
    flavor = keystone
  4. 将配置信息写入数据库,初始化数据库中的表

    1
    # su -s /bin/sh -c "glance-manage db_sync" glance

重启服务,完成安装

  1. 重启服务

    1
    2
    # service glance-registry restart
    # service glance-api restart
  2. 下载镜像并上传至Glance

    1
    2
    3
    4
    5
    # wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
    # openstack image create "cirros" \
    --file cirros-0.3.4-x86_64-disk.img \
    --disk-format qcow2 --container-format bare \
    --public
  3. 查看镜像

    1
    2
    3
    4
    5
    6
    7
    # openstack image list
    +--------------------------------------+--------+--------+
    | ID | Name | Status |
    +--------------------------------------+--------+--------+
    | 547e9e90-9863-49dd-bacc-f00d84d6f920 | cirros | active |
    +--------------------------------------+--------+--------+

    结果中会显示刚刚上传的cirros镜像,Status为active

七、计算服务 Compute Service – Nova

该服务在Controller节点和Compute节点都需要安装

Controller Node

为Nova创建数据库

  1. 以root身份登录进数据库

    1
    # mysql -uroot -popenstack
  2. 创建nova数据库,并赋予正确的访问权限

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    > CREATE DATABASE nova_api;
    > CREATE DATABASE nova;
    > GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'nova';
    > GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
    IDENTIFIED BY 'nova';
    > GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'nova';
    > GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
    IDENTIFIED BY 'nova';
    >exit

    数据库密码设为nova

为nova服务创建用户,服务实体,访问点

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 为nova服务在service project里创建一个用户

  • 创建nova用户

    1
    2
    3
    # openstack user create --domain default --password-prompt nova
    User Password:
    Repeat User Password:

    将密码设置为nova

  • serviceproject中的nova用户赋予admin角色

    1
    # openstack role add --project service --user nova admin
  • 创建nova服务实体

    1
    # openstack service create --name nova --description "OpenStack Compute" compute
  1. 创建计算服务的API访问点
    1
    2
    3
    # openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1/%\(tenant_id\)s
    # openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)s
    # openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1/%\(tenant_id\)s

安装和配置计算服务

  1. 安装nova相关组件

    1
    # apt install nova-api nova-conductor nova-consoleauth nova-novncproxy nova-scheduler
  2. 编辑配置文件/etc/nova/nova.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # vim /etc/nova/nova.conf
    [DEFAULT]
    ...
    transport_url = rabbit://openstack:openstack@controller
    auth_strategy = keystone
    my_ip = 80.0.0.11
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver
    [api_database]
    connection = mysql+pymysql://nova:nova@controller/nova_api
    [database]
    connection = mysql+pymysql://nova:nova@controller/nova
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = nova
    [vnc]
    vncserver_listen = 80.0.0.11
    vncserver_proxyclient_address = 80.0.0.11
    [glance]
    api_servers = http://controller:9292
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp

    由于bug,需要删除掉[DEFAULT]中的log-dir

重启服务,完成安装

  1. 重启计算服务
    1
    2
    3
    4
    5
    # service nova-api restart
    # service nova-consoleauth restart
    # service nova-scheduler restart
    # service nova-conductor restart
    # service nova-novncproxy restart

Compute Node

安装和配置计算服务

  1. 安装nova相关组件

    1
    # apt install nova-compute
  2. 编辑配置文件/etc/nova/nova.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # vim /etc/nova/nova.conf
    #消息队列配置
    [DEFAULT]
    ...
    transport_url = rabbit://openstack:openstack@controller
    auth_strategy = keystone
    my_ip = 80.0.0.21
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver
    #注释掉keystone_authtoken中其他选项
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = nova
    password = nova
    #配置vnc远程登录
    [vnc]
    enabled = True
    vncserver_listen = 0.0.0.0
    vncserver_proxyclient_address = 80.0.0.21
    novncproxy_base_url = http://controller:6080/vnc_auto.html
    #配置镜像服务API
    [glance]
    api_servers = http://controller:9292
    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp

    由于bug,需要移除掉[DEFAULT]中的log-dir

完成安装

  1. 检测计算节点是否支持虚拟机硬件加速

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

    如果结果是大于等于1的值,则无需修改;若值为0,则进行以下步骤,将virt_type设置为qemu

    1
    2
    3
    4
    5
    # vim /etc/nova/nova-compute.conf
    [libvirt]
    ...
    virt_type = qemu
  2. 重启服务

    1
    # service nova-compute restart

验证操作

Controller Node

在控制节点进行下面的验证操作

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 列出计算服务
    如果前面配置成功,这里会有3个服务运行在Controller节点,一个服务运行在Compute节点

    1
    2
    3
    4
    5
    6
    7
    8
    +----+------------------+------------+----------+---------+-------+----------------------------+
    | ID | Binary | Host | Zone | Status | State | Updated At |
    +----+------------------+------------+----------+---------+-------+----------------------------+
    | 3 | nova-consoleauth | controller | internal | enabled | up | 2017-06-04T10:04:02.000000 |
    | 4 | nova-scheduler | controller | internal | enabled | up | 2017-06-04T10:03:58.000000 |
    | 5 | nova-conductor | controller | internal | enabled | up | 2017-06-04T10:04:05.000000 |
    | 6 | nova-compute | compute1 | nova | enabled | up | 2017-06-04T10:04:07.000000 |
    +----+------------------+------------+----------+---------+-------+----------------------------+

八、网络服务 Networking Service – Neutron

该服务在Controller节点和Compute节点都需要安装

Controller Node

为Neutron创建数据库

  1. 以root身份登录进数据库

    1
    # mysql -uroot -popenstack
  2. 创建neutron数据库,并赋予正确的访问权限

    1
    2
    3
    4
    > CREATE DATABASE neutron;
    > GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';
    > GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';
    > exit

    数据库密码设为neutron

为neutron服务创建用户,服务实体,访问点

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 为neutron服务在service project里创建一个用户

  • 创建neutron用户

    1
    2
    3
    # openstack user create --domain default --password-prompt neutron
    User Password:
    Repeat User Password:

    将密码设置为neutron

  • serviceproject中的neutron用户赋予admin角色

    1
    # openstack role add --project service --user neutron admin
  • 创建neutron服务实体

    1
    # openstack service create --name neutron --description "OpenStack Networking" network
  1. 创建网络服务的API访问点
    1
    2
    3
    # openstack endpoint create --region RegionOne network public http://controller:9696
    # openstack endpoint create --region RegionOne network internal http://controller:9696
    # openstack endpoint create --region RegionOne network admin http://controller:9696

网络架构部署

这里使用官网介绍的第二种架构–Self-Service Networks

  1. 安装neutron相关组件

    1
    2
    3
    # apt install neutron-server neutron-plugin-ml2 \
    neutron-openvswitch-agent neutron-l3-agent neutron-dhcp-agent \
    neutron-metadata-agent
  2. 配置外部网桥br-ex,并设置默认路由

    1
    2
    3
    4
    5
    # ovs-vsctl add-br br-ex
    # ovs-vsctl add-port br-ex eth0
    # ifconfig eth0 0
    # ifconfig br-ex 192.168.1.158
    # route add default gw 192.168.1.1
  3. 编辑neutron server配置文件/etc/neutron/neutron.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [database]
    ...
    connection = mysql+pymysql://neutron:neutron@controller/neutron
    [DEFAULT]
    ...
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = True
    transport_url = rabbit://openstack:openstack@controller
    auth_strategy = keystone
    [keystone_authtoken]
    ...
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
    [nova]
    ...
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = nova
    password = nova

配置插件及代理

  1. 配置ML2 plug-in

    Modular Layer 2 (ML2) 使用OpenvSwitch机制来构建二层虚拟网络。
    官网目前默认使用的是Linux bridge机制,有需要的可按照官网安装文档进行安装配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    # vim /etc/neutron/plugins/ml2/ml2_conf.ini
    [ml2]
    ...
    type_drivers = flat,vlan,vxlan
    tenant_network_types = vxlan
    mechanism_drivers = openvswitch,l2population
    extension_drivers = port_security
    [ml2_type_flat]
    ...
    flat_networks = external
    [ml2_type_vxlan]
    ...
    vni_ranges = 1:1000
    [securitygroup]
    ...
    enable_security_group = True
    enable_ipset = True
    firewall_driver = iptables_hybrid
  2. 配置L3 agent

    Layer-3 (L3) agent为self-service虚拟网络提供路由及NAT服务。

    编辑/etc/neutron/l3_agent.ini文件

    1
    2
    3
    4
    [DEFAULT]
    ...
    interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
    external_network_bridge =
    • external_network_bridge值故意空缺,这样可使多个外部网络共用一个代理。
  3. 配置DHCP agent

    DHCP agent为虚拟网络提供DHCP服务。

    编辑/etc/neutron/dhcp_agent.ini文件

    1
    2
    3
    4
    5
    [DEFAULT]
    ...
    interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
    dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
    enable_isolated_metadata = True
  4. 配置OpenvSwitch agent

    OpenvSwitch agent为实例建立了二层虚拟网络设施

    编辑/etc/neutron/plugins/ml2/openvswitch_agent.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
    [ovs]
    integration_bridge = br-int
    bridge_mappings = external:br-ex
    local_ip = 80.0.1.11
    [agent]
    tunnel_types = vxlan
    l2_population = True
    [securitygroup]
    #enable_security_group = True
    firewall_driver = iptables_hybrid
  5. 配置metadata agent

    meatadata agent向实例提供配置信息

    编辑/etc/neutron/metadata_agent.ini文件,shared secret设置为openstack。

    1
    2
    3
    4
    [DEFAULT]
    ...
    nova_metadata_ip = controller
    metadata_proxy_shared_secret = openstack
  6. 配置计算服务使用网络服务
    编辑/etc/nova/nova.conf文件

    metadata_proxy_shared_secret值要与上一步中的相同,这里也为openstack

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [neutron]
    url = http://controller:9696
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron
    service_metadata_proxy = True
    metadata_proxy_shared_secret = openstack

完成安装

  1. 将配置信息写入数据库,初始化数据库中的表

    1
    2
    # su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
    --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
  2. 重启Compute API服务

    1
    # service nova-api restart
  3. 重启Networking服务

    1
    2
    3
    4
    5
    # service neutron-server restart
    # service neutron-openvswitch-agent restart
    # service neutron-dhcp-agent restart
    # service neutron-metadata-agent restart
    # service neutron-l3-agent restart

Compute Node

安装网neutron相关组件

  1. 安装软件包

    1
    # apt install neutron-plugin-ml2 neutron-openvswitch-agent
  2. 编辑/etc/neutron/neutron.conf文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    # vim /etc/neutron/neutron.conf
    [database]
    #注释掉所有connection选项,因为compute节点不需要直接操作数据库
    [DEFAULT]
    ...
    transport_url = rabbit://openstack:openstack@controller
    auth_strategy = keystone
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = True
    verbose = True
    [keystone_authtoken]
    ...
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    memcached_servers = controller:11211
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = neutron
    password = neutron
  3. 配置ML2 plug-in
    编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [ml2]
    type_drivers = flat,vlan,vxlan
    tenant_network_types = vxlan
    mechanism_drivers = openvswitch
    extension_drivers = port_security
    [securitygroup]
    enable_ipset = True
    [ml2_type_vxlan]
    vni_ranges = 1:1000
  4. 配置OpenvSwitch agent
    编辑/etc/neutron/plugins/ml2/openvswitch_agent.ini文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
    [ovs]
    integration_bridge = br-int
    local_ip = 80.0.1.21
    [agent]
    tunnel_types = vxlan
    l2_population = True
    [securitygroup]
    enable_security_group = True
    firewall_driver = iptables_hybrid
  5. 配置计算服务使用网络服务
    编辑/etc/nova/nova.conf文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # vim /etc/nova/nova.conf
    [neutron]
    url = http://controller:9696
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    region_name = RegionOne
    project_name = service
    username = neutron
    password = neutron

完成安装

  1. 重启计算服务

    1
    # service nova-compute restart
  2. 重启代理服务

    1
    # service neutron-openvswitch-agent restart

###验证操作
Controller Node

在Controoler节点执行验证操作

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 列出已加载的extensions

    1
    # neutron ext-list
  3. 列出成功运行的neutron agent

    1
    # neutron agent-list

    就当前部署情况,应该有4个agent在Controller节点,一个agent在计算节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    +--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+
    | id | agent_type | host | availability_zone | alive | admin_state_up | binary |
    +--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+
    | 075e6e72-4a85-4845-a427-cd3ef45b9803 | Metadata agent | controller | | :-) | True | neutron-metadata-agent |
    | 1805ba7f-7f7d-4e8d-8415-8f63f3f40cc5 | DHCP agent | controller | nova | :-) | True | neutron-dhcp-agent |
    | 4b3b5877-37e2-4de3-a5ec-f89786000bb9 | L3 agent | controller | nova | :-) | True | neutron-l3-agent |
    | 7e3ec045-336f-43ff-a130-8cfe24951aa6 | Open vSwitch agent | compute1 | | :-) | True | neutron-openvswitch-agent |
    | bcccd6de-99a0-4a63-9042-8f655efd8ea0 | Open vSwitch agent | controller | | :-) | True | neutron-openvswitch-agent |
    +--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+

九、前端仪表盘 Dashboard – Horizon

这是一个可选组件,用于提供一个可视化界面,让云管理者和用户可以通过Web接口来操作和管理OpenStack资源与服务。
该组件安装和配置在Controller节点。

安装和配置仪表盘

  1. 安装dashboard

    1
    # apt install openstack-dashboard
  2. 编辑配置文件/etc/openstack-dashboard/local_settings.py

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # vim /etc/openstack-dashboard/local_settings.py
    OPENSTACK_HOST = "controller"
    ALLOWED_HOSTS = ['*', ]
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    CACHES = {
    'default': {
    'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
    'LOCATION': 'controller:11211',
    }
    }
    OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
    OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
    OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
    }
    OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
    OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

验证操作

  1. 重新载入web server配置

    1
    # service apache2 reload
  2. 使用浏览器打开dashboard
    打开浏览器,在网址栏中输入http://controller/horizon,出现登陆界面后,以admin用户或者demo用户的身份登陆进去即可。

  3. Bug解决
    如果在上面一步中,输入网址后并未出现登陆界面,并出现ERROR,则需要进行下面两步解决。

  • 在配置文件/etc/apache2/conf-enabled/openstack-dashboard.conf中添加一行

    1
    2
    3
    4
    # vim /etc/apache2/conf-enabled/openstack-dashboard.conf
    #在WSGIProcessGroup horizon下一行添加
    WSGIApplicationGroup %{GLOBAL}
  • 进入到/usr/share/openstack-dashboard目录,运行manage.py

    1
    2
    # cd /usr/share/openstack-dashboard
    # python manage.py compress

十、创建虚拟机实例

上述步骤已经安装部署好了所有的基本组件,OpenStack已经可以开始使用了,下面将介绍一些基本的使用方法,包括创建虚拟网络,路由器,实例,添加floating ip等。

创建provider虚拟网络

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 创建provider网络

    这里命名为ext-net

    1
    # neutron net-create ext-net --router:external --provider:physical_network external --provider:network_type flat

    参数说明

    • --router:external:使self-service的router可以使用该网络来连接到外部网络,比如Internet
    • --provider:physical_network:指定flat虚拟网络连接到哪个flat物理网络上
    • --provider:network_type:指定provider网络类型,这里将其设置为flat

    –provider:physical_network参数是使用的ml2_conf.ini中指定的参数

    1
    2
    [ml2_type_flat]
    flat_networks = external
  3. 创建provider子网

    1
    2
    3
    # neutron subnet-create ext-net 192.168.1.0/24 --name ext-subnet \
    --allocation-pool start=192.168.1.180,end=192.168.1.199 \
    --disable-dhcp --gateway 192.168.1.1

    参数说明

    • --name:子网名称
    • --allocation-pool:start和end指定了你想为虚拟机实例分配的ip地址范围,请确保该范围内的地址可用
    • --disable-dhcp:撤销这个子网的DHCP功能
    • --gateway:指定这个子网的网关

创建self-service虚拟网络及路由器

  1. demo身份去获取user身份的CLI使用权

    1
    $ . demo-openrc
  2. 创建self-service网络

    这里命名为demo-net

    1
    # neutron net-create demo-net
  3. 创建self-service子网

    我将虚拟内部子网网段定义为90.0.0.0/24,这个可以根据自己情况修改

    1
    # neutron subnet-create demo-net 90.0.0.0/24 --name demo-subnet --dns-nameserver 61.139.2.69 --gateway 90.0.0.1
  4. 创建demo租户的路由器

    1
    # neutron router-create demo-router
  5. 在demo-router上加一个接口,将self-service子网(demo-subnet)添加上去

    1
    # neutron router-interface-add demo-router demo-subnet
  6. 在demo-router上设置一个provider网络的网关

    1
    # neutron router-gateway-set demo-router ext-net

验证虚拟网络

  1. admin身份去使用管理员权限的CLI

    1
    $ . admin-openrc
  2. 列出名字空间(namespace)

    可以看到一个qrouter和一个qdhcp

    1
    2
    3
    # ip netns
    qrouter-8afe6ad1-3a63-4036-a374-275b0c44fef2
    qdhcp-20dcee41-145b-4210-83c9-3bcd7b4f732a
  3. 列出demo-router上的接口

    1
    2
    3
    4
    5
    6
    7
    8
    # neutron router-port-list demo-router
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
    | id | name | mac_address | fixed_ips |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
    | b4fbf9c0-4f49-43e3-8808-6f241c8b7631 | | fa:16:3e:a7:2b:0d | {"subnet_id": "cfbf6897-6e94-4b08-8783-2c982ffd0b6e", "ip_address": "90.0.0.1"} |
    | ed881f13-c09d-4dc7-9225-d95f6df47865 | | fa:16:3e:6a:38:c0 | {"subnet_id": "572af278-9ac6-4c6f-8771-966e7a22d3ea", "ip_address": "192.168.1.181"} |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+

准备创建实例的参数

  1. admin身份去执行命令

    1
    $ . admin-openrc
  2. 新建合适的flavor

    1
    # openstack flavor create --id 1 --vcpus 1 --ram 512 --disk 1 m1.tiny

    列出可用的flavor

    1
    # openstack flavor list
  3. demo身份执行后续操作

    1
    $ . demo-openrc
  4. 创建key pair

    1
    2
    # ssh-keygen -q -N ""
    # openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

增加安全组规则

默认情况下,default安全组将应用于所有的实例,并且阻止所有的远程接入。对于Linux镜像,比如之前上传的Cirros镜像,建议至少需要允许ICMP(ping)和SSH。

  1. 允许ICMP

    1
    # openstack security group rule create --proto icmp default
  2. 允许SSH

    1
    # openstack security group rule create --proto tcp --dst-port 22 default

在self-service网络上创建虚拟机实例

  1. demo身份执行后续操作

    1
    $ . demo-openrc
  2. 列出各项参数的可选值

  • 列出flavor

    1
    2
    3
    4
    5
    6
    7
    # nova flavor-list
    +----+------------+-----------+------+-----------+------+-------+-------------+-----------+
    | ID | Name | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
    +----+------------+-----------+------+-----------+------+-------+-------------+-----------+
    | 1 | m1.tiny | 512 | 1 | 0 | | 1 | 1.0 | True |
    +----+------------+-----------+------+-----------+------+-------+-------------+-----------+
  • 列出image

    1
    2
    3
    4
    5
    6
    # openstack image list
    +--------------------------------------+--------+--------+
    | ID | Name | Status |
    +--------------------------------------+--------+--------+
    | 547e9e90-9863-49dd-bacc-f00d84d6f920 | cirros | active |
    +--------------------------------------+--------+--------+
  • 列出net

    1
    2
    3
    4
    5
    6
    7
    # neutron net-list
    +--------------------------------------+----------+--------------------------------------------------+
    | id | name | subnets |
    +--------------------------------------+----------+--------------------------------------------------+
    | 20dcee41-145b-4210-83c9-3bcd7b4f732a | demo-net | cfbf6897-6e94-4b08-8783-2c982ffd0b6e 90.0.0.0/24 |
    | 71e40f62-98cb-438b-94ee-0b7e06d9ee17 | ext-net | 572af278-9ac6-4c6f-8771-966e7a22d3ea |
    +--------------------------------------+----------+--------------------------------------------------+
  1. 创建实例

    1
    # openstack server create --flavor m1.tiny --image cirros --nic net-id=20dcee41-145b-4210-83c9-3bcd7b4f732a --security-group default --key-name mykey demo-ins
  2. 查看实例

    下面两个命令都可以查看

    1
    2
    # openstack server list
    # nova list
  3. 通过VNC登陆到实例

    1
    2
    3
    4
    5
    6
    7
    8
    # openstack console url show demo-ins
    +-------+---------------------------------------------------------------------------------+
    | Field | Value |
    +-------+---------------------------------------------------------------------------------+
    | type | novnc |
    | url | http://controller:6080/vnc_auto.html?token=5eeccb47-525c-4918-ac2a-3ad1e9f1f493 |
    +-------+---------------------------------------------------------------------------------+

    将结果中的url复制到浏览器中即可查看实例。

  4. 在namespace中SSH进实例

    此时实例只有内部网络的ip,在Controller节点上是无法SSH到实例的。但是我们可以通过Controller节点中的qrouter namespace进入到实例。

  • 查看namespace

    1
    2
    3
    # ip netns
    qrouter-8afe6ad1-3a63-4036-a374-275b0c44fef2
    qdhcp-20dcee41-145b-4210-83c9-3bcd7b4f732a
  • 在qrouter中SSH到实例

    1
    # ip netns exec qrouter-8afe6ad1-3a63-4036-a374-275b0c44fef2 ssh cirros@90.0.0.3

    其中的ip地址根据自己实例的具体值修改。

  1. 创建并绑定floating ip

    此时实例只有内部ip,如果想从外部访问实例,则需要为实例添加一个floating ip

  • 创建floating ip

    1
    # openstack ip floating create ext-net
  • 将创建的floating ip关联到实例上

    1
    # openstack ip floating add 192.168.1.xxx demo-ins