目录

前言

在继上一个系列博文 << 用 Flask 来写个轻博客 >> 之后, 我们开始进入 Openstack 的开发学习阶段. << Openstack 实现技术分解 >> 系列会分解并梳理 Openstack 的大部分项目里都会应用到的一些通用技术, 而且会尽量的将这些通用技术抽离使其不仅仅适用于 Openstack 的项目开发.

有如 Oslo 通用库系列项目, 虽然其发起的初衷是将那些被频繁重用的功能模块封装成库, 以此来避免重复制造轮子(Don’t repeat yourself). 但随着 Oslo 项目的发展至今, 社区开发者们在不断的思考如何让这些项目变得更有价值, 为其注入一些新的定义. 换句话说就是怎么才能让更多的 Ptyhon 开发者可以在不同的 Python 项目中直接使用这些从 Openstack 抽离出来的 Oslo 库. 显然, 我们之前所实现的 Flask Blog 项目就是为此而准备的.

当然, 该系列不仅仅是针对 Oslo 的记录学习, 因为那只是 Openstack 的冰山一角, 其蕴含了许多优秀的架构设计理念和代码实现技巧, 都是值得我们去发掘的宝藏. 除此之外, Openstack 开发的痛点/难点, 还在更加底层的硬件资源层和虚拟化层. 所以 KVM/VMware 都是会纳入该系列博文的对象之一.

系统环境

  • 虚拟机: vCenter 5.5
  • 系统: Ubuntu TLS 14.04
  • 网卡: 双网卡 eth0(连通外网的网卡192.168.0.111)/eth1(内网网卡)

Devstack

Devstack 是面向 Openstack 开发者的快速自动化部署 Bash 脚本, 提供了辅助开发和调试的源码环境, 能够支持 All-In-One 和多节点部署模式, 同时也支持 Plug-in 模式. Devstack 的使用可以说贯穿整个 Openstack 开发生涯, 熟练的使用 Devstack 能有效提高开发效率.

Github openstack-dev/devstack

下载源码

git clone https://github.com/openstack-dev/devstack.git -b stable/mitaka 

这里我们指定了 Devstack 的版本, 在获得 Devstack 的源码后, 我们在需要了解了其中几个重要的文件之后再开始安装和使用.

配置文件 local.conf & localrc

现在 Devstack 提供了两种配置安装的方式 local.conf(新版) 和 localrc(旧版), 两种方式我们都应该有所了解, 因为在不同的团队中会习惯的选择使用其中一种甚至两种方式.

路径: devstack/samples/local.conf

该文件是一个标准的 ini 文件, 所以我们会发现其由多种类型的 Section([[<phase>|<config-file-name>]]) 组成. 而且该文件最终会被 stack.sh 脚本加载使用, 所以其语法必须是符合 Bash 语法规则的, EG. 等号的两边不能存在空格.

Section(也就是<phase>) 有以下几种类型, 而且会严格按照下列顺序进行读取和执行, 它们规定了 Devstack 的安装流程和配置:

  • local([[local|localrc]]): 指定在 local.conf 被 stackrc 加载前, 先从 localrc 中提取配置项
[[local|localrc]]
ADMIN_PASSWORD=nomoresecret
DATABASE_PASSWORD=stackdb
RABBIT_PASSWORD=stackqueue
SERVICE_PASSWORD=$ADMIN_PASSWORD
  • post-config([[post-config|/$Q_PLUGIN_CONF_FILE]]): 指定在项目服务自动配置完后, 且在服务正式启动之前, post-config 的配置项将会被执行. EG.
[[post-config|/$NOVA_CONF]]

[DEFAULT]
use_syslog = True [osapi_v3]
enabled = False # NOTE: Q_PLUGIN_CONF_FILE 独特之处在于它的配置项如果在前面不加 `/`, 那么这个配置项就不会生效。所以为了使其生效添加 `/` 是必须的。
  • extra: 指定在各 Openstack 项目的主服务启动之后, 并且在 extra.d 中的文件被执行之前, extra 的配置项会被执行

  • post-extra: 指定在 extra.d 中的文件被执行之后, 执行 port-extra 的配置项

