Openstack 实现技术分解 (1) 开发环境 — Devstack 部署案例详解
目录
前言
在继上一个系列博文 << 用 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 能有效提高开发效率.
下载源码
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
- 如果觉得自动检测 my_ip 不可靠, 我们可以手动设置
host_ip
, 建议手动设置 - 预设置 Admin 密码, 不使用交互式设置方式
- 从本地网络中移除网络环, 注释掉
FIXED_RANGE
和FLOATING_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
自动化部署流程
- 加载配置文件 local.conf 和 localrc
- 安装依赖系统包
- 安装消息队列和数据库
- 安装 Openstack clients
- 安装并配置 Openstack 项目
- 下载和上传镜像文件
- 显示登录信息
其中关键点在 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。
Openstack 实现技术分解 (1) 开发环境 — Devstack 部署案例详解的更多相关文章
- Openstack 实现技术分解 (3) 开发工具 — VIM & dotfiles
目录 目录 前文列表 扩展阅读 前言 插件管理 Vundle 主题 Solarized 浏览项目目录结构 Nerdtree Symbol 窗口 Tagbar 文件模糊查询 CtrlP 代码补全 You ...
- linux环境vnc部署过程详解
vnc服务端机器地址:10.165.38.68 vnc客户端机器地址:本机(windows机器) vnc客户端包:vnc_82537_82537.rar (百度云盘下载地址:http://pan.ba ...
- OpenStack 实现技术分解 (7) 通用库 — oslo_config
目录 目录 前文列表 扩展阅读 osloconfig argparse cfgpy class Opt class ConfigOpts CONF 对象的单例模式 前文列表 OpenStack 实现技 ...
- OpenStack 实现技术分解 (6) 通用库 — oslo_log
目录 目录 前文列表 扩展阅读 日志级别 oslolog 初始化设置 DEMO oslolog 的相关配置项 oslolog 的日志级别 oslolog 的使用技巧 推荐使用 LOGdebug 的地方 ...
- Openstack 实现技术分解 (4) 通用技术 — TaskFlow
目录 目录 前文列表 扩展阅读 简介 基本概念 实现样例 最后 前文列表 Openstack 实现技术分解 (1) 开发环境 - Devstack 部署案例详解 Openstack 实现技术分解 (2 ...
- Openstack 实现技术分解 (2) 虚拟机初始化工具 — Cloud-Init & metadata & userdata
目录 目录 前文列表 扩展阅读 系统环境 前言 Cloud-init Cloud-init 的配置文件 metadata userdata metadata 和 userdata 的区别 metada ...
- OpenStack 实现技术分解 (5) 应用开发 — 使用 OpenStackClients 进行二次开发
文件夹 文件夹 前文列表 參考阅读 前言 OpenStackClients 使用 OpenStackClients 获取 project_client object 的 demo 调用 project ...
- windows/Linux下设置ASP.Net Core开发环境并部署应用
10分钟学会在windows/Linux下设置ASP.Net Core开发环境并部署应用 创建和开发ASP.NET Core应用可以有二种方式:最简单的方式是通过Visual Studio 2017 ...
- Linux 桌面玩家指南:18. 使用 Docker 隔离自己的开发环境和部署环境
特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...
随机推荐
- Echarts多个图表响应式以及其他问题
1.限制柱状图的宽度(自适应的柱子很大) barMaxWidth:30//设置柱状最大的宽度 2.设置y轴的label标签显示(单位 元 转 万) axisLabel: { formatte ...
- 集群中Session共享解决方案分析
一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...
- git上传文件夹报错: ! [rejected] master -> master (fetch first) error: failed to push some refs to 'https://github.com/taminachen/rjxm.git' hint: Updates were rejected because the remote contains work
使用git上传本地文件夹到远程仓库,使用如下命令:git push -u origin master时报错 原因是在GitHub创建仓库时创建了readme文件,但是本地没有这个文件,造成本地目录与远 ...
- Linux课程学习 第四课
学习必须如蜜蜂一样,采过许多花,这才能酿出蜜来 这月事比较多,每课的笔记都会慢慢补回来的,做事得有始有终 在网络上,人们越来越倾向于传输压缩格式的文件,原因是压缩文件体积小,在网速相同的情况下,传输时 ...
- 一、模型验证CoreWebApi 管道方式(非过滤器处理)2(IApplicationBuilder扩展方法的另一种写法)
一. 自定义中间件类的方式用一个单独类文件进行验证处理 Configure下添加配置 //app.AddAuthorize(); AddAuthorize因为参数(this IApplicationB ...
- 应急响应中find命令总结
在应急响应中,我们经常会使用find命令来查找系统中被黑客修改过的文件,或者被上传的木马后门文件,灵活使用find命令可以达到事半功倍的效果,现总结下使用技巧 举例,查找最近被更改的jsp文件 fin ...
- Python修炼之路-数据类型
Python编程之列表 列表是一个使用一对中括号"[ ]" 括起来的有序的集合,可以通过索引访问列表元素,也可以增加和删除元素. 列表的索引:第一个元素索引为0,最后一个元素索 ...
- 五大Linux简单命令解决系统性能问题
五大Linux简单命令解决系统性能问题 2010-12-17 10:07 James Turnbull TechTarget中国 字号:T | T 管理Linux主机的性能看起来经常象是在变魔术一样. ...
- Python 3标准库第四章
第四章日期和时间----------------- 不同于int.float和str,Python没有包含对应日期和时间的原生类型,不过提供了3个相应的模块,可以采用多种表示来管理日期和时间值. ...
- Collections 工具类和 Arrays 工具类常见方法
Collections Collections 工具类常用方法: 排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合) 排序操作 void revers ...