可以看出它们被加载使用的时机各不相同, 这里我们稍作了解即可, 因为一般情况下我们只需要关注 Section <local> .

[[local|localrc]] 是一个非常特别的 Section, 我们可以将配置项全部都定义到其下, 并且它还指定了是否会将 devstack 根目录下的 localrc 文件的配置项提取到其下, 同时也允许将所有的自定义安装配置项都包含在 localrc 文件中。很显然这样做是为了将 Devstack 的配置方式从 localrc 平滑的过渡到 local.conf . 也就是说现在我们仍然可以把所有的安装配置项都定义在 localrc, 而无需修改 local.conf 文件. 但在这里仍然建议掌握两种配置方式, 因为 local.conf 提供了更加灵活且强大的配置形式, 从而部署出更加复杂的 Openstack 平台. 如何选择全看其是否能够满足我们开发的需求.

一个最小化安装的 local.conf 配置样例:

[[local|localrc]]
HOST_IP=192.168.18.1
ADMIN_PASSWORD=<admin_pass>
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
#FIXED_RANGE=172.31.1.0/24
#FLOATING_RANGE=192.168.20.0/25
  1. 如果觉得自动检测 my_ip 不可靠, 我们可以手动设置host_ip, 建议手动设置
  2. 预设置 Admin 密码, 不使用交互式设置方式
  3. 从本地网络中移除网络环, 注释掉 FIXED_RANGEFLOATING_RANGE, 使用默认的 Network 模式网络

这样的配置我们就能够得到一个最小化的 Openstack 环境, 其包含了创建虚拟机所需要的 Nova/Keystone/Glance 等服务. 更加具体的 local.conf 使用方法建议查看官方文档, 这里不做赘述.

简易的环境脚本 openrc

在手动部署 Openstack 系列博文的 Keystone 篇中提到过(原文), 在执行 Openstack client 之前首先需要进行身份认证, 以确定该操作用户的身份和权限等信息, EG.

[root@controller ~]# openstack --os-auth-url http://controller.jmilk.com:35357/v3   --os-project-domain-name default --os-user-domain-name default   --os-project-name admin --os-username admin project list

但是每执行一条指令都需要认证一次会非常繁琐, 所以 Openstack 引入了简易环境脚本 OpenRC 的方式, 将必需的认证信息注入到 Console 的环境变量中, 这样 Openstack client 就能够自动的从环境变量中获取这些认证信息, 而无需每次都手动输入. 我们可以手动的创建 openrc 文件, EG.

export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=<admin_pass>
export OS_AUTH_URL=http://controller.jmilk.com:35357/v3 # Keystone admin endpoint
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
# export KEYSTONECLIENT_DEBUG=1
# export NOVACLIENT_DEBUG=1

当然我们也可以直接使用 Devstack 提供的 openrc 脚本 devstack/openrc .

部署 Devstack

自动化部署流程

  1. 加载配置文件 local.conf 和 localrc
  2. 安装依赖系统包
  3. 安装消息队列和数据库
  4. 安装 Openstack clients
  5. 安装并配置 Openstack 项目
  6. 下载和上传镜像文件
  7. 显示登录信息

其中关键点在 2./5./6. , 可以看出这些都是下载并安装相关软件的步骤, 所以 Devstack 安装的关键在于选择合适的软件源和提供良好的网络环境. 绝大部分安装失败的原因都在于下载超时导致的失败. 所以首先我会建议先做一些预准备, 当然如果网速环境好的话就不必麻烦了.

  • 使用国内的 Ubuntu 源
sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak

NOTE: 切记首先备份原生的软件源配置文件

vim /etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
  • 使用国内 PIP 源:

vim ~/.pip/pip.conf

[global]
index-url = http://pypi.douban.com/simple
[install]
trusted-host=pypi.douban.com
  • 使用 local get-pip

    get-pip.py 是一个 pip 的安装程序, Devstack 会预先将该文件下载到 devstack/files, 然后再使用 python get-pip.py 安装. 所以我们也可以手动下载并放到该目录下, 同理我们也可以手动下载镜像文件.

    vim devstack/tools/install_pip.sh
# The URL from where the get-pip.py file gets downloaded. If a local
# get-pip.py mirror is available, PIP_GET_PIP_URL can be set to that
# mirror in local.conf to avoid download timeouts.
# Example:
# PIP_GET_PIP_URL="http://local-server/get-pip.py"
#
# Note that if get-pip.py already exists in $FILES this script will
# not re-download or check for a new version. For example, this is
# done by openstack-infra diskimage-builder elements as part of image
# preparation [1]. This prevents any network access, which can be
# unreliable in CI situations.
# [1] http://git.openstack.org/cgit/openstack-infra/project-config/tree/nodepool/elements/cache-devstack/source-repository-pip PIP_GET_PIP_URL=${PIP_GET_PIP_URL:-"https://bootstrap.pypa.io/get-pip.py"}

上面这段注释说明了我们可以使用本地的 get-pip 镜像源, 使用的方式有两种: 直接修改 devstack/tools/install_pip.sh 文件 或将配置项 PIP_GET_PIP_URL="https://coding.net/u/JmilkFan/p/pip/git/blob/master/contrib/get-pip.py" 添加到 local.conf 配置文件中

vim devstack/tools/install_pip.sh

PIP_GET_PIP_URL="https://coding.net/u/JmilkFan/p/pip/git/blob/master/contrib/get-pip.py"
PIP_GET_PIP_URL=${PIP_GET_PIP_URL:-"https://bootstrap.pypa.io/get-pip.py"}
LOCAL_PIP="$FILES/$(basename $PIP_GET_PIP_URL)"
  • 指定镜像文件的下载方式(后面会给出完整的配置文件)

    vim devstack/sample/local.conf
# Define images to be automatically downloaded during the DevStack built process.
DOWNLOAD_DEFAULT_IMAGES=False
IMAGE_URLS="http://images.trystack.cn/cirros/cirros-0.3.4-x86_64-disk.img"

部署案例

单节点 Nova-Network 模式部署

这是使用 Nova-Network 网络模式 All-In-One 部署架构图, 安装了 Keystone/Glance/Cinder/Nova 项目, 同时需要两张网卡 eth0/eth1, 其中 eth0 用于连接外网, eth1 用于 Instances 间的通信.

  • localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # NOTE 1
HOST_IP=192.168.18.2
# NOTE 2
FLAT_INTERFACE=eth1 # NOTE 3
#OFFLINE=True # NOTE 4
# To enable (network) Neutron
#enable_service n-net
#disable_service q-svc
#disable_service q-agt
#disable_service q-dhcp
#disable_service q-l3
#disable_service q-meta
#disable_service quantum
#ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron
#ENABLED_SERVICES+=,q-lbaas,q-vpn,q-fwaas

NOTE 1: Devstack 是能够自动获取 HOST_IP 的, 但仍不够稳定, 所以建议手动设置

NOTE 2: 指定 Flat-Network 的网卡

NOTE 3: 假如我们已经预先下载好了部署 Devstack 所需的依赖包的话, 可以开启 OFFLINE 安装, 不再需要网络的支撑

NOTE 4: 假如你希望部署基于 Neutron 的网络模式的话, 需要显示的调用 enable_service 函数来声明开启 Neutron

NOTE 5: 前面已经说过 localrc 需要符合 Bash 的语法规则, 所以全大写的变量 EG. ENABLED_SERVICES 其实是一个环境变量, 而 disable_service/enable_service 却是一个函数.

多节点 Nova-Network 模式部署

Devstack 多节点部署的本质就是使用不同的 localrc 配置文件, 在不同的节点上运行 Devstack 部署脚本.

但需要注意的是, Openstack 多节点部署不仅是将不同的项目部署到不同的节点之上, 我们更应理解为是将 Openstack 项目中的不同服务部署到不同的节点之上. 这就是为什么官方文档不以 Openstack 项目名称来为节点命名, 而是按照功能性来将节点命名为 ControllerNode/ComputeNode/StorageNode 等等.

例如: 上图中 ControllerNode 就安装的 Horizon/Keystone/Glance/Nova-Controller/Cinder-Controller 的相关服务, ComputeNode 仅安装了 Nova-Compute/Cinder-Vol 的相关服务. 这只中很好的体现了 Openstack 项目之间和项目之中各服务之间的解偶性, 但同时这也带来了运维难度的提升, 所以鲜有人使用 Devstack 来部署 Openstack, 这里我们可以选择性的进行了解.

  • ControllerNode localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # Current host ip
HOST_IP=192.168.56.102
FLAT_INTERFACE=eth1 # NOTE 1
MULTI_HOST=True # NOTE 2
# Enable/Disable Nova/Cinder ControllerNode service
enable_service n-novnc n-cauth
disable_service n-cpu n-net n-api-meta c-vol

NOTE 1: 多节点选项 MULTI_HOST 应该为 True

NOTE 2: 将应该部署到其他节点上的 Nova/Cinder 服务 disable 掉

  • ComputeNode localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # Current host ip
HOST_IP=192.168.56.103
FLAT_INTERFACE=eth1 # Enable Nova/Cinder ComputeNode service
enable_service n-novnc n-cauth
ENABLED_SERVICES=n-cpu,n-net,n-api-meta,c-vol # Needed by cinder-volume service
DATABASE_TYPE=mysql # ControllerNode ipaddress
SERVICE_HOST=192.168.56.102
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN

多节点 Neutron 模式部署

使用 Neutron 项目来替代 Nova-Network 为整个 Openstack 提供网络支撑, 是我们能够获得更加复杂和灵活的网络模式, 实际上是由 Neutron 内部集成的 OvS/ML2/L3 所提供的功能. 通常来说, Neutron 模式的网络在多节点部署环境中更具价值意义, 能够更充分的应用到其 VXLAN 和隧道技术.

所以首先我们需要理解几个概念:

  • br-int: 是 Open vSwitch 驱动机制创建的一个集成网桥 , 在这个网桥内可以创建面向 Instances 的端口, 也可以在这个网桥中创建虚拟交换机来连接个 Instances. 即 br-int 连接着同一个 Node 上不同网段的 Instances.

  • br-ex: 是 Open vSwitch 网桥连接物理网卡(EG. eth0)的接口, 各个节点向 ControllerNode 发送的消息都会通过 br-ex 来接收,然后 br-ex 再转发到 ControllerNode 中各个服务的网络端口上。同样的 br-ex 还能够接收外网 IP 向 ControllerNode 发送的数据包.

  • br-tun: 是一种遵守 VXLAN 协议的隧道, 用于连通各个不同的节点, 在这个例子中 be-tun 主要用于 ComputeNode 和 ControllerNode 之间的通讯. ComputeNode 中的 Instances 同样是通过 br-tun 网桥隧道来连通 ControllerNode 中的 Instances 的, 让 Instances 之间的通信方式就像是点对点一样.

  • 网桥(Bridge): 工作在二层网络(数据链路层),用于将两个 LAN(局域网, IP 网段不同的网络) 连接起来, 简单来说就是使两个不同网段的局域网可以通信, 这为运行在内部网络的 Instances 能够连接外网提供了可能. 其本质上是根据 MAC 地址来实现数据帧转发, 可以理解为一个 低层的路由器(实际上路由器工作在三层网络(网络层)并根据 IP 地址进行转发). 网桥能够有效的使本地通信限制在同一网段内, 并且支持转发相应的信号至另一网段.

  • VXLAN(Virtual eXtensible LAN): 是一种覆盖网络技术, 也称之为隧道技术. VXLAN 将 Instances 发出的数据包封装在 UDP 中, 并使用物理网络的 IP/MAC 作为 outer-header 重新封装, 然后在物理三层网络上进行传输, 到达目的主机节点后由隧道终结点来将这些数据包解封并将其中的数据字段发送给目标 Instances. 从而实现了运行在不同节点上的 Instances 之间能够通信.

  • 隧道(Tunneling): 是一种通过使用 路由器/交换机 实现在不同类型网络之间传递数据的方式, 也就是说隧道能够不同协议之间传递数据帧或报文包. 其原理是将不同协议的数据帧或报文包封装为新的可以互相传递的数据帧或报文包后再发送, 新的帧头或报头被注入了路由信息, 以便通过三层网络来传递这些数据. Neutron 中的隧道更加类似于 Point-to-Point 的连接, 这种连接方式使来自不同信息源的数据帧或报文包能够在同一个 Openstack 平台环境中通过不同的隧道进行相互传输. 总而言之, 隧道技术使用 点对点通信协议 代替了 交换连接方式, 通过三层的路由网络来连接数据地址. 列出隧道能实现的几个功能:

    • 将数据流强制送到特定的地址
    • 隐藏私有的网络地址
    • 在IP网上传递非IP数据包
    • 提供数据安全支持。

如果对上述的概念理解不清晰, 建议从下往上再看一次.

  • ControllerNode localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # Current host ip
HOST_IP=192.168.56.102
FLAT_INTERFACE=eth1 # NOTE 1
# ControllerNode Nova/Cinder/Neutron service
enable_service n-novnc n-cauth
disable_service n-cpu n-net n-api-meta c-vol
disable_service n-net
ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta
FIXED_RANGE=10.0.0.0/24
NETWORK_GATEWAY=10.0.0.1
FLOATING_RANGE=192.168.0.0/24
PUBLIC_NETWORK_GATEWAY=192.168.0.1
Q_FLOATING_ALLOCATION_POOL=start=192.168.0.100,end=192.168.0.200

NOTE 1:

FIXED_IP: 虚拟机网卡在虚拟网络上的 IP, 即虚拟机间通行的 IP

FLOATING_IP: 虚拟网络对应的外部网络上的 IP, 即虚拟机访问外部网络时映射的 IP

  • 配置 ControllerNode 上的 br-ex

    使用 Neutron 时, 在执行安装脚本后需要手动的配置 br-ex, 才能使其生效.
sudo ip addr flush dev br-ex
sudo ovs-vsctl add-port br-ex eth1
  • ComputeNode localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # Current host ip
HOST_IP=192.168.56.103 # needed by cinder-volume service
DATABASE_TYPE=mysql # ComputeNode Nova/Cinder/Neutron service
disable_all_services
ENABLED_SERVICES=n-cpu,rabbit,neutron,q-agt,c-vol # ControllerNode ipaddress
SERVICE_HOST=192.168.56.102
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL="http://$SERVICE_HOST:6080/vnc_auto.html"
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
Q_HOST=$SERVICE_HOST

单节点 Neutron 模式部署

大致上很多节点 Neutron 一致, 这里就不做赘述了.

  • localrc
# Misc
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Target Path
DEST=/opt/stack.mitaka # Enable Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs # Current host ip
HOST_IP=192.168.56.102 # Nova
enable_service n-novnc n-cauth # Neutron
disable_service n-net
ENABLED_SERVICES+=,q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron
FIXED_RANGE=10.0.0.0/24
NETWORK_GATEWAY=10.0.0.1
FLOATING_RANGE=192.168.0.0/24
PUBLIC_NETWORK_GATEWAY=192.168.0.1
Q_FLOATING_ALLOCATION_POOL=start=192.168.0.100,end=192.168.0.200
  • 配置 br-ex
sudo ip addr flush dev br-ex
sudo ovs-vsctl add-port br-ex eth1

部署样例

  • 升级系统
sudo apt-get update -y
sudo apt-get upgrade -y
  • 创建 stack 用户
adduser stack
apt-get install sudo -y
echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
sudo su - stack
  • 下载源码
(stack)$ git clone https://github.com/openstack-dev/devstack.git -b stable/mitaka
(stack)$ cd devstack
(stack)$ cp devstack/samples/local.conf .
  • 编辑配置文件 Neutron 网络模式(单网卡)
[[local|localrc]]

# Credentials
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD # Version
HORIZON_BRANCH=stable/mitaka
KEYSTONE_BRANCH=$HORIZON_BRANCH
NOVA_BRANCH=$HORIZON_BRANCH
NEUTRON_BRANCH=$HORIZON_BRANCH
GLANCE_BRANCH=$HORIZON_BRANCH
CINDER_BRANCH=$HORIZON_BRANCH # Use TryStack(99cloud) git mirror
GIT_BASE=http://git.trystack.cn
NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git
SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git # Target Path
DEST=/opt/stack HOST_IP=192.168.0.100 #OFFLINE=True ## Reclone each time
RECLONE=True # Database Backend MySQL
enable_service mysql # RPC Backend RabbitMQ
enable_service rabbit # Define images to be automatically downloaded during the DevStack built process.
DOWNLOAD_DEFAULT_IMAGES=False
IMAGE_URLS="http://images.trystack.cn/cirros/cirros-0.3.4-x86_64-disk.img" ## Keystone
KEYSTONE_TOKEN_FORMAT=UUID
#ENABLE_IDENTITY_V2=True ## Cinder
VOLUME_GROUP="cinder-volumes"
VOLUME_BACKING_FILE_SIZE=51200M # 指定创建 cinder vg size, 根据自己的机器情况而定
ENABLED_SERVICES+=,cinder,c-api,c-vol,c-sch,c-bak ## Ceilometer
enable_service ceilometer-acompute ceilometer-acentral ceilometer-anotification ceilometer-collector ceilometer-api
enable_service ceilometer-alarm-notifier ceilometer-alarm-evaluator ## Heat
HEAT_BRANCH=stable/mitaka
enable_service h-eng h-api h-api-cfn h-api-cw ## Swift
SWIFT_BRANCH=stable/mitaka
ENABLED_SERVICES+=,s-proxy,s-object,s-container,s-account
SWIFT_REPLICAS=1
SWIFT_HASH=011688b44136573e209e ## Trove
disable_service trove tr-api tr-tmgr tr-cond ## Sahara
disable_service sahara ## Manila
enable_plugin manila http://git.trystack.cn/openstack/manila.git stable/mitaka ## Enabling Neutron (network) Service
disable_service n-net
enable_service q-svc
enable_service q-agt
enable_service q-dhcp
enable_service q-l3
enable_service q-meta
enable_service q-metering
enable_service neutron ## Neutron options
PUBLIC_BRIDGE=br-ex
PUBLIC_INTERFACE=eth0 # ip = 192.168.0.100/24
PUBLIC_NETWORK_GATEWAY="192.168.0.1" # 必须是连接公网的网关
FLOATING_RANGE="192.168.0.0/24" # 必须与连接公网的网关同网段
Q_FLOATING_ALLOCATION_POOL=start=192.168.0.101,end=192.168.0.200
FIXED_RANGE="10.0.0.0/8"
OVS_PHYSICAL_BRIDGE=br-ex
OVS_BRIDGE_MAPPINGS=public:br-ex
Q_USE_SECGROUP=True
Q_L3_ENABLED=True
Q_USE_PROVIDERNET_FOR_PUBLIC=True ## VLAN configuration.
Q_PLUGIN=ml2
ENABLE_TENANT_VLANS=True
#TENANT_VLAN_RANGE=1100:2999 # Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs

NOTE 1: 该配置文件设定了 br-ex 对应的链接网卡名称, 所以不需要我们手动的配置 br-ex

NOTE 2: 注意配置文件中注释的必须 项, 这使 Instacnes 能够连接到外网, 使用网桥 br-int.

NOTE 3: 建议不要使用 连接公网的网卡 作为 PUBLIC_INTERFACE, 这样可能会导致在安装完重启主机后无法使用 ssh 重新连接(br-ex 的 IP 被改变了).

NOTE 4: 以插件的形式部署新项目 Manila, Openstack 的新项目会首先支持 Devstack 再有别的安装包出现.

NOTE 5: 在成功部署一次之后可以将 OFFLINE 打开

NOTE 6: 需要将 br-ex 的 IP 去除, br-ex 会添加一个 port 指向 eth1 这样的话, 流量就会从 br-ex 出去.

  • 编辑配置文件 Nova-Network 网络模式(单网卡)
[[local|localrc]]

# Credentials
ADMIN_PASSWORD=fanguiju
DATABASE_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD # Version
HORIZON_BRANCH=stable/mitaka
KEYSTONE_BRANCH=$HORIZON_BRANCH
NOVA_BRANCH=$HORIZON_BRANCH
NEUTRON_BRANCH=$HORIZON_BRANCH
GLANCE_BRANCH=$HORIZON_BRANCH
CINDER_BRANCH=$HORIZON_BRANCH # Use TryStack git mirror
GIT_BASE=http://git.trystack.cn
NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git
SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git DEST=/opt/stack
HOST_IP=192.168.0.111
FLAT_INTERFACE=eth0 #OFFLINE=True
RECLONE=True # Define images to be automatically downloaded during the DevStack built process.
DOWNLOAD_DEFAULT_IMAGES=False
IMAGE_URLS="http://images.trystack.cn/cirros/cirros-0.3.4-x86_64-disk.img" # Logging
LOGFILE=$DEST/logs/stack.sh.log
VERBOSE=True
LOG_COLOR=True
SCREEN_LOGDIR=$DEST/logs ## Cinder
VOLUME_GROUP="cinder-volumes"
VOLUME_BACKING_FILE_SIZE=51200M

UPDATED 2018-06-16 OpenStack master(R)

双网卡 Neutron 配置:

[[local|localrc]]
HOST_IP=<管理网络 IP 地址> # Reclone each time
RECLONE=no
#OFFLINE=True # Target Path
DEST=/opt/master # Logging
LOGDIR=$DEST/logs
LOGFILE=$DEST/logs/stack.sh.log
SCREEN_LOGDIR=$LOGDIR/screen
VERBOSE=True
LOG_COLOR=True # Credentials
ADMIN_PASSWORD=admin
DATABASE_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_TOKEN=$ADMIN_PASSWORD # Use TryStack(99cloud) git mirror
GIT_BASE=http://git.trystack.cn
NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git
SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git ## Keystone
REGION_NAME=RegionOne
ENABLE_IDENTITY_V2=False ## Cinder
VOLUME_GROUP="cinder-volumes" ## Neutron
disable_service n-net
enable_service q-svc q-agt q-dhcp q-l3 q-meta neutron q-lbaas q-fwaas q-vpn
Q_AGENT=linuxbridge
  • 开始部署
(stack)$ ./stack.sh

完成:

========================
DevStack Components Timed
======================== run_process - 59 secs
test_with_retry - 4 secs
apt-get-update - 16 secs
pip_install - 159 secs
restart_apache_server - 10 secs
wait_for_service - 16 secs
git_timed - 41 secs
apt-get - 7 secs This is your host IP address: 200.21.18.3
This is your host IPv6 address: ::1
Horizon is now available at http://200.21.18.3/dashboard
Keystone is serving at http://200.21.18.3:5000/
The default users are: admin and demo
The password: fanguiju
  • 手动配置 br-ex [可选]
sudo ip addr flush dev br-ex
sudo ovs-vsctl add-port br-ex eth1

使用

stack.sh - 启动 Devstack 环境

unstack.sh - 回滚 Devstack 环境, 在部署的过程中失败的话, 需要先执行该指令来回滚环境

rejoin-stack.sh - 重新加载 Devstack 环境, 因为 Devstack 安装的所有服务都不是以 deamon 的方式运作在节点上的, 而是以 screen 的方式运行, 所以每次重启节点之后都需要执行该指令来 reload.

openrc - 加载身份认证变量

clean.sh - 清除 Devstack 环境

不使用 FIXED-IP 让 Instances 直接使用连接外网的网段



首先我们需要了解 Openstack 的 3 种网络类型:

  • Management-Network: 各节点间通信的网络
  • Data-Network: 各虚拟机间通信的网络, 这里使用隧道技术
  • Public-Network: 连接到外网的网络

在上图的网络模型中, Management-Network/Data-Network/Public-Network 被继承到了一起, 在同一个节点上的 Instances 之间是通过 br-int 划分的 LAN 来通信的, 并且 br-int 的另外一端连接到 Data-Network 的网卡(eth0)以此来实现跨节点 Instances 之间的通信. br-ex 是将网桥连接到物理网卡上的接口, 所以如果希望连接到 Public-Network , 那么流量就必须通过 br-ex. 这样的话, 如果我们希望实现不使用 FIXED-IP 让 Instances 直接连接到外网, 就需要我们将 br-int 去除, 仅使用 br-ex 来让 Instances 连接 Public-Network.

最后

总的来说, 无论是自动化部署还是手动部署, 最重要的是在于理解 Openstack 是怎么通过这么多的项目组合而成的, 项目之间是怎么进行通行的. 而 Devstack 部署的难点和重点在于配置文件的正确和对实际网络模型的理解.

ERROR

2017-01-15 00:16:49.541 |   File "/usr/local/lib/python2.7/dist-packages/openstack/session.py", line 29, in <module>
2017-01-15 00:16:49.541 | DEFAULT_USER_AGENT = "openstacksdk/%s" % openstack.__version__
2017-01-15 00:16:49.541 | AttributeError: 'module' object has no attribute '__version__'

TSG 1:

vim /usr/local/lib/python2.7/dist-packages/openstack/session.py

# DEFAULT_USER_AGENT = "openstacksdk/%s" % openstack.__version__
DEFAULT_USER_AGENT = "openstacksdk/%s" % '0.8.1'

TSG 2:

vim /usr/local/lib/python2.7/dist-packages/openstack/session.py

# DEFAULT_USER_AGENT = "openstacksdk/%s" % openstack.__version__
DEFAULT_USER_AGENT = "openstacksdk/%s" % openstack

TSG 3:

[stack@localhost devstack]$ pip install libvirt-python===3.5.0
Collecting libvirt-python===3.5.0
Downloading https://files.pythonhosted.org/packages/7f/50/665cf69db433edea47942c273616d69b1beab959e9d5b1de7435a5075abc/libvirt-python-3.5.0.tar.gz (181kB)
100% |████████████████████████████████| 184kB 693kB/s
Building wheels for collected packages: libvirt-python
Running setup.py bdist_wheel for libvirt-python ... error
Complete output from command /usr/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-2UFa5V/libvirt-python/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmpFKvrGPpip-wheel- --python-tag cp27:
running bdist_wheel
running build
/usr/bin/pkg-config --print-errors --atleast-version=0.9.11 libvirt
/usr/bin/python generator.py libvirt /usr/share/libvirt/api/libvirt-api.xml
Found 429 functions in /usr/share/libvirt/api/libvirt-api.xml
Found 0 functions in libvirt-override-api.xml
Generated 349 wrapper functions
Missing type converters:
unsigned long long *:1
ERROR: failed virDomainMigrateGetMaxDowntime
error: command '/usr/bin/python' failed with exit status 1 ----------------------------------------
Failed building wheel for libvirt-python
Running setup.py clean for libvirt-python
Failed to build libvirt-python
Installing collected packages: libvirt-python
Running setup.py install for libvirt-python ... error ▽

libvirt-python 的版本不对。

解决:https://bugs.launchpad.net/openstack-requirements/+bug/1778971

最新文章

  1. 【USACO 3.1】Contact(01子串按出现次数排序)
  2. [转载]再谈百度:KPI、无人机,以及一个必须给父母看的案例
  3. 【Bugly干货分享】手把手教你逆向分析 Android 程序
  4. neutron 网络配置flat模式
  5. 各种编码问题产生原因以及解决办法---------响应编码,请求编码,URL编码
  6. 转 Android--加载大分辨率图片到内存
  7. ASP.NET MVC+Bootstrap个人博客之修复UEditor编辑时Bug(四)
  8. Dribbble客户端应用源码
  9. EasyUI + EF + MVC4 后台截图
  10. C++ volatile的作用
  11. lightoj 1019
  12. hdu 1171 Big Event in HDU(母函数)
  13. iOS 之 alcatraz (插件管理器)
  14. Android自定义控件系列(四)—底部菜单(下)
  15. vuejs模板使用方法
  16. OO第三次博客总结
  17. JPA save新增问题
  18. ES6语法(一)let 和 const 命令
  19. 高性能迷你React框架anujs1.1.0发布
  20. Unity 2017 Game Optimization 新版

热门文章

  1. springboot学习1
  2. AIX中的页空间管理
  3. AIX中设备管理
  4. 01Java经典问题
  5. 绕过CDN找到真实IP
  6. jquery 判断是否为空
  7. jquery预览本地图片
  8. 编译安装cmake
  9. 安装python3之后,yum用不了
  10. Hadoop中配置环境后重启失效解决方法