阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

150次阅读
没有评论

共计 127547 个字符,预计需要花费 319 分钟才能阅读完成。

1. 硬件服务器

  • 名称:浪潮 P8000 工作站
  • CPU:Intel Xeon CPU E5-2620 v3 2.40GHz * 2,共 12 个物理核,24 个逻辑核
  • 内存:16 * 8 = 128GB
  • 存储:SAS 300GB * 3 = 900GB
  • 网络:千兆网卡 * 6
  • 操作系统:Windows Server 2012 R2 DataCenter

2. OpenStack 部署分析及规划

2.1 目的

  • 部署一个 OpenStack 测试环境
  • 硬件虚拟化,提供一个 Infrastructure-as-a-Service (IaaS) 解决方案
  • 基于 OpenStack 云计算平台提供 Hadoop MapReduce、Spark 等计算服务
  • 提供 OpenStack 开源云计算学习平台

2.2 OpenStack 网络模型选择

官方文档中 OpenStack 提供了两种网络模型架构

  • Provider Networks
    OpenStack 最简单的部署方式,主要利用 二层网络服务 (Layer-2 Services)(通过网桥和交换机连接不同网络)和VLAN 划分,其本质上是将 虚拟机网络 (Virtual Networks)通过 桥接 物理网络 (Physical Networks)并利用 物理网络 设施提供 三层网络服务 (Layer-3 Services);此外,通过DHCP 服务向虚拟网络实例提供 IP 地址。
    注:该方式不支持 私有自服务网络 (Private Self-Service Networks),如 三层路由服务(Layer-3 Routing Services)。
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • Self-Service Networks
    该方式和 Provider Networks 方式相比,通过诸如 VXLAN 方式在 自服务网络 中支持 三层路由服务
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    本文采用 Provider Networks 网络模型设计

2.3 OpenStack 节点硬件需求

OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.4 OpenStack 服务组件选择

本文选择 OpenStack Mitaka 版本

  • Compute-Focused OpenStack Design
    根据 OpenStack 官方文档,以计算服务为主的 OpenStack 私有云计算平台可选取以下组件:

    For a compute-focused OpenStack design architecture, the following components may be present:
    Identity (keystone)
    Dashboard (horizon)
    Compute (nova)
    Object Storage (swift)
    Image (glance)
    Networking (neutron)
    Orchestration (heat)
  • OpenStack 服务组件选择:
    注:本文选择MariaDB(MySQL 的一个分支,完全兼容 MySQL)开源数据库为 OpenStack 组件提供后端数据访问服务。

    Service Name Component Name Brief Description
    Identity Service Keystone 身份服务,提供单点集成方式管理身份认证、授权、服务目录服务
    Image Service Glance 镜像服务
    Compute Service Nova 计算服务
    Networking Service Neutron 网络服务
    Dashboard Service Horizon 仪表盘,访问 OpenStack 服务的图形化接口
    Block Storage Service Cinder 块存储服务
    Shared File Systems Service Manila 共享文件系统服务,用于文件存储
    Object Storage Service Swift 对象存储服务,用于对象存储和检索
    Orchestration Service Heat 编排服务,基于模板创建管理云资源
    Telemetry Data Collection Service Ceilometer 计量服务
    Telemetry Alarming Service Aodh 警报服务
    Database Service Trove 数据库服务,用于云部署关系型和非关系性数据库引擎
    Data Processing Service Sahara 数据处理服务,提供一个数据处理框架,如 Hadoop、Spark、Storm

2.5 OpenStack 节点网络设计

  • OpenStack 官方文档建议网络布局如下:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • 本文采用如下网络设计
    总共 3 个子网:
    ① 互联网连接 / 对外出口(External)
    ② Openstack 管理网络(Management)
    ③ VM 虚拟机内网连接(Data)
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    注:此外,本文将 Block Storage NodeObject Storage Node加入Management Network

2.6 OpenStack 节点服务器规划

  • 6台 Ubuntu 16.04 LTS:
    Cotroller:用于整个集群的控制,高可靠性要求。承载数据库(MySQL)、队列服务器(RabbitMQ)、和最终的 web 入口(Apache+Memcache)。设置一块虚拟硬盘。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    Network:网络控制节点,高网络吞吐型节点。设置一块虚拟硬盘。要求 3 网卡,eth0 接 External Network,eth1 接 Management Network 子网, eth2 接 Data Network 子网。
    Compute:计算节点,高内存 +CPU+IO 消耗型节点。设置一块虚拟硬盘。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网,eth2 接 Data Network 子网。
    BlockStorage:块存储节点,提供块存储和共享文件系统服务。设置三块虚拟硬盘,一块安装操作系统,一块用于块存储服务,一块用于共享文件系统服务。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    ObjectStorage:两个对象存储节点,提供对象存储服务。设置三块虚拟硬盘,一块安装操作系统,两块用于对象存储服务。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    注:上述为了方便管理,对每个节点都添加了 eth0 网络接口,实际生产环境请根据实际情况配置。

  • 服务器配置:

    Node CPU 内存 存储
    Controller 4 核 16GB 100GB
    Network 2 核 8GB 100GB
    Compute 16 核 64GB 300GB
    BlockStorage 2 核 8GB 100GB+100GB+100GB
    ObjectStorage1 2 核 8GB 100GB+100GB+100GB
    ObjectStorage2 2 核 8GB 100GB+100GB+100GB

    注:此处资源分配超出了实际物理资源,可根据实际分配资源。

  • 网络配置:

    Node eth0 eth1 eth2
      External Network Management Network Data Network
    Controller 192.168.1.11 10.0.0.11  
    Network 192.168.1.21 10.0.0.21 10.0.1.21
    Compute 192.168.1.31 10.0.0.31 10.0.1.31
    BlockStorage 192.168.1.41 10.0.0.41  
    ObjectStorage1 192.168.1.51 10.0.0.51  
    ObjectStorage2 192.168.1.52 10.0.0.52  
    Subnet Mask 255.255.255.0 255.255.255.0 255.255.255.0
    Gateway 192.168.1.1 10.0.0.1 10.0.1.1

    注:由于实际网络限制,External Network 通过虚拟网卡 192.168.1.1 共享主机网络来访问外网

  • 物理主机端口映射信息:

    物理机端口 虚拟机 IP 虚拟机端口 服务描述
    11122 192.168.1.11 22 Controller SSH 服务
    12122 192.168.1.21 22 Network SSH 服务
    13122 192.168.1.31 22 Compute SSH 服务
    14122 192.168.1.41 22 BlockStorage SSH 服务
    15122 192.168.1.51 22 ObjectStorage1 SSH 服务
    15222 192.168.1.52 22 ObjectStorage2 SSH 服务
    11180 192.168.1.11 80 OpenStack Dashboard 服务
    6080 192.168.1.11 6080 OpenStack Compute Service of Nova Proxy

    注:将虚拟机 SSH 端口映射到物理主机特定端口,以便外网通过物理主机访问虚拟机。
    物理主机端口:为方便管理,针对 SSH 服务,将物理主机映射端口设计如下,前三位表示对应虚拟机地址末两字节,最后两位表示对应虚拟机端口。

  • OpenStack 服务密码要求:
    根据 OpenStack 官方文档
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.7 OpenStack 各节点组件规划

  • 节点组件信息:

    Node OpenStack Service
    Controller mariadb-server、mongodb-server、rabbitmq-server、memcached、keystone、apache2、glance、nova-api、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler、neutron-server、neutron-plugin-ml2、horizon(dashboard)、cinder-api cinder-scheduler、manila-api、manila-scheduler、Python-manilaclient、swift、swift-proxy、python-swiftclient、heat-api、heat-api-cfn、heat-engine、ceilometer-api、ceilometer-collector、ceilometer-agent-central、ceilometer-agent-notification、python-ceilometerclient、python-ceilometermiddleware、aodh-api、aodh-evaluator、aodh-notifier、aodh-listener、aodh-expirer、python-trove、python-troveclient、python-glanceclient、trove-common、trove-api、trove-taskmanager、trove-conductor、sahara-api、sahara-engine、sahara-templates、sahara-wsgi-api
    Network neutron-linuxbridge-agent、neutron-l3-agent、neutron-dhcp-agent、neutron-metadata-agent
    Compute nova-compute、neutron-linuxbridge-agent、kvm、ceilometer-agent-compute
    BlockStorage lvm2、cinder-volume、manila-share、neutron-plugin-linuxbridge-agent
    ObjectStorage xfsprogs、rsync、swift、swift-account、swift-container、swift-object
  • 各节点功能可参考下图
    注:仅供参考理解,具体根据实际情况而定
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.8 用户、密码、地址、端口信息登记

注:
① 请提前设计好所需密码并登记存档,并及时登记用到的服务地址 & 端口信息。
② 根据实际情况,将下面 Password 列替换为实际密码。
(若为测试环境,建议密码采用一定规则,方便记忆,但数据库等服务密码不要包含一些特殊字符,如:/+@

  • OpenStack 节点主机用户 & 密码:

    Node Hostname User Password
    Controller controller controller your_password
    Controller controller root your_password
    Network network network your_password
    Network network root your_password
    Compute compute compute your_password
    Compute compute root your_password
    BlockStorage blockstorage blockstorage your_password
    BlockStorage blockstorage root your_password
    ObjectStorage1 objectstorage1 objectstorage your_password
    ObjectStorage1 objectstorage1 root your_password
    ObjectStorage2 objectstorage2 objectstorage your_password
    ObjectStorage2 objectstorage2 root your_password
  • OpenStack 服务用户 & 密码:

    Name User Password
    Database_PASS(MariaDB/MySQL) root your_password
    RABBIT_PASS openstack your_password
    KEYSTONE_DBPASS keystone your_password
    ADMIN_PASS admin your_password
    DEMO_PASS demo your_password
    GLANCE_DBPASS glance your_password
    GLANCE_PASS glance your_password
    NOVA_DBPASS nova your_password
    NOVA_PASS nova your_password
    NEUTRON_DBPASS nuetron your_password
    NEUTRON_PASS nuetron your_password
    METADATA_SECRET   your_password
    CINDER_DBPASS cinder your_password
    CINDER_PASS cinder your_password
    MANILA_DBPASS manila your_password
    MANILA_PASS manila your_password
    SWIFT_PASS swift your_password
    HASH_PATH_PREFIX   your_password
    HASH_PATH_SUFFIX   your_password
    HEAT_DBPASS heat your_password
    HEAT_PASS heat your_password
    HEAT_DOMAIN_PASS heat_domain_admin your_password
    CEILOMETER_DBPASS ceilometer your_password
    CEILOMETER_PASS ceilometer your_password
    AODH_DBPASS aodh your_password
    AODH_PASS aodh your_password
    TROVE_DBPASS trove your_password
    TROVE_PASS trove your_password
    SAHARA_DBPASS sahara your_password
    SAHARA_PASS sahara your_password
  • OpenStack 各节点服务地址 & 端口
    参考:Firewalls and default ports
    注:可执行 sudo netstat -tnlp 查看

    节点 IP 地址 端口 服务描述
    Controller 192.168.1.11 22 SSH
    Controller 10.0.0.11 3306 MariaDB(MySQL)
    Controller 10.0.0.11 27017 MongoDB
    Controller 10.0.0.11 5672、25672 RabbitMQ
    Controller 10.0.0.11 4369 Erlang 端口映射守护进程(Erlang Port Mapper Daemon)
    Controller 10.0.0.11 11211 Memcached
    Controller 10.0.0.11 35357 OpenStack Identity Service of Apache HTTP Server(Admin)
    Controller 10.0.0.11 5000 OpenStack Identity Service of Apache HTTP Server(User)
    Controller 10.0.0.11 9191 OpenStack Image Service of Glance Registry
    Controller 10.0.0.11 9292 OpenStack Image Service of Glance API
    Controller 10.0.0.11 8774、8775 OpenStack Compute Service of Nova API
    Controller 10.0.0.11 6080 OpenStack Compute Service of Nova Proxy
    Controller 10.0.0.11 9696 OpenStack Networking Service of Neutron Server
    Controller 10.0.0.11 80 OpenStack Dashboard Service of Apache HTTP Server
    Controller 10.0.0.11 8776 OpenStack Block Storage Service of Cinder API
    Controller 10.0.0.11 8786 OpenStack Shared File Systems Service of Manila API
    Controller 10.0.0.11 8080 OpenStack Object Storage Service of Swift Proxy
    Controller 10.0.0.11 8000 OpenStack Orchestration Service of Heat API (CloudFormation)
    Controller 10.0.0.11 8004 OpenStack Orchestration Service of Heat API
    Controller 10.0.0.11 8777 OpenStack Telemetry Alarming Service of Ceilometer API
    Controller 10.0.0.11 8042 OpenStack Telemetry Alarming Service of Aodh API
    Controller 10.0.0.11 8779 OpenStack Database Service of Trove API
    Controller 10.0.0.11 8386 OpenStack Data Processing Service of Sahara API
    Network 192.168.1.21 22 SSH
    Compute 192.168.1.31 22 SSH
    Compute 192.168.122.1 53 Libvirt Dnsmasq
    BlockStorage 192.168.1.41 22 SSH
    BlockStorage 10.0.0.41 3260 OpenStack Block Storage Service of Tgtd(iSCSI target 后台服务)
    ObjectStorage 192.168.1.51/52 22 SSH
    ObjectStorage 10.0.0.51/52 873 OpenStack Object Storage Service of Remote Sync
    ObjectStorage 10.0.0.51/52 6000 OpenStack Object Storage Service of Object
    ObjectStorage 10.0.0.51/52 6001 OpenStack Object Storage Service of Container
    ObjectStorage 10.0.0.51/52 6002 OpenStack Object Storage Service of Account

3. 环境准备

3.1 物理主机基本配置

  • 物理机基本配置
    ① 开启物理主机虚拟化功能
    ② 在物理主机上安装 VMware Workstation 12.1 Pro

  • VMware 虚拟机配置
    ① 配置虚拟机网络
    虚拟机网络连接方式图解:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    打开 VMware Workstation 虚拟网络编辑器,添加如下虚拟网卡:
    其中 VMnet0 用于配置 External Network,VMnet1 用于配置 Management Network 子网, VMnet2 用于配置 Data Network 子网。如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ② 创建虚拟机,按前面要求设置 CPU、内存大小,并新建网络适配器同时指定网络连接方式,各节点对应名称如下表:

    Node VMnet0 VMnet1 VMnet2
    Controller 网络适配器 网络适配器 2  
    Network 网络适配器 网络适配器 2 网络适配器 3
    Compute 网络适配器 网络适配器 2 网络适配器 3
    BlockStorage 网络适配器 网络适配器 2  
    ObjectStorage1 网络适配器 网络适配器 2  
    ObjectStorage2 网络适配器 网络适配器 2  

    注:虚拟机中添加网络适配器的顺序跟系统内默认网卡名 eth0eth1eth2 对应。
    ③ 开启虚拟机 CPU 虚拟化功能
    对于每个虚拟机,虚拟机设置–> 处理器设置–> 虚拟化引擎,选择Intel VT-x/EPT 或 AMD-V/RVI,如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ④ 各节点虚拟机配置如下图:
    Controller 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    Network 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    Compute 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    BlockStorage 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ObjectStorage1 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ObjectStorage2 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

3.2 节点系统安装

在 VMware 中创建虚拟机,安装 Ubuntu 16.04 LTS

  • 创建虚拟机,设置 CPU 核心数、内存大小、存储大小。
  • 添加两块(或三块)虚拟网卡
  • 加载 Ubuntu Server 16.04 LTS 系统镜像
  • 启动系统,选择时区、语言,设置主机名和用户名、密码。
  • Partition disks配置步骤:
    ① 单独设置分区 /dev/sda1,大小200MB,用于挂载/boot
    选择手动配置–> 选择硬盘–> 创建新的分区表–> 选择空闲空间–> 新建分区–> 设置大小 200MB–> 选择主分区–> 选择开始位置–> 设置文件系统格式 Ext4–> 设置挂载点/boot–> 设置分区。
    ② 设置 LVM,方便扩展存储,挂载/swap
    配置逻辑卷 LVM–> 将修改写入磁盘并配置 LVM–> 新建卷组–> 卷组名称:vg_system–> 按空格键选中剩余空闲空间 /dev/sda–> 将修改写入磁盘并配置 LVM–> 新建逻辑卷–> 选择卷组vg_system–> 逻辑卷名:lv_root–> 设置逻辑卷大小:91GB–> 新建逻辑卷–> 选择卷组vg_system–> 逻辑卷名:lv_swap–> 设置逻辑卷大小为剩余空间–> 完成。
    ③ 分别对每一个逻辑卷进行配置
    磁盘格式:lv_root 选择 ext4,lv_swap 选择 swap area。
    挂载点:lv_root 选择”/”。
    最后选择完成分区并将更改写入磁盘,点击确定即可。
  • 选择服务器默认安装软件包
    空格键选择 OpenSSH Server,方便使用 SSH 传输文件。
  • 安装 Grub。
    按照上述步骤,创建其他节点服务器并安装 Ubuntu 16.04 LTS 系统

3.3 节点系统基本环境配置

  • 启用 root 用户,设置 root 密码

    sudo passwd root
  • 为普通用户添加 sudo 权限
    只需修改 /etc/sudoers 文件
    切换到 root 用户,输入命令 su -,输入 root 用户密码。
    输入命令 vi /etc/sudoers 编辑 /etc/sudoers 文件,在下面内容下添加一行 your_username ALL=(ALL:ALL) ALL,输入w! 强制保存,退出 vi。

    
    # User privilege specification
    
    root    ALL=(ALL:ALL) ALL
    
    # controller
    
    controller ALL=(ALL:ALL) ALL

    注:如没有修改权限,则为 /etc/sudoers 文件添加写权限chmod u+w /etc/sudoers,修改后撤销权限chmod u-w /etc/sudoers

  • 修改网卡命名方式
    输入 ifconfig -a 查看,发现网卡名称由 udev 管理命名为 ens33ens38,为了方便,将网卡名称修改为上述表格所示 eth0eth1eth2
    sudo vi /etc/default/grub 把 /etc/default/grub 中

    GRUB_CMDLINE_LINUX_DEFAULT=""
    GRUB_CMDLINE_LINUX=""

    改成:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

    ② 重新生成 grub 文件

    sudo update-grub
    sudo grub-mkconfig -o /boot/grub/grub.cfg  

    ③ 重启系统,发现网卡名称已经改回 eth0eth1eth2 命名格式。
    注:以上步骤在 Controller 节点、Compute 节点、Network 节点配置方法相同

  • 修改各节点网卡和 VMware 虚拟网卡绑定关系
    可选环节:若网卡和虚拟网卡绑定关系不同,可手动指定
    按照前面表格所示,修改各节点网卡名称为对应的 eth0eth1eth2
    以 Controller 节点为例
    将默认网卡名 eth0eth1修改为 eth0eth2

    sudo vi /etc/udev/rules.d/70-persistent-net.rules
    // 如无该文件,新建一个即可

    添加如下内容,其中 00:0c:29:a9:66:8c00:0c:29:a9:66:96为网卡 MAC,可执行 ifconfig -a 查看,根据情况自行设定:

    
    # eth0
    
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:8c", NAME="eth0"
    
    # eth2
    
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:96", NAME="eth2"

    保存并重启电脑 sudo reboot
    注:配置完成后,不能 虚拟机设置 --> 网络适配器 --> 高级 中点击生成 MAC,否则上面 MAC 地址需要修改配置。
    注:Compute 节点、Network 节点配置方法类似

  • 设置静态 IP/DNS
    以 Controller 节点为例
    ① 修改文件sudo vi /etc/network/interfaces,将默认生成的(下面内容可能没有,可能不一样,配置时视自己情况而定):

    auto ens33
    iface ens33 inet dhcp

    改为:

    
    #eth0 config (connect to internet)
    
    auto eth0
    iface eth0 inet static
    address 192.168.1.11 #IP 地址
    netmask 255.255.255.0 # 子网掩码
    gateway 192.168.1.1 # 网关
    dns-nameserver 192.168.1.1 #DNS
    
    
    # eth1 config (connect to openstack management network)
    
    auto eth1
    iface eth1 inet static
    address 10.0.0.11 #IP 地址
    netmask 255.255.255.0 # 子网掩码

    ② 重启网卡,使配置生效:

    sudo /etc/init.d/networking restart
    sudo service networking restart

    注:若找不到上述命令或重启无效可尝试下面命令:

    sudo ifdown eth0
    sudo ifdown eth1
    sudo ifup eth0
    sudo ifup eth1

    注:若提示ifdown: interface eth0 not configured,可换下面命令尝试:

    sudo ifconfig eth0 down
    sudo ifconfig eth1 down
    sudo ifconfig eth0 up
    sudo ifconfig eth1 up

    ③ 运行 ifconfig -a 查看网络配置信息。
    ④ 通过 ping www.baidu.com 测试能否正常访问外网。若不能,可 sudo reboot 重启节点试试。
    注:Compute 节点、Network 节点配置方法类似

  • 在物理主机中为各节点 SSH 连接配置端口映射
    可参考:Windows 下实现端口映射  http://www.linuxidc.com/Linux/2016-09/135489.htm
    以 Controller 节点为例
    ① 利用 Windows 自带的netsh 配置端口映射,打开 cmd 命令行,输入:
    注:下面 xxx.xxx.xxx.xxx 为物理主机实际 IP

    // 配置端口映射
    netsh interface portproxy add v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122 connectaddress=192.168.1.11 connectport=22
    // 或者
    netsh interface portproxy add v4tov4 listenport=11122 connectaddress=192.168.1.11 connectport=22
    
    // 查看已配置的端口映射
    netsh interface portproxy show v4tov4  // all
    
    侦听 ipv4:                 连接到 ipv4:
    
    地址            端口        地址            端口
    --------------- ----------  --------------- ----------
    xxx.xxx.xxx.xxx 11122       192.168.1.11     22
    *               11122       192.168.1.11     22
    
    // 删除端口映射
    netsh interface portproxy delete v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122
    netsh interface portproxy delete v4tov4 listenport=11122

    ② 在系统防火墙高级设置中配置入站规则
    新建规则–> 端口–> 特定本地端口:11122–> 允许连接–> 选择域 / 专用 / 公用–> 名称:VMware OpenStack Controller SSH、描述:用于 VMware 中 OpenStack 云计算平台 Controller 节点 SSH 连接
    ③ 配置完成后,可在外网主机,通过 Xshell 连接 Controller 节点, 如下图:
    :若 XShell 连接��败,提示Xshell no matching outgoing encryption,可升级 Xshell 版本, 在链接的属性(SSH–> 安全性) 的加密算法列表中选择 aes256-ctr,mac 加密列表中选择 hmac-sha2-256,保存即可。
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

注:其他节点配置方法类似

  • 配置 hosts 文件
    以 Controller 节点为例
    OpenStack 要求所有的节点主机之间都是通过 host 互信的,编辑所有节点主机的 /etc/hosts 文件,注意将 YOUR_HOST_NAME 替换成本节点主机名称。配置完成后在每台主机上 ping 通 3 个主机名。此外,通过配置 hosts 文件,可在网络环境发生变化时提供可扩展性且便于迁移。
    可参考:OpenStack Doc : Controller hosts 文件配置 
    ① 执行sudo vi /etc/hosts,添加如下内容

    
    # config all nodes
    
    10.0.0.11       controller
    10.0.0.21       network
    10.0.0.31       compute
    10.0.0.41       blockstorage
    10.0.0.51       objectstorage1
    10.0.0.52       objectstorage2

    ② 注释掉除 127.0.0.1 之外的环回地址项,如下:

    
    #127.0.1.1      controller`
    

    注:其他节点配置方法类似
    至此,节点网络配置完成:
    ① Controller、Network、Compute 等节点可互相 ping 通;
    ② Controller、Network、Compute 等节点均可访问外网和进行地址解析。

  • 配置 ubuntu 的更新源
    使用阿里云的更新源,修改配置文件sudo vi /etc/apt/sources.list,添加:

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
  • 更新系统
    ① 更新系统

    sudo apt update
    sudo apt upgrade
    sudo apt dist-upgrade
    sudo apt autoremove

    可能遇到的问题:
    Ubuntu 系统 /boot 容量不足引起的无法更新系统
    解决方法:
    查看 /boot 分区容量df -h /boot;查看当前使用内核版本号uname -a;删除旧内核,输入sudo apt-get remove linux-image-,接着按两下 tab 键,将显示所有的内核版本,把目前使用的版本之前的版本全部删除。最后执行

    sudo update-grub
    sudo grub-mkconfig -o /boot/grub/grub.cfg

    ② 查看系统发行版本和内核版本

    network@network:~$ sudo lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 16.04 LTS
    Release:    16.04
    Codename:   xenial
    network@network:~$ uname -srpi
    Linux 4.4.0-23-generic x86_64 x86_64
  • 服务器时区设置
    ① 执行 sudo tzselect–> 选择亚洲(Asia)–> 选择中国(China)–> 选择北京(Beijing)–>
    ② 复制文件到 /etc 目录下:
    sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    注:若在系统安装时已设置正确时区,可跳过该步骤。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135488p2.htm

4. OpenStack 节点服务配置

4.1 OpenStack 基本配置

  • 统一时间源,安装 NTP 服务
    时间服务器将为所有节点提供支持,OpenStack 所有组件的时间都必须同步。本文选择安装 chrony
    Controller 节点
    ① 安装 NTP 服务:sudo apt-get install chrony
    ② 打开文件sudo vi /etc/chrony/chrony.conf 增加以下内容,使本服务器时间与外部服务器时间同步。如果不能访问外网,NTP 服务器将使用本机硬件时钟作为第二选择。

    allow 10.0.0.0/24
    server cn.pool.ntp.org iburst
    server 127.127.1.0 iburst

    ③ 重启 NTP 使配置生效:sudo service chrony restart
    :确保网络时间服务器 IP 地址可以被 DNS 解析,如果不能,则在 /etc/hosts 文件中手工加入。
    其他节点
    ① 安装 NTP 服务:sudo apt-get install chrony
    ② 打开配置文件sudo vi /etc/chrony/chrony.conf,删除全部默认设置,只添加如下内容:

    server controller iburst

    ③ 重启 NTP 服务:sudo service chrony restart
    验证配置是否成功
    chronyc sources -v
    注:若默认配置文件误删,可执行 sudo apt-get --purge remove chrony 清除式卸载 chrony,再重新安装。

  • 配置 OpenStack
    安装 OpenStack client:

    sudo apt-get install software-properties-common
    sudo apt-get update
    sudo apt-get dist-upgrade
    sudo apt-get install Python-openstackclient
  • 安装 SQL 数据库(MySQL/MariaDB)
    Controller Node
    ① 安装 MariaDB

    sudo apt-get install mariadb-server python-mysqldb

    ② 为 MySQL 的 root 用户设置密码 Database_PASS。(将Database_PASS 替换为前面设计的实际密码),若无输入密码提示,可执行下面命令设置 root 用户密码:

    sudo mysqladmin -u root password Database_PASS

    注:修改 mysql 用户密码可用以下命令

    mysqladmin -u用户名 -p旧密码 password 新密码

    ③ 创建文件sudo vi /etc/mysql/mariadb.conf.d/openstack.cnf,添加如下配置信息:

    [mysqld]
    bind-address = 10.0.0.11
    default-storage-engine = innodb
    innodb_file_per_table
    collation-server = utf8_general_ci
    character-set-server = utf8

    其中,bind-address 用于绑定 MySQL 服务监听地址到 Controller 节点的 Management Network 网口 IP, 以便 Compute&Network 节点访问 MySQL 中的 OpenStack 配置信息。
    ④ 重启 MySQL 数据库:

    sudo service mysql restart
    sudo service mysql status

    ⑤ 查看端口监听情况。

    controller@controller:~$ netstat -ntlp | grep 3306
    tcp        0      0 10.0.0.11:3306          0.0.0.0:*               LISTEN      - 

    ⑥ 开启 MySQL 安全保护措施
    注:测试环境对安全要求较低可忽略该步骤

    sudo mysql_secure_installation

    根据提示输入当前 root 用户密码,根据实际需要选择后续操作。
    ⑦ 测试 root 用户能否在本机 localhost 正常登录,执行以下命令:

    mysql -uroot -p
    mysql -h localhost -uroot -p

    若报错:

    ERROR 1698 (28000): Access denied for user 'root'@'localhost'

    解决方法:

    sudo mysql -u root
    use mysql;
    update user set plugin='' where User='root';
    flush privileges;
    exit;

    注:下面步骤可省略。
    ⑧ 测试 root 用户是否具有远程登录的权限
    通常,不赋予 root 用户远程登录的权限 ,即只允许root 用户在本机 localhost 上登录。可执行如下命令测试:

    mysql -h controller -uroot -p
    mysql -h 10.0.0.11 -uroot -p

    若报错,表示当前 root 用户没有远程登录权限:

    ERROR 1130 (HY000): Host 'controller' is not allowed to connect to this MariaDB server

    若需要赋予 root 远程登录权限,可执行以下命令:
    注:Database_PASS 替换为前面设计的实际密码

    mysql -uroot -p
    use mysql;
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Database_PASS';
    FLUSH PRIVILEGES;

    若不报错,可正常登录,表示当前 root 用户具有远程登录权限。

  • 安装 NoSQL 数据库(MongoDB)
    注:只有计量服务(Telemetry Service)用到
    Controller Node
    ① 安装 MongoDB

    sudo apt-get install mongodb-server mongodb-clients python-pymongo

    ② 打开文件 sudo vi /etc/mongodb.conf,修改配置信息:
    绑定 MongoDB 服务监听地址到 Controller 节点的 Management Network 网口 IP。

    bind_ip = 10.0.0.11

    MongoDB 数据库默认在目录 /var/lib/mongodb/journal 下创建若干 1GB 大小的日志文件,通过添加如下配置信息,可将每个日志文件大小限制为 128 MB,总的日志文件空间大小为 512MB。

    
    # Set Journal File Size
    
    smallfiles = true

    ③ 删除初始日志文件,重启 MongoDB 服务:

    sudo service mongodb stop
    sudo rm /var/lib/mongodb/journal/prealloc.*
    sudo service mongodb start
  • 安装消息队列服务(RabbitMQ)
    Controller Node
    ① 安装 RabbitMQ

    sudo apt-get install rabbitmq-server

    ② 为 OpenStack 添加用户openstack

    sudo rabbitmqctl add_user openstack RABBIT_PASS

    注:RABBIT_PASS 替换为前面设计的实际密码
    ③ 为 openstack 用户配置读、写访问权限:

    sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"
  • 安装 Memcached
    身份服务(Identity Service)认证机制需要使用 Memcached 缓存令牌(Token)
    Controller Node
    ① 安装 Memcached

    sudo apt-get install memcached python-memcache

    ② 修改配置文件sudo vi /etc/memcached.conf, 设置 Memcached 服务监听地址(Controller 节点的 Management Network 网口 IP)。

    -l 10.0.0.11

    ③ 重启 Memcached 服务

    sudo service memcached restart

    注:配置完上面几步后,再 Controller 节点上执行netstat -ntlp,查看上面几种服务端口监听是否正常。

4.2 身份服务配置(Identity Service – Keystone)

Identity 服务采用 RESTful 设计,使用 REST API 提供 Web 服务接口。
注:常见的 Web Service 方式有SOAPWSDLREST

部署节点:Controller Node

  • 在 MariaDB(MySQL)中创建 Keystone 数据库
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建数据库keystone

    CREATE DATABASE keystone;

    ③ 授予数据库 keystone 适当的权限
    注:KEYSTONE_DBPASS 替换为前面设计的实际密码。

    GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
    GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';

    注:上述授权命令中,%则代表了所有的 host 都能远程访问该 mysql。但 MySQL 官方文档指出,%并不包括 localhost。因此需要对localhost%都进行授权。
    ④ 测试 keystone 用户能否正常登录

    mysql -hlocalhost -ukeystone -p
    mysql -hcontroller -ukeystone -p

    ⑤ 测试 Controller 节点上的 MariaDB 能否被 Compute&Network 节点访问。可用 telnet 测试,分别在 Compute 节点和 Network 节点上执行以下命令:

    telnet controller 3306
  • 生成临时管理身份认证令牌(ADMIN_TOKEN)
    生成一个随机值,作为 keystone 初始配置时的 ADMIN_TOKEN

    openssl rand -hex 10

    记住 ADMIN_TOKEN:d57ea40f3a5eedcc70ef

  • 安装 Keystone 和 Apache HTTP Server with mod_wsgi
    本文采用 Apache HTTP server with mod_wsgi 监听端口 500035357 提供身份服务。默认 keystone 服务已经监听端口 500035357,为避免冲突,需首先关闭 keystone 服务。
    ① 关闭 keystone 服务
    新建文件 sudo vi /etc/init/keystone.override,添加内容:manual
    ② 安装keystoneApache HTTP server

    sudo apt-get install keystone apache2 libapache2-mod-wsgi

    ③ 修改配置文件 sudo vi /etc/keystone/keystone.conf
    [DEFAULT]处,修改管理令牌 admin_token 为前面生成的 ADMIN_TOKEN 值。
    注:修改 ADMIN_TOKEN 为实际 Token 值:d57ea40f3a5eedcc70ef

    admin_token = ADMIN_TOKEN

    [database] 处,配置数据库访问连接。
    注:KEYSTONE_DBPASS 替换为前面设计的实际密码。

    connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

    [token] 处,配置 Fernet 令牌提供者。

    provider = fernet

    ④ 将配置信息写入到身份服务数据库keystone

    su root
    su -s /bin/sh -c "keystone-manage db_sync" keystone

    ⑤ 初始化 Fernet keys:

    sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
  • 配置 Apache HTTP Server
    ① 修改配置文件sudo vi /etc/apache2/apache2.conf,将服务器名称 ServerName 指向 Controller 节点的 hostname,添加如下信息:

    ServerName controller

    ② 新建文件sudo vi /etc/apache2/sites-available/wsgi-keystone.conf,添加 Apache HTTP Server 配置信息,如下:

    Listen 5000
    Listen 35357
    
    <VirtualHost *:5000>
        WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
        WSGIProcessGroup keystone-public
        WSGIScriptAlias / /usr/bin/keystone-wsgi-public
        WSGIApplicationGroup %{GLOBAL}
        WSGIPassAuthorization On
        ErrorLogFormat "%{cu}t %M"
        ErrorLog /var/log/apache2/keystone.log
        CustomLog /var/log/apache2/keystone_access.log combined
    
        <Directory /usr/bin>
            Require all granted
        </Directory>
    </VirtualHost>
    
    <VirtualHost *:35357>
        WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
        WSGIProcessGroup keystone-admin
        WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
        WSGIApplicationGroup %{GLOBAL}
        WSGIPassAuthorization On
        ErrorLogFormat "%{cu}t %M"
        ErrorLog /var/log/apache2/keystone.log
        CustomLog /var/log/apache2/keystone_access.log combined
    
        <Directory /usr/bin>
            Require all granted
        </Directory>
    </VirtualHost>

    ③ 启用身份服务虚拟主机

    sudo ln -s /etc/apache2/sites-available/wsgi-keystone.conf /etc/apache2/sites-enabled

    ④ 重启 Apache HTTP Server

    sudo service apache2 restart

    测试是否 Apache HTTP Server 是否正常:
    在各节点(Controller、Compute、Network)上,执行 telnet 命令,看能否建立连接

    telnet controller 35357
    telnet controller 5000

    ⑤ 删除 keystone 配置信息默认数据库,Ubuntu 安装包安装 keystone 时默认配置采用 SQLite 数据库存放,但本文改用 MySQL 数据库存储 keystone 配置信息,因此可删除默认 SQLite 数据库。

    sudo rm -f /var/lib/keystone/keystone.db
  • 创建服务实体(Service Entity)和 API 路径(API Endpoints)
    身份服务数据库 keystone 默认是空的,必须使用之前配置时生成的临时认证令牌 ADMIN_TOKEN 来初始化用于身份服务的服务实体和 API 路径。
    ① 向 openstack 命令传递认证令牌值和身份服务 URL
    有两种方式:通过 openstack 命令行参数 --os-token--os-url;或者通过设置环境变量 OS_TOKENOS_URL。建议采用设置环境变量的方式,如下:
    注:修改 ADMIN_TOKEN 为前面生成的实际 Token 值:d57ea40f3a5eedcc70ef

    export OS_TOKEN=ADMIN_TOKEN
    export OS_URL=http://controller:35357/v3
    export OS_IDENTITY_API_VERSION=3

    ② 创建服务实体
    身份服务管理着一个 OpenStack 的服务目录,通过服务目录确定其他服务是否可用。创建服务实体命令如下:

    openstack service create --name keystone --description "OpenStack Identity" identity

    ③ 创建 API 路径
    OpenStack 每个服务可使用三种 API 路径变体:admininternalpublic。默认情况,admin 类型的 API 路径可修改用户(user)和租户(tenant),而 internalpublic类型的 API 路径不允许该操作。创建 API 路径命令如下:

    openstack endpoint create --region RegionOne identity public http://controller:5000/v3
    openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
    openstack endpoint create --region RegionOne identity admin http://controller:35357/v3
  • 创建域(Domain)、计划(Project)、用户(User)、角色(Role)
    ① 创建默认域

    openstack domain create --description "Default Domain" default

    ② 创建管理计划、管理用户、管理角色
    admin projectadmin useradmin role
    注:添加 admin 用户时需设置密码 ADMIN_PASS 为前面设计的实际密码。

    openstack project create --domain default --description "Admin Project" admin
    openstack user create --domain default --password-prompt admin
    openstack role create admin

    注:创建的任何角色都必须映射到 OpenStack 配置文件 policy.json 指定的角色。
    admin 角色授予 admin 计划和 admin 用户:

    openstack role add --project admin --user admin admin

    ③ 创建服务计划
    本文创建的服务计划每个服务仅包含一个唯一用户,可根据实际情况调整。

    openstack project create --domain default --description "Service Project" service

    ④ 创建示例计划、示例用户、普通用户角色
    常规任务(非管理任务)应该使用非特权计划和用户。
    注:添加 demo 用户时需设置密码 DEMO_PASS 为前面设计的实际密码。

    openstack project create --domain default --description "Demo Project" demo
    openstack user create --domain default --password-prompt demo
    openstack role create user

    将普通用户角色授予示例计划和示例用户:

    openstack role add --project demo --user demo user

    注:可重复执行上面步骤,创建其他需要的计划和用户。

  • 验证 Keystone 组件配置是否正确
    ① 处于安全考虑,禁用临时身份认证令牌机制。
    修改文件 sudo vi /etc/keystone/keystone-paste.ini,从[pipeline:public_api][pipeline:admin_api][pipeline:api_v3] 处移除 admin_token_auth 配置信息。
    ② 取消环境变量 OS_TOKENOS_URL

    unset OS_TOKEN OS_URL

    ③ 为 admin 用户申请一个身份认证令牌

    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_PASS。(将ADMIN_PASS 替换为前面设计的实际密码)
    若报错:

    'NoneType' object has no attribute 'service_catalog'

    可执行:export OS_AUTH_TYPE=password
    可能还会报错:

    __init__() got an unexpected keyword argument 'token'

    在执行下面创建环境脚本后重新测试发现已解决,猜测是环境变量 OS_TOKEN OS_URL 未取消,可再次执行 unset OS_TOKEN OS_URL 试试。
    ③ 为 demo 用户申请一个身份认证令牌

    openstack --os-auth-url http://controller:5000/v3 --os-project-domain-name default --os-user-domain-name default --os-project-name demo --os-username demo token issue

    输入 demo 用户密码 DEMO_PASS。(将DEMO_PASS 替换为前面设计的实际密码)
    注:上述设置 OpenStack 命令行参数的方式比较繁琐,可采用预先创建用户脚本的方式,在申请身份认证令牌时,只需执行如下命令:

    source ~/.openstack/.admin-openrc
    openstack token issue

    或者

    source ~/.openstack/.demo-openrc
    openstack token issue

    注:创建 OpenStack 客户端环境脚本方法如下

    cd ~
    mkdir ~/.openstack

    为管理用户 admin 创建 OpenStack 客户端环境脚本,vi ~/.openstack/.admin-openrc,添加
    注:将下面 ADMIN_PASS 替换为前面设计的实际密码

    
    # Add environment variables for admin
    
    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:35357/v3
    export OS_AUTH_TYPE=password
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    为示例用户 demo 创建 OpenStack 客户端环境脚本,vi ~/.openstack/.demo-openrc,添加
    注:将下面 DEMO_PASS 替换为前面设计的实际密码

    
    # Add environment variables for demo
    
    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_PASS
    export OS_AUTH_URL=http://controller:5000/v3
    export OS_AUTH_TYPE=password
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    最后,测试 Identity 服务是否正常,访问 http://192.168.1.11:35357/v3http://192.168.1.11:5000/v3。可在各节点上安装curl,访问服务 API 路径,下载查看信息,如下:

    sudo apt-get install curl
    curl http://192.168.1.11:35357/v3
    curl http://192.168.1.11:5000/v3
    curl http://controller:35357/v3
    curl http://controller:5000/v3

    得到如下信息:

    {"version": {"status": "stable", "updated": "2016-04-04T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.6", "links": [{"href": "http://192.168.10.3:35357/v3/", "rel": "self"}]}}

4.3 镜像服务配置(Image Service – Glance)

用户可使用 OpenStack 镜像服务提供的 REST API 查询、注册、恢复虚拟机镜像。

部署节点:Controller Node

  • 在 MariaDB 中创建 glance 数据库
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建 glance 数据库

    CREATE DATABASE glance;

    ③ 授予 glance 数据库适当权限
    注:GLANCE_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';
    GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';
  • 创建 Glance 服务实体和 API 路径
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建一个 glance 用户

    openstack user create --domain default --password-prompt glance

    输入用户 glance 的密码 GLANCE_PASS(将GLANCE_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 glance 用户和 service 计划

    openstack role add --project service --user glance admin

    ④ 创建 glance 服务实体

    openstack service create --name glance --description "OpenStack Image" image

    ⑤ 创建镜像服务 API 路径

    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
  • 安装和配置 Glance 服务组件
    ① 安装 Glance

    sudo apt-get install glance

    ② 修改配置文件 sudo vi /etc/glance/glance-api.conf
    注:GLANCE_DBPASSGLANCE_PASS替换为前面设计的实际密码。
    [database] 处,配置数据库访问连接。

    connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

    [keystone_authtoken][paste_deploy]处,配置身份服务访问。
    注:注释掉 [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_PASS
    
    [paste_deploy]
    flavor = keystone

    在 `[glance_store]处配置本地文件系统存储和镜像文件存储位置。

    stores = file,http
    default_store = file
    filesystem_store_datadir = /var/lib/glance/images/

    ③ 修改配置文件 sudo vi /etc/glance/glance-registry.conf
    注:GLANCE_DBPASSGLANCE_PASS替换为前面设计的实际密码。
    [database] 处,配置数据库访问连接。

    connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

    [keystone_authtoken][paste_deploy]处,配置身份服务访问。
    注:注释掉 [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_PASS
    
    [paste_deploy]
    flavor = keystone

    ④ 将配置信息写入 glance 数据库

    su root
    su -s /bin/sh -c "glance-manage db_sync" glance

    ⑥ 重启 Image Service

    sudo service glance-registry restart
    sudo service glance-api restart
  • 验证 Glance 服务组件配置是否正确
    ① 设置 OpenStack admin用户环境变量

    source ~/.openstack/.admin-openrc

    ② 下载 CirrOS 系统镜像
    注:此处采用 CirrOS 镜像测试,也可自行选择其他系统镜像

    wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img

    ③ 上传镜像,设置镜像参数磁盘格式 QEMU Copy On Write 2 (QCOW2)、容器格式bare 及可见性public

    openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public

    ④ 确认上传是否成功,验证镜像属性。

    controller@controller:~$ openstack image list
    Password: 
    +--------------------------------------+-------------------------+--------+
    | ID                                   | Name                    | Status |
    +--------------------------------------+-------------------------+--------+
    | 6d07d4e1-3b9d-4986-b1d7-8dd92ec9bd2c | cirros                  | active |
    +--------------------------------------+-------------------------+--------+

4.4 计算服务配置(Compute Service – Nova)

部署节点:Controller Node
在 Controller 节点上需要安装 nova-api、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler

  • 在 MariaDB(MySQL)中创建数据库 nova_apinova
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建 nova_apinova数据库

    CREATE DATABASE nova_api;
    CREATE DATABASE nova;

    ③ 授予 nova_apinova数据库适当权限
    注:NOVA_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
    GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
    GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
    GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
  • 创建计算服务证书和 API 路径
    ① 设置 OpenStack admin用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建 nova 用户

    openstack user create --domain default --password-prompt nova

    输入用户 nova 的密码 NOVA_PASS(将NOVA_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 nova 用户

    openstack role add --project service --user nova admin

    ④ 创建 nova 服务实体

    openstack service create --name nova --description "OpenStack Compute" compute

    ⑤ 创建计算服务 API 路径

    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
  • 安装计算服务组件
    ① 安装 Nova 组件

    sudo apt-get install nova-api nova-conductor nova-consoleauth nova-novncproxy nova-scheduler

    ② 修改配置文件 sudo vi /etc/nova/nova.conf
    [DEFAULT]处只启用 computemetadataAPIs,将

    enabled_apis=ec2,osapi_compute,metadata

    修改为:

    enabled_apis = osapi_compute,metadata

    [api_database][database]处配置数据库访问连接(若没有 [api_database][database]标记,则手动添加)
    注:NOVA_DBPASS 替换为前面设计的实际密码

    [api_database]
    connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
    
    [database]
    connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队里访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NOVA_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他内容

    [DEFAULT]
    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 = nova
    password = NOVA_PASS

    [DEFAULT] 处配置 my_ip 为 Controller 节点 Management Network 网口地址

    [DEFAULT]
    my_ip = 10.0.0.11

    [DEFAULT] 处启用网络服务支持
    注:默认情况下,计算服务使用主机内部防火墙驱动,因此必须禁用 OpenStack 网络服务中的防火墙驱动。

    [DEFAULT]
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver

    [vnc] 处,使用 Controller 节点 Management Network 网口地址配置 VNC 代理(VNC proxy)。

    [vnc]
    vncserver_listen = $my_ip
    vncserver_proxyclient_address = $my_ip

    [glance] 处配置镜像服务 API 位置

    [glance]
    api_servers = http://controller:9292

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp

    最后,由于安装包 BUG,需要在 [DEFAULT] 处移除 logdir。在[DEFAULT] 处删除,以下内容

    logdir=/var/log/nova

    ③ 将配置信息写入计算服务数据库nova

    su root
    su -s /bin/sh -c "nova-manage api_db sync" nova
    su -s /bin/sh -c "nova-manage db sync" nova

    ④ 重启计算服务

    sudo service nova-api restart
    sudo service nova-consoleauth restart
    sudo service nova-scheduler restart
    sudo service nova-conductor restart
    sudo service nova-novncproxy restart

部署节点:Compute Node
在 Compute 节点上需要安装 nova-compute。
注:以下步骤在 Compute 节点上执行

  • 安装配置计算服务组件
    安装 nova-compute 组件

    sudo apt-get install nova-compute
  • 修改配置文件 sudo vi /etc/nova/nova.conf
    ① 在[DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    ② 在 [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NOVA_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他内容

    [DEFAULT]
    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 = nova
    password = NOVA_PASS

    [DEFAULT] 处配置 my_ip 为 Compute 节点 Management Network 网口地址

    [DEFAULT]
    my_ip = 10.0.0.31

    [DEFAULT] 处启用网络服务支持

    [DEFAULT]
    use_neutron = True
    firewall_driver = nova.virt.firewall.NoopFirewallDriver

    [vnc] 处配置远程控制访问

    [vnc]
    enabled = True
    vncserver_listen = 0.0.0.0
    vncserver_proxyclient_address = $my_ip
    novncproxy_base_url = http://controller:6080/vnc_auto.html

    注: VNC 服务器端监听所有地址,VNC 代理客户端只监听 Compute 节点 Management Network 网口地址,base URL 设置 Compute 节点远程控制台浏览器访问地址(若浏览无法解析 controller,则需替换为相应 IP 地址)。
    [glance] 处配置镜像服务 API

    [glance]
    api_servers = http://controller:9292

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/nova/tmp

    最后,由于安装包 BUG,需要在 [DEFAULT] 处移除 logdir。在[DEFAULT] 处删除,以下内容

    logdir=/var/log/nova
  • 完成安装,重启计算服务
    ① 检测是否支持虚拟机硬件加速

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

    若返回结果大于等于 1,则支持,无需做额外配置;
    若返回结果 0,则不支持硬件加速,需要做以下额外配置:修改配置文件 sudo vi /etc/nova/nova-compute.conf 中的 libvirt 设置项,使用 QEMU 代替KVM

    [libvirt]
    virt_type = qemu

    ② 重启计算服务

    sudo service nova-compute restart
  • 验证计算服务是否安装正确
    注:以下步骤需在 Controller 节点执行
    ① 设置 OpenStack admin用户环境变量

    source ~/.openstack/.admin-openrc

    ② 打印服务组件列表,验证每个成功启动和注册的进程。

    openstack compute service list

    结果如下:

    +--+----------------+----------+--------+-------+-----+--------------------------+
    |Id|     Binary     |   Host   |  Zone  |Status |State|  Updated At              |
    +--+----------------+----------+--------+-------+-----+--------------------------+
    | 4|nova-consoleauth|controller|internal|enabled| up  |2016-05-29T06:28:52.000000|
    | 5|nova-scheduler  |controller|internal|enabled| up  |2016-05-29T06:28:51.000000|
    | 6|nova-conductor  |controller|internal|enabled| up  |2016-05-29T06:28:53.000000|
    | 7|nova-compute    |compute   |nova    |enabled| up  |2016-05-29T06:28:45.000000|
    +--+----------------+----------+--------+-------+-----+--------------------------+

4.5 网络服务配置(Networking Service – Neutron)

部署节点:Controller Node

  • 在 MariaDB(MySQL)中创建 neutron 数据库
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建数据库neutron

    CREATE DATABASE neutron;

    ③ 授予数据库 neutron 适当的权限
    注:NEUTRON_DBPASS 替换为前面设计的实际密码。

    GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
    GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';
  • 创建网络服务证书和 API 路径
    ① 设置 OpenStack admin用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建 neutron 用户

    openstack user create --domain default --password-prompt neutron

    输入用户 neutron 的密码 NEUTRON_PASS(将NEUTRON_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 neutron 用户

    openstack role add --project service --user neutron admin

    ④ 创建 neutron 服务实体

    openstack service create --name neutron --description "OpenStack Networking" network

    ⑤ 创建网络服务 API 路径

    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
  • 安装配置 neutron-server 服务组件
    ① 安装 neutron-server 组件

    sudo apt-get install neutron-server neutron-plugin-ml2

    ② 修改配置文件 sudo vi /etc/neutron/neutron.conf
    [database]处配置网络服务数据库 neutron 访问连接
    注:NEUTRON_DBPASS 替换为前面设计的实际密码
    注:首先注释掉 [database] 处已存在的默认的connection

    [database]
    
    # connection = sqlite:////var/lib/neutron/neutron.sqlite
    
    connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

    [DEFAULT] 处启用 Modular Layer 2 (ML2) plug-inrouter serviceoverlapping IP addresses

    [DEFAULT]
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = True

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NEUTRON_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他配置信息

    [DEFAULT]
    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_PASS

    [DEFAULT][nova]处配置网络来通知计算节点网络拓扑变化。
    注:NOVA_PASS 替换为前面设计的实际密码

    [DEFAULT]
    notify_nova_on_port_status_changes = True
    notify_nova_on_port_data_changes = True
    
    [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_PASS
  • 配置 Modular Layer 2 (ML2) 插件
    ML2 plug-in 使用 Linux 网桥机制为 OpenStack 实例建立 layer- 2 虚拟网络设施(桥接和交换)。
    修改配置文件 sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
    ① 在[ml2] 处启用 flatVLANVXLAN 网络
    注:在配置 ML2 插件后,移除 type_drivers 设置项的部分值,将导致数据库不一致。

    [ml2]
    type_drivers = flat,vlan,vxlan

    ② 在 [ml2] 处启用 VXLAN self-service 网络

    [ml2]
    tenant_network_types = vxlan

    ③ 在 [ml2] 处启用 Linux bridgelayer-2 population机制

    [ml2]
    mechanism_drivers = linuxbridge,l2population

    注:Linux Bridge Agent只支持 VXLAN overlay networks
    ④ 在[ml2] 处启用端口安全扩展驱动

    [ml2]
    extension_drivers = port_security

    ⑤ 在 [ml2_type_flat] 处配置运营商虚拟网络为flat network

    [ml2_type_flat]
    flat_networks = provider

    ⑥ 在 [ml2_type_vxlan] 处配置自服务网络中的 VXLAN 网络标识符范围

    [ml2_type_vxlan]
    vni_ranges = 1:1000

    ⑦ 在 [securitygroup] 处启用 ipset 来增强安全组规则的效率

    [securitygroup]
    enable_ipset = True
  • 将配置信息写入 neutron 数据库

    su root
    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
  • 为计算服务配置网络访问服务
    修改配置文件 sudo vi /etc/nova/nova.conf
    [neutron]处配置访问参数,启用元数据服务代理,配置元数据代理共享密钥
    注:NEUTRON_PASSMETADATA_SECRET替换为前面设计的实际密码

    [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_PASS
    
    service_metadata_proxy = True
    metadata_proxy_shared_secret = METADATA_SECRET
  • 重启计算服务 API 和网络服务

    sudo service nova-api restart 
    sudo service neutron-server restart

部署节点:Network Node

Network 节点上部署组件:neutron-linuxbridge-agent
neutron-l3-agentneutron-dhcp-agentneutron-metadata-agent

网络服务部署架构有两种方式 Provider NetworksSelf-Service Networks,在本文开头作了简要介绍。本文采用 Self-Service Networks 方式部署。
参考文档:Deploy Networking Service using the Architecture of Self-Service Networks

  • 安装网络服务组件

    sudo apt-get install neutron-linuxbridge-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent
  • 配置公共服务组件
    公共组件配置包括认证机制、消息队列。修改配置文件 sudo vi /etc/neutron/neutron.conf
    ① 在[database] 处注释掉其他所有设置项,因为 Network 节点不需要直接访问数据库。
    ② 在 [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    ③ 在 [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NEUTRON_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他配置信息

    [DEFAULT]
    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_PASS
  • 配置 Linux 网桥代理
    Linux bridge agent 为实例建立了二层虚拟网络设施,而且可以管理安全组。
    ���改配置文件 sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
    ① 在[linux_bridge] 处将虚拟网络映射到物理网络
    注:PROVIDER_INTERFACE_NAME 替换为 Network 节点 External Network 网络接口名称eth0

    [linux_bridge]
    physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

    ② 在 [vxlan] 处启用 VXLAN overlay networks,配置管理 Overlay 网络的物理网络 IP 地址,启用layer-2 population
    注:OVERLAY_INTERFACE_IP_ADDRESS 替换为 Network 节点 Management Network 网络接口 IP 地址10.0.0.21

    [vxlan]
    enable_vxlan = True
    local_ip = OVERLAY_INTERFACE_IP_ADDRESS
    l2_population = True

    ③ 在 [securitygroup] 处启用安全组,并配置Linux bridge iptables firewall driver

    [securitygroup]
    enable_security_group = True
    firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
  • 配置三层网络代理
    L3(Layer-3) Agent位自服务网络提供了路由和 NAT 服务。
    修改配置文件 sudo vi /etc/neutron/l3_agent.ini,在[DEFAULT] 处配置 Linux 网桥接口驱动(Linux Bridge Interface Driver)和外网网桥。

    [DEFAULT]
    interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
    external_network_bridge =

    注:external_network_bridge值故意空缺,这样可使多个外部网络共用一个代理。

  • 配置 DHCP 代理
    修改配置文件 sudo vi /etc/neutron/dhcp_agent.ini,在[DEFAULT] 处配置 Linux bridge interface driverDnsmasq DHCP driver,启用独立的 metadata 使运营商网络实例可以访问虚拟网络元信息。

    [DEFAULT]
    interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
    dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
    enable_isolated_metadata = True
  • 配置元数据代理
    元数据代理提供一些诸如证书之类的配置信息。
    修改配置文件 sudo vi /etc/neutron/metadata_agent.ini,在[DEFAULT] 处配置元数据主机和共享密钥。
    注:METADATA_SECRET 替换为前面设计的实际密码

    [DEFAULT]
    nova_metadata_ip = controller
    metadata_proxy_shared_secret = METADATA_SECRET
  • 重启网络服务代理

    sudo service neutron-linuxbridge-agent restart
    sudo service neutron-dhcp-agent restart
    sudo service neutron-metadata-agent restart
    sudo service neutron-l3-agent restart

部署节点:Compute Node

  • 安装网络服务组件

    sudo apt-get install neutron-linuxbridge-agent
  • 配置公共组件
    公共组件配置包括认证机制、消息队列、插件。
    修改配置文件 sudo vi /etc/neutron/neutron.conf
    ① 在[database] 处注释掉其他所有设置项,因为 Compute 节点不需要直接访问数据库。
    ② 在 [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    ③ 在 [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NEUTRON_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他项

    [DEFAULT]
    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_PASS
  • 配置网络设置
    配置 Linux 网桥代理,修改配置文件 sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
    ① 在[linux_bridge] 处将虚拟网络映射到物理网络
    注:PROVIDER_INTERFACE_NAME 替换为 Compute 节点 External Network 网络接口名称eth0

    [linux_bridge]
    physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

    ② 在 [vxlan] 处启用 VXLAN 覆盖网络,配置管理覆盖网络的物理网络接口 IP 地址,启用 layer-2 population
    注:OVERLAY_INTERFACE_IP_ADDRESS 替换为 Compute 节点 Management Network 网络接口 IP 地址10.0.0.31

    [vxlan]
    enable_vxlan = True
    local_ip = OVERLAY_INTERFACE_IP_ADDRESS
    l2_population = True

    ③ 在 [securitygroup] 处启用安全组,配置Linux bridge iptables firewall driver

    [securitygroup]
    enable_security_group = True
    firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
  • 配置计算服务访问网络
    修改配置文件 sudo vi /etc/nova/nova.conf
    ① 在[neutron] 处配置访问参数
    注:NEUTRON_PASS 替换为前面设计的实际密码

    [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_PASS

    ② 重启计算服务

    sudo service nova-compute restart

    ③ 重启 Linux 网桥代理

    sudo service neutron-linuxbridge-agent restart
  • 验证网络服务是否安装配置正确
    ① 在 Controller 节点上设置 OpenStack 管理用户 admin 的环境变量

    source ~/.openstack/.admin-openrc

    ② 列出已加载的扩展包,验证成功启动的 neutron-server 进程

    neutron ext-list
    neutron agent-list

4.6 仪表盘服务配置(Dashboard Service – Horizon)

仪表盘是一个 Web 接口,可使云管理员和用户管理各种各样的 OpenStack 资源和服务。本文采用 Apache Web Server 部署 Dashboard 服务。

部署节点:Controller Node

  • 安装Horizon

    sudo apt-get install openstack-dashboard

    若遇到由于 openstack-dashboard-ubuntu-theme 无法安装的问题,可执行如下命令:

    dpkg --remove --force-remove-reinstreq openstack-dashboard-ubuntu-theme
  • 修改配置文件 sudo vi /etc/openstack-dashboard/local_settings.py
    ① 在controller 节点上配置 horizon 使用OpenStack Service

    OPENSTACK_HOST = "controller"

    ② 配置允许所有主机都可以访问horizon

    ALLOWED_HOSTS = ['*', ]

    ③ 配置 memcached session storage service
    注:注释掉其他 session storage 配置信息

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
    
    CACHES = {'default': {'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
             'LOCATION': 'controller:11211',
        }
    }

    ④ 启用Identity API version 3

    OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

    ⑤ 启用域名支持

    OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

    ⑥ 配置 API 版本

    OPENSTACK_API_VERSIONS = {"identity": 3,
    "image": 2,
    "volume": 2,
    }

    ⑦ 配置通过 Dashboard 创建的用户默认域名为default

    OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"

    ⑧ 配置通过 Dashboard 创建的用户的角色默认为user

    OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

    ⑨ 配置时区
    注:该步骤可选配置

    TIME_ZONE = "Asia/Shanghai"
  • 重新加载 Apache 服务

    sudo service apache2 reload
  • 验证 Dashboard 服务是否部署成功

    http://controller/horizon
  • 在物理主机中为 Dashboard 外网访问配置端口映射
    ① 利用 Windows 自带的 netsh 配置端口映射,打开 cmd 命令行,输入:

    netsh interface portproxy add v4tov4 listenport=11180 connectaddress=192.168.1.11 connectport=80

    ② 在系统防火墙高级设置中配置入站规则
    新建规则–> 端口–> 特定本地端口:11180–> 允许连接–> 选择域 / 专用 / 公用–> 名称:VMware OpenStack Dashboard HTTP Service、描述:用于 VMware 中 OpenStack 云计算平台 Dashboard 服务的 Web 访问
    ③ 利用 Windows 自带的netsh 配置端口映射,打开 cmd 命令行,输入:

    netsh interface portproxy add v4tov4 listenport=6080 connectaddress=192.168.1.11 connectport=6080

    ④ 在系统防火墙高级设置中配置入站规则
    新建规则–> 端口–> 特定本地端口:6080–> 允许连接–> 选择域 / 专用 / 公用–> 名称:VMware OpenStack Compute Service of Nova Proxy、描述:用于 VMware 中 OpenStack 云计算平台 Nova Proxy 服务的 Web 访问

4.7 块存储服务配置(Block Storage Service – Cinder)

部署节点:Controller Node

  • 在 MariaDB(MySQL)中创建数据库 cinder
    ① 以root 用户登录 MySQL

    mysql -u root -p

    ② 创建 cinder 数据库

    CREATE DATABASE cinder;

    ③ 授予 cinder 数据库适当权限
    注:CINDER_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
    GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';
  • 创建 Cinder 服务实体和 API 路径
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建一个 cinder 用户

    openstack user create --domain default --password-prompt cinder

    输入用户 cinder 的密码 CINDER_PASS(将CINDER_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 cinder 用户

    openstack role add --project service --user cinder admin

    ④ 创建 cindercinderv2服务实体

    openstack service create --name cinder --description "OpenStack Block Storage" volume
    openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2

    ⑤ 创建块存储服务 API 路径

    openstack endpoint create --region RegionOne volume public http://controller:8776/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne volume internal http://controller:8776/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne volume admin http://controller:8776/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(tenant_id\)s
    openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(tenant_id\)s
    openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(tenant_id\)s
  • 安装和配置 Cinder 服务组件
    ① 安装 Cinder

    sudo apt-get install cinder-api cinder-scheduler

    ② 修改配置文件 sudo vi /etc/cinder/cinder.conf
    注:CINDER_DBPASSCINDER_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据访问连接:

    [database]
    connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置认证服务访问:
    注:注释或删除 [keystone_authtoken] 处其他默认设置。

    [DEFAULT]
    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 = cinder
    password = CINDER_PASS

    [DEFAULT] 处配置 my_ip 为 Controller 节点 Management Networ 网络接口地址:

    [DEFAULT]
    my_ip = 10.0.0.11

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/cinder/tmp

    ③ 将配置信息写入块存储服务数据库cinder

    su root
    su -s /bin/sh -c "cinder-manage db sync" cinder
  • 配置计算服务调用块存储服务
    修改配置文件sudo vi /etc/nova/nova.conf,添加如下信息:

    [cinder]
    os_region_name = RegionOne
  • 重启计算服务 API 和块存储服务

    sudo service nova-api restart
    sudo service cinder-scheduler restart
    sudo service cinder-api restart

部署节点:BlockStorage Node

  • 安装配置 LVM
    ① 安装 LVM:

    sudo apt-get install lvm2

    ② 创建 LVM 物理卷/dev/sdb

    sudo pvcreate /dev/sdb

    ③ 创建 LVM 卷组cinder-volumes

    sudo vgcreate cinder-volumes /dev/sdb

    ④ 配置只有 OpenStack 实例才可以访问块存储卷
    修改配置文件 sudo vi /etc/lvm/lvm.conf,在devices 处添加一个过滤器,使 OpenStack 实例只允许访问/dev/sdb

    filter = ["a/sdb/", "r/.*/"]

    注:如果块存储节点操作系统磁盘也使用了逻辑卷管理 LVM,则在过滤器中必须将操作系统磁盘 LVM 所在设备 /dev/sda 也添加到允许访问列表。例如本文各节点系统磁盘均采用 LVM,则应添加下面过滤器:

    filter = ["a/sda/", "a/sdb/", "r/.*/"]

    注:如果 Compute 节点操作系统磁盘(如 /dev/sda)也使用 LVM,则必须在Compute 节点上修改配置文件sudo vi /etc/lvm/lvm.conf,将操作系统磁盘添加到过滤器允许访问列表。如下:

    filter = ["a/sda/", "r/.*/"]
  • 安装配置块存储服务组件
    ① 安装cinder

    sudo apt-get install cinder-volume

    ② 修改配置文件 sudo vi /etc/cinder/cinder.conf
    注:CINDER_DBPASSCINDER_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据库访问连接:

    [database]
    connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问服务:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置身份认证服务访问:
    注:注释或删除 [keystone_authtoken] 处其他默认配置信息

    [DEFAULT]
    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 = cinder
    password = CINDER_PASS

    [DEFAULT] 处配置 my_ip 为 BlockStorage 节点 Management Networ 网络接口地址:

    [DEFAULT]
    my_ip = 10.0.0.41

    [lvm] 处添加 LVM 后端驱动、卷组、iSCSI 协议和服务,如下:

    [lvm]
    volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
    volume_group = cinder-volumes
    iscsi_protocol = iscsi
    iscsi_helper = tgtadm

    [DEFAULT] 处配置 LVM 后端名称(可任意设置,为了简单,本文设置为 lvm):

    [DEFAULT]
    enabled_backends = lvm

    [DEFAULT] 处配置镜像服务 API 路径:

    [DEFAULT]
    glance_api_servers = http://controller:9292

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/cinder/tmp

    ③ 重启块存储服务

    sudo service tgt restart
    sudo service cinder-volume restart
  • 验证块存储服务是否安装配置正确
    ① 在 Controller 节点上设置 OpenStack 管理用户 admin 的环境变量

    source ~/.openstack/.admin-openrc

    ② 列出块存储服务组件,验证成功启动的 cinder 进程

    cinder service-list

4.8 共享文件系统服务配置(Shared File Systems Service – Manila)

共享文件系统服务可以提供对共享文件系统或分布式文件系统的访问。

4.8.1 Shared File Systems Service(Manila)

部署节点:Controller Node

  • 在 MariaDB(MySQL)中创建数据库 manila
    ① 以root 用户登录 MySQL

    mysql -u root -p

    ② 创建 manila 数据库

    CREATE DATABASE manila;

    ③ 授予 manila 数据库适当权限
    注:MANILA_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' IDENTIFIED BY 'MANILA_DBPASS';
    GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' IDENTIFIED BY 'MANILA_DBPASS';
  • 创建 Manila 服务实体和 API 路径
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建一个 manila 用户

    openstack user create --domain default --password-prompt manila

    输入用户 manila 的密码 MANILA_PASS(将MANILA_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 manila 用户

    openstack role add --project service --user manila admin

    ④ 创建 manilamanilav2服务实体

    openstack service create --name manila --description "OpenStack Shared File Systems" share
    openstack service create --name manilav2 --description "OpenStack Shared File Systems" sharev2

    ⑤ 创建共享文件系统服务 API 路径

    openstack endpoint create --region RegionOne share public http://controller:8786/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne share internal http://controller:8786/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne share admin http://controller:8786/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne sharev2 public http://controller:8786/v2/%\(tenant_id\)s
    openstack endpoint create --region RegionOne sharev2 internal http://controller:8786/v2/%\(tenant_id\)s
    openstack endpoint create --region RegionOne sharev2 admin http://controller:8786/v2/%\(tenant_id\)s
  • 安装和配置 Manila 服务组件
    ① 安装 Manila

    sudo apt-get install manila-api manila-scheduler python-manilaclient

    ② 修改配置文件 sudo vi /etc/manila/manila.conf
    注:MANILA_DBPASSMANILA_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据访问连接:

    [database]
    connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT] 处添加如下配置信息:

    default_share_type = default_share_type
    rootwrap_config = /etc/manila/rootwrap.conf

    [DEFAULT][keystone_authtoken]处配置认证服务访问:
    注:注释或删除 [keystone_authtoken] 处其他默认设置。

    [DEFAULT]
    auth_strategy = keystone
    
    [keystone_authtoken]
    memcached_servers = controller:11211
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = manila
    password = MANILA_PASS

    [DEFAULT] 处配置 my_ip 为 Controller 节点 Management Networ 网络接口地址:

    [DEFAULT]
    my_ip = 10.0.0.11

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/manila/tmp

    ③ 将配置信息写入块存储服务数据库manila

    su root
    su -s /bin/sh -c "manila-manage db sync" manila
  • 重启共享文件系统服务

    sudo service manila-scheduler restart
    sudo service manila-api restart

部署节点:BlockStorage Node

  • 安装共享文件系统服务组件
    ① 安装manila

    sudo apt-get install manila-share python-pymysql

    ② 修改配置文件 sudo vi /etc/manila/manila.conf
    注:MANILA_DBPASSMANILA_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据库访问连接:

    [database]
    connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问服务:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT] 处添加如下配置信息:

    default_share_type = default_share_type
    rootwrap_config = /etc/manila/rootwrap.conf

    [DEFAULT][keystone_authtoken]处配置身份认证服务访问:
    注:注释或删除 [keystone_authtoken] 处其他默认配置信息

    [DEFAULT]
    auth_strategy = keystone
    
    [keystone_authtoken]
    memcached_servers = controller:11211
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = manila
    password = MANILA_PASS

    [DEFAULT] 处配置 my_ip 为 BlockStorage 节点 Management Networ 网络接口地址:

    [DEFAULT]
    my_ip = 10.0.0.41

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/manila/tmp
  • 安装配置共享服务器管理
    ① 针对两种不同的网络模式(provider 和 self-service),共享文件系统服务支持两种模式:
    不需要驱动器支持的共享服务器管理:不需要安装任何驱动,默认使用 LVM 和 NFS 服务方式,支持 NFS 和 CIFS 协议,通过在共享服务器创建共享卷,利用 NFS 为虚拟机提供共享服务。
    需要驱动器支持的共享服务器管理:需要计算 (Nova), 网络(Neutron) 和块存储管理 (Cinder) 服务管理共享服务器。用于创建共享服务器的信息被配置为共享网络。这种模式使用通用驱动程序,并需要启用驱动控制共享服务器(DHSS),还需要连接到公共网络路由器。本指南采用第二种模式。
    ② 安装网络服务组件

    sudo apt-get install neutron-plugin-linuxbridge-agent

    ③ 配置网络服务公共组件
    公共组件配置包括认证机制、消息队列、插件。修改配置文件 sudo vi /etc/neutron/neutron.conf
    [database]处注释掉其他所有设置项,因为 BlockStorage 节点不需要直接访问数据库。
    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置身份服务访问
    注:NEUTRON_PASS 替换为前面设计的实际密码
    注:注释或删除 [keystone_authtoken] 处其他项

    [DEFAULT]
    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_PASS

    ④ 配置网络设置
    配置 Linux 网桥代理,修改配置文件 sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
    [linux_bridge]处将虚拟网络映射到物理网络
    注:PROVIDER_INTERFACE_NAME 替换为 BlockStorage 节点 External Network 网络接口名称eth0

    [linux_bridge]
    physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME

    [vxlan] 处启用 VXLAN 覆盖网络,配置管理覆盖网络的物理网络接口 IP 地址,启用 layer-2 population
    注:OVERLAY_INTERFACE_IP_ADDRESS 替换为 BlockStorage 节点 Management Network 网络接口 IP 地址10.0.0.41

    [vxlan]
    enable_vxlan = True
    local_ip = OVERLAY_INTERFACE_IP_ADDRESS
    l2_population = True

    [securitygroup] 处启用安全组,配置Linux bridge iptables firewall driver

    [securitygroup]
    enable_security_group = True
    firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

    ⑤ 修改配置文件 sudo vi /etc/manila/manila.conf
    [DEFAULT]处启用 genericNFS/CIFS协议:
    注:下面共享后端名称可任意设置,本指南设置为驱动名称。

    [DEFAULT]
    enabled_share_backends = generic
    enabled_share_protocols = NFS,CIFS

    [neutron][nova][cinder]处启用这些服务的认证信息:
    注:NEUTRON_PASSNOVA_PASSCINDER_PASS替换为前面设计的实际密码

    [neutron]
    url = http://controller:9696
    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
    region_name = RegionOne
    project_name = service
    username = neutron
    password = NEUTRON_PASS
    
    [nova]
    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
    region_name = RegionOne
    project_name = service
    username = nova
    password = NOVA_PASS
    
    [cinder]
    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
    region_name = RegionOne
    project_name = service
    username = cinder
    password = CINDER_PASS

    [generic] 处配置 generic 驱动:

    [generic]
    share_backend_name = GENERIC
    share_driver = manila.share.drivers.generic.GenericShareDriver
    driver_handles_share_servers = True
    service_instance_flavor_id = 100
    service_image_name = manila-service-image
    service_instance_user = manila
    service_instance_password = manila
    interface_driver = manila.network.linux.interface.BridgeInterfaceDriver

    ⑥ 重启服务

    sudo service manila-share restart
    sudo service neutron-linuxbridge-agent restart
  • 验证共享文件系统服务和网络服务代理是否安装配置正确
    ① 在 Controller 节点上设置 OpenStack 管理用户 admin 的环境变量

    source ~/.openstack/.admin-openrc

    ② 列出共享文件系统服务组件,验证成功启动的 manila 进程

    manila service-list

    ③ 列出网络服务代理

    neutron agent-list

4.8.2 Manila Dashboard(Manila UI)

注:在 OpenStack Mitaka 发行版中 Horizon 中不包括 Manila,需要安装额外的插件 manila-ui 才能在 Horizon 中显示 Share 菜单。

  • 安装 Manila UI
    查看列表:http://tarballs.openstack.org/manila-ui/

    sudo pip install 'http://tarballs.openstack.org/manila-ui/manila-ui-stable-mitaka.tar.gz'
  • Horizon 中启用 Manila UI
    查看 Manila UI 安装路径:find /usr -name 'manila_ui'

    cd /usr/local/lib/python2.7/dist-packages/manila_ui
    sudo cp ./enabled/_90_manila_*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
  • 配置中文语言支持

    sudo apt-get install gettext python-pip python-dev build-essential
    cd /usr/share/openstack-dashboard/horizon
    sudo /usr/share/openstack-dashboard/manage.py makemessages -l en --no-obsolete
    sudo /usr/share/openstack-dashboard/manage.py makemessages -d djangojs -l en --no-obsolete
    cd /usr/share/openstack-dashboard/openstack_dashboard
    sudo /usr/share/openstack-dashboard/manage.py makemessages --extension=html,txt,csv --ignore=openstack -l en --no-obsolete
    cd /usr/share/openstack-dashboard/horizon
    sudo /usr/share/openstack-dashboard/manage.py compilemessages
    cd /usr/share/openstack-dashboard/openstack_dashboard
    sudo /usr/share/openstack-dashboard/manage.py compilemessages
    
    cd /usr/local/lib/python2.7/dist-packages/manila_ui
    sudo service apache2 reload
  • 重新加载Apache Web Server

    sudo service apache2 reload

    参考链接:
    https://github.com/openstack/manila-ui
    http://docs.openstack.org/developer/horizon/topics/install.html
    https://www.howtoinstall.co/en/ubuntu/xenial/python-manila-ui

4.9 对象存储服务配置(Object Storage Service – Swift)

通过 REST API 提供对象存储和检索服务。

部署节点:Controller Node

  • 创建对象存储服务实体和 API 路径
    注:对象存储服务不使用 Controller 节点上的 SQL 数据库 MariaDB,它使用每个存储节点上的分布式数据库 SQLite
    ① 设置 OpenStack 中admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建一个 swift 用户

    openstack user create --domain default --password-prompt swift

    输入用户 swift 的密码 SWIFT_PASS(将SWIFT_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 swift 用户

    openstack role add --project service --user swift admin

    ④ 创建 swift 服务实体

    openstack service create --name swift --description "OpenStack Object Storage" object-store

    ⑤ 创建对象存储服务 API 路径

    openstack endpoint create --region RegionOne object-store public http://controller:8080/v1/AUTH_%\(tenant_id\)s
    openstack endpoint create --region RegionOne object-store internal http://controller:8080/v1/AUTH_%\(tenant_id\)s
    openstack endpoint create --region RegionOne object-store admin http://controller:8080/v1
  • 安装和配置 Swift 服务组件
    ① 安装 Swift 相关服务组件

    sudo apt-get install swift swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware memcached

    ② 创建目录/etc/swift

    sudo mkdir /etc/swift 

    ③ 从对象存储软件源仓库下载对象存储代理服务配置文件

    sudo curl -o /etc/swift/proxy-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/proxy-server.conf-sample?h=stable/mitaka

    ② 修改配置文件 sudo vi /etc/swift/proxy-server.conf
    [DEFAULT]处配置代理服务绑定端口、用户和目录:

    [DEFAULT]
    bind_port = 8080
    user = swift
    swift_dir = /etc/swift

    [pipeline:main] 处移除 tempurltempauth模块,并添加 authtokenkeystoneauth模块:

    [pipeline:main]
    pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server

    [app:proxy-server] 处启用账户自动创建:

    [app:proxy-server]
    use = egg:swift#proxy
    account_autocreate = True

    [filter:keystoneauth] 处设置操作用户角色:

    [filter:keystoneauth]
    use = egg:swift#keystoneauth
    operator_roles = admin,user

    [filter:authtoken] 处配置认证服务访问:
    注:SWIFT_PASS 替换为前面设计的实际密码。
    注:注释或删除 [filter:authtoken] 处其他默认设置。

    [filter:authtoken]
    paste.filter_factory = keystonemiddleware.auth_token:filter_factory
    
    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 = swift
    password = SWIFT_PASS
    delay_auth_decision = True

    [filter:cache] 处配置 Memcached 位置:

    [filter:cache]
    use = egg:swift#memcache
    memcache_servers = controller:11211

部署节点:ObjectStorage Node

注:每个对象存储节点都需执行以下步骤

  • 安装配置XFS
    ① 安装 XFS:

    sudo apt-get install xfsprogs rsync

    ② 将存储设备 /dev/sdb/dev/sdc格式化为 XFS 文件系统:

    sudo mkfs.xfs /dev/sdb
    sudo mkfs.xfs /dev/sdc

    ③ 创建挂载点目录:

    sudo mkdir -p /srv/node/sdb
    sudo mkdir -p /srv/node/sdc

    ④ 修改文件sudo vi /etc/fstab,添加如下信息:

    /dev/sdb /srv/node/sdb xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
    /dev/sdc /srv/node/sdc xfs noatime,nodiratime,nobarrier,logbufs=8 0 2

    ⑤ 挂载设备:

    sudo mount /srv/node/sdb
    sudo mount /srv/node/sdc

    ⑥ 新建或修改置文件 sudo vi /etc/rsyncd.conf,添加如下信息:
    注:将下面 MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址 10.0.0.5110.0.0.52

    uid = swift
    gid = swift
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    address = MANAGEMENT_INTERFACE_IP_ADDRESS
    
    [account]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/account.lock
    
    [container]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/container.lock
    
    [object]
    max connections = 2
    path = /srv/node/
    read only = False
    lock file = /var/lock/object.lock

    ⑦ 修改 sudo vi /etc/default/rsync,启用rsync 服务:

    RSYNC_ENABLE=true

    ⑧ 启动 rsync 服务:

    sudo service rsync start
  • 安装配置 Swift 服务组件
    ① 安装 swift 组件

    sudo apt-get install swift swift-account swift-container swift-object

    ② 从对象存储软件源仓库下载账户、容器和对象服务配置文件

    sudo curl -o /etc/swift/account-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/account-server.conf-sample?h=stable/mitaka
    sudo curl -o /etc/swift/container-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/container-server.conf-sample?h=stable/mitaka
    sudo curl -o /etc/swift/object-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/object-server.conf-sample?h=stable/mitaka

    ③ 修改配置文件 sudo vi /etc/swift/account-server.conf
    [DEFAULT]处配置绑定 IP 地址、绑定端口、用户、目录和挂载点:
    注:将下面 MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址 10.0.0.5110.0.0.52

    [DEFAULT]
    bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
    bind_port = 6002
    user = swift
    swift_dir = /etc/swift
    devices = /srv/node
    mount_check = True

    [pipeline:main] 处启用相关模块:

    [pipeline:main]
    pipeline = healthcheck recon account-server

    [filter:recon] 处配置 recon(meters) 缓存:

    [filter:recon]
    use = egg:swift#recon
    recon_cache_path = /var/cache/swift

    ④ 修改配置文件 sudo vi /etc/swift/container-server.conf
    [DEFAULT]处配置绑定 IP 地址、绑定端口、用户、目录和挂载点:
    注:将下面 MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址 10.0.0.5110.0.0.52

    [DEFAULT]
    bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
    bind_port = 6001
    user = swift
    swift_dir = /etc/swift
    devices = /srv/node
    mount_check = True

    [pipeline:main] 处启用相关模块:

    [pipeline:main]
    pipeline = healthcheck recon container-server

    [filter:recon] 处配置 recon(meters) 缓存:

    [filter:recon]
    use = egg:swift#recon
    recon_cache_path = /var/cache/swift

    ⑤ 修改配置文件 sudo vi /etc/swift/object-server.conf
    [DEFAULT]处配置绑定 IP 地址、绑定端口、用户、目录和挂载点:
    注:将下面 MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址 10.0.0.5110.0.0.52

    [DEFAULT]
    bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
    bind_port = 6000
    user = swift
    swift_dir = /etc/swift
    devices = /srv/node
    mount_check = True

    [pipeline:main] 处启用相关模块:

    [pipeline:main]
    pipeline = healthcheck recon object-server

    [filter:recon] 处配置 recon(meters) 缓存:

    [filter:recon]
    use = egg:swift#recon
    recon_cache_path = /var/cache/swift
    recon_lock_path = /var/lock

    ⑥ 修改挂载点目录所有者:

    sudo chown -R swift:swift /srv/node

    ⑦ 创建 recon 目录,并修改所有者:

    sudo mkdir -p /var/cache/swift
    sudo chown -R root:swift /var/cache/swift
    sudo chmod -R 775 /var/cache/swift

部署节点:Controller Node

创建和分发初始环

  • 创建账户环
    ① 将当前工作目录设置为/etc/swift

    cd /etc/swift

    ② 创建基础的 account.builder 文件:

    sudo swift-ring-builder account.builder create 10 3 1

    ③ 将每个对象存储节点设备添加到账户环:

    sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6002 --device DEVICE_NAME --weight DEVICE_WEIGHT

    注:STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址,将 DEVICE_NAME 替换为对应的对象存储节点上的存储设备名称,将 DEVICE_WEIGHT 替换为实际权重值。
    注:重复以上命令,将每个存储节点上的每个存储设备添加到账户环。
    例如,本文采用如下命令将每个存储节点上的每个存储设备添加到账户环:

    sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdb --weight 100
    sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdc --weight 100
    sudo swift-ring-builder account.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6002 --device sdb --weight 100
    sudo swift-ring-builder account.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6002 --device sdc --weight 100

    ④ 验证账户环内容:

    sudo swift-ring-builder account.builder

    ⑤ 平衡账户环:

    sudo swift-ring-builder account.builder rebalance
  • 创建容器环
    ① 将当前工作目录设置为/etc/swift

    cd /etc/swift

    ② 创建基础的 container.builder 文件:

    sudo swift-ring-builder container.builder create 10 3 1

    ③ 将每个对象存储节点设备添加到容器环:

    sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6001 --device DEVICE_NAME --weight DEVICE_WEIGHT

    注:STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址,将 DEVICE_NAME 替换为对应的对象存储节点上的存储设备名称,将 DEVICE_WEIGHT 替换为实际权重值。
    注:重复以上命令,将每个存储节点上的每个存储设备添加到容器环。
    例如,本文采用如下命令将每个存储节点上的每个存储设备添加到容器环:

    sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdb --weight 100
    sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdc --weight 100
    sudo swift-ring-builder container.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6001 --device sdb --weight 100
    sudo swift-ring-builder container.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6001 --device sdc --weight 100

    ④ 验证容器环内容:

    sudo swift-ring-builder container.builder

    ⑤ 平衡容器环:

    sudo swift-ring-builder container.builder rebalance
  • 创建对象环
    ① 将当前工作目录设置为/etc/swift

    cd /etc/swift

    ② 创建基础的 object.builder 文件:

    sudo swift-ring-builder object.builder create 10 3 1

    ③ 将每个对象存储节点设备添加到对象环:

    sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6000 --device DEVICE_NAME --weight DEVICE_WEIGHT

    注:STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS 替换为对象存储节点 Management Network 网络接口地址,将 DEVICE_NAME 替换为对应的对象存储节点上的存储设备名称,将 DEVICE_WEIGHT 替换为实际权重值。
    注:重复以上命令,将每个存储节点上的每个存储设备添加到对象环。
    例如,本文采用如下命令将每个存储节点上的每个存储设备添加到对象环:

    sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdb --weight 100
    sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdc --weight 100
    sudo swift-ring-builder object.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6000 --device sdb --weight 100
    sudo swift-ring-builder object.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6000 --device sdc --weight 100

    ④ 验证对象环内容:

    sudo swift-ring-builder object.builder

    ⑤ 平衡对象环:

    sudo swift-ring-builder object.builder rebalance
  • 分发环配置文件
    将环配置文件 account.ring.gzcontainer.ring.gzobject.ring.gz拷贝到每个对象存储节点以及代理服务节点的 /etc/swift 目录。在每个 存储节点 代理服务节点 执行以下命令:

    sudo scp controller@controller:/etc/swift/*.ring.gz /etc/swift

    注:本文将 swift-proxy 部署到 controller 节点,因此无需再讲环配置文件拷贝到代理服务节点的 /etc/swift 目录。若对象存储代理服务 swift-proxy 部署在其他节点,则需将环配置文件拷贝到该代理服务节点 /etc/swift 目录下。

  • 添加、分发 swift 配置文件
    ① 从对象存储软件源仓库下载配置文件/etc/swift/swift.conf

    sudo curl -o /etc/swift/swift.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/swift.conf-sample?h=stable/mitaka

    ② 修改配置文件 sudo vi /etc/swift/swift.conf
    [swift-hash]处哈希路径前缀和后缀
    注:HASH_PATH_PREFIXHASH_PATH_SUFFIX替换为前面设计的唯一值。

    [swift-hash]
    swift_hash_path_suffix = HASH_PATH_SUFFIX
    swift_hash_path_prefix = HASH_PATH_PREFIX

    [storage-policy:0] 处设置默认存储策略:

    [storage-policy:0]
    name = Policy-0
    default = yes

    ③ 分发 swift 配置文件
    /etc/swift/swift.conf 拷贝到每个对象存储节点以及代理服务节点的 /etc/swift 目录。在每个 存储节点 代理服务节点 执行以下命令:

    sudo scp controller@controller:/etc/swift/swift.conf /etc/swift

    ④ 在所有存储节点和代理服务节点上设置 swift 配置目录所有权

    sudo chown -R root:swift /etc/swift
  • 重启服务,完成安装
    ① 在 Controller 节点和其他 Swift 代理服务节点上执行:

    sudo service memcached restart
    sudo service swift-proxy restart

    ② 在所有对象存储节点上执行:
    注:忽略其他未配置的服务报错信息

    sudo swift-init all start
  • 验证对象存储服务是否安装配置正确
    ① 在 Controller 节点上设置 OpenStack 示例用户 demo 的环境变量

    source ~/.openstack/.demo-openrc

    ② 查看对象存储服务状态

    controller@controller:~$ swift stat
        Account: AUTH_4bedcb61d9eb47cfb5fc79ea4a1a03b0
     Containers: 0
        Objects: 0
          Bytes: 0
    X-Put-Timestamp: 1465023102.25072
    X-Timestamp: 1465023102.25072
     X-Trans-Id: tx4a14ec8f1e6c46179a9b8-0057527a7d
    Content-Type: text/plain; charset=utf-8

    ③ 创建一个容器container1

    openstack container create container1

    ④ 上传一个测试文件到容器 container1
    注:FILE 替换为任意本地测试文件名

    openstack object create container1 FILE

    ⑤ 列出容器 container1 中的文件:

    openstack object list container1

    ⑥ 从容器 container1 下载文件:

    openstack object save container1 FILE

4.10 编排服务配置(Orchestration Service – Heat)

提供一种基于模板的编排,用于创建和管理云资源。

部署节点:Controller Node

  • 在 MariaDB(MySQL)中创建数据库 heat
    ① 以root 用户登录 MySQL

    mysql -u root -p

    ② 创建 heat 数据库

    CREATE DATABASE heat;

    ③ 授予 heat 数据库适当权限
    注:HEAT_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
    GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';
  • 创建 Orchestration 服务实体和 API 路径
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 在 OpenStack 中创建一个 heat 用户

    openstack user create --domain default --password-prompt heat

    输入用户 heat 的密码 HEAT_PASS(将HEAT_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 heat 用户

    openstack role add --project service --user heat admin

    ④ 创建 heatheat-cfn服务实体

    openstack service create --name heat --description "Orchestration" orchestration
    openstack service create --name heat-cfn --description "Orchestration"  cloudformation

    ⑤ 创建 Orchestration 服务 API 路径

    openstack endpoint create --region RegionOne orchestration public http://controller:8004/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne orchestration internal http://controller:8004/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne orchestration admin http://controller:8004/v1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne cloudformation public http://controller:8000/v1
    openstack endpoint create --region RegionOne cloudformation internal http://controller:8000/v1
    openstack endpoint create --region RegionOne cloudformation admin http://controller:8000/v1
  • 创建 Orchestration 管理域、用户、角色
    ① 创建 heat

    openstack domain create --description "Stack projects and users" heat

    ② 创建 heat_domain_admin 用户

    openstack user create --domain heat --password-prompt heat_domain_admin

    输入 heat_domain_admin 用户密码 HEAT_DOMAIN_PASS(将HEAT_DOMAIN_PASS 替换为前面设计的实际密码)。
    ③ 将 admin 角色授予 heat_domain_admin 用户

    openstack role add --domain heat --user-domain heat --user heat_domain_admin admin

    ④ 创建 heat_stack_owner 角色

    openstack role create heat_stack_owner

    ⑤ 将角色 heat_stack_owner 授予示例项目和用户

    openstack role add --project demo --user demo heat_stack_owner

    注:必须将 heat_stack_owner 角色授予管理 stack 的每一个用户。
    ⑥ 创建 heat_stack_user 角色

    openstack role create heat_stack_user

    注: Orchestration 服务自动将角色 heat_stack_user 授予 stack 部署期间创建的用户,为了避免冲突,不要讲角色 heat_stack_owner 授予任何用户。

  • 安装和配置 Orchestration 服务组件
    ① 安装 Orchestration

    sudo apt-get install heat-api heat-api-cfn heat-engine

    ② 修改配置文件 sudo vi /etc/heat/heat.conf
    注:HEAT_DBPASSHEAT_PASSHEAT_DOMAIN_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据访问连接:

    [database]
    connection = mysql+pymysql://heat:HEAT_DBPASS@controller/heat

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [keystone_authtoken][trustee][clients_keystone][ec2authtoken]处配置认证服务访问:

    [DEFAULT]
    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 = heat
    password = HEAT_PASS
    
    [trustee]
    auth_plugin = password
    auth_url = http://controller:35357
    username = heat
    password = HEAT_PASS
    user_domain_name = default
    
    [clients_keystone]
    auth_uri = http://controller:35357
    
    [ec2authtoken]
    auth_uri = http://controller:5000

    [DEFAULT] 处配置元数据和等待条件 URLs

    [DEFAULT]
    heat_metadata_server_url = http://controller:8000
    heat_waitcondition_server_url = http://controller:8000/v1/waitcondition

    [DEFAULT] 处配置 stack 域和管理证书:

    [DEFAULT]
    stack_domain_admin = heat_domain_admin
    stack_domain_admin_password = HEAT_DOMAIN_PASS
    stack_user_domain_name = heat

    ③ 将配置信息写入 Orchestration 服务数据库heat

    su root
    su -s /bin/sh -c "heat-manage db_sync" heat
  • 重启服务,完成安装

    sudo service heat-api restart
    sudo service heat-api-cfn restart
    sudo service heat-engine restart
  • 验证编排服务是否安装配置正确
    ① 在 Controller 节点上设置 OpenStack 示例用户 admin 的环境变量

    source ~/.openstack/.admin-openrc

    ② 列出服务组件,验证每个进程是否成功启动和注册

    openstack orchestration service list

4.11 计量服务配置(Telemetry Service – Ceilometer)

提供监控和计量功能,提供 OpenStack 云计算的账单,性能指标,扩展性和满意度的调查表。

4.11.1 Telemetry Data Collection Service (Ceilometer)

部署节点:Controller Node

  • 为 Telemetry 服务创建数据库、服务证书、API 端点
    ① 在 MongoDB 中创建数据库 ceilometer
    注:CEILOMETER_DBPASS 替换为前面设计的实际密码

    sudo mongo --host controller --eval '
    db = db.getSiblingDB("ceilometer");
    db.createUser({user: "ceilometer",
    pwd: "CEILOMETER_DBPASS",
    roles: ["readWrite", "dbAdmin" ]})'

    注:若执行失败,则可能是未授权插入用户,需要在 /etc/mongodb.conf 中临时注释掉授权项 auth,然后重启 MongoDB 数据库,重新执行命令。
    ② 设置 OpenStack 中admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ③ 在 OpenStack 中创建一个 ceilometer 用户

    openstack user create --domain default --password-prompt ceilometer

    输入用户 ceilometer 的密码 CEILOMETER_PASS(将CEILOMETER_PASS 替换为前面设计的实际密码)。
    ④ 将 admin 角色授予 ceilometer 用户

    openstack role add --project service --user ceilometer admin

    ⑤ 创建 ceilometer 服务实体

    openstack service create --name ceilometer --description "Telemetry" metering

    ⑥ 创建 Telemetry 服务 API 路径

    openstack endpoint create --region RegionOne metering public http://controller:8777
    openstack endpoint create --region RegionOne metering internal http://controller:8777
    openstack endpoint create --region RegionOne metering admin http://controller:8777
  • 安装和配置 Telemetry 服务组件
    ① 安装 Telemetry

    sudo apt-get install ceilometer-api ceilometer-collector ceilometer-agent-central ceilometer-agent-notification python-ceilometerclient

    ② 修改配置文件 sudo vi /etc/ceilometer/ceilometer.conf
    注:CEILOMETER_DBPASSCEILOMETER_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据访问连接:

    [database]
    connection = mongodb://ceilometer:CEILOMETER_DBPASS@controller:27017/ceilometer

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置认证服务访问:

    [DEFAULT]
    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 = ceilometer
    password = CEILOMETER_PASS

    [service_credentials] 处配置服务证书

    [service_credentials]
    auth_type = password
    auth_url = http://controller:5000/v3
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = ceilometer
    password = CEILOMETER_PASS
    interface = internalURL
    region_name = RegionOne
  • 重启服务,完成安装

    sudo service ceilometer-agent-central restart
    sudo service ceilometer-agent-notification restart
    sudo service ceilometer-api restart
    sudo service ceilometer-collector restart

部署节点:Controller Node

  • 启用镜像服务计量
    ① 修改配置文件 sudo vi /etc/glance/glance-api.confsudo vi /etc/glance/glance-registry.conf
    [DEFAULT][oslo_messaging_notifications][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_notifications]
    driver = messagingv2
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    ② 重启服务,完成安装

    sudo service glance-registry restart
    sudo service glance-api restart

部署节点:Compute Node

  • 启用计算服务计量
    ① 在 Compute 节点上安装计量服务代理

    sudo apt-get install ceilometer-agent-compute

    ② 修改配置文件 sudo vi /etc/ceilometer/ceilometer.conf
    注:RABBIT_PASSCEILOMETER_PASS替换为前面设计的实际密码
    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置认证服务访问:

    [DEFAULT]
    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 = ceilometer
    password = CEILOMETER_PASS

    [service_credentials] 处配置服务证书

    [service_credentials]
    auth_url = http://controller:5000/v2.0
    username = ceilometer
    project_name = service
    password = CEILOMETER_PASS
    interface = internalURL
    region_name = RegionOne
  • 配置计算服务使用计量服务
    修改配置文件 sudo vi /etc/nova/nova.conf,在[DEFAULT] 处配置通知信息:

    [DEFAULT]
    instance_usage_audit = True
    instance_usage_audit_period = hour
    notify_on_state_change = vm_and_task_state
    notification_driver = messagingv2
  • 重启服务,完成安装

    sudo service ceilometer-agent-compute restart
    sudo service nova-compute restart
  • 启用块存储服务计量
    ① 修改配置文件 sudo vi /etc/cinder/cinder.conf
    注:ControllerBlockStorage节点上都要修改。
    [oslo_messaging_notifications] 处配置消息通知驱动

    [oslo_messaging_notifications]
    driver = messagingv2

    ② 在 Controller 节点上重启服务

    sudo service cinder-api restart
    sudo service cinder-scheduler restart

    ③ 在 BlockStorage 节点上重启服务

    sudo service cinder-volume restart
  • 启用对象存储服务计量
    计量服务通过轮询和通知相结合的方式收集对象存储计量信息。
    ① 在 Controller 节点上创建角色 ResellerAdmin,并将该角色授予ceilometer 用户

    source ~/.openstack/.admin-openrc
    openstack role create ResellerAdmin
    openstack role add --project service --user ceilometer ResellerAdmin

    ② 安装计量服务中间件

    sudo apt-get install python-ceilometermiddleware

    ③ 修改配置文件 sudo vi /etc/swift/proxy-server.conf
    注:该步骤需要在 Controller 节点和其他运行对象存储代理服务的节点上执行。
    [filter:keystoneauth] 处添加 ResellerAdmin 角色:

    [filter:keystoneauth]
    operator_roles = admin, user, ResellerAdmin

    [pipeline:main] 处添加 ceilometer`:

    [pipeline:main]
    pipeline = ceilometer catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server

    [filter:ceilometer] 处配置通知服务:
    注:RABBIT_PASS 替换为前面设计的实际密码

    [filter:ceilometer]
    paste.filter_factory = ceilometermiddleware.swift:filter_factory
    
    control_exchange = swift
    url = rabbit://openstack:RABBIT_PASS@controller:5672/
    driver = messagingv2
    topic = notifications
    log_level = WARN

    ④ 重启对象存储代理服务

    sudo service swift-proxy restart

4.11.2 Telemetry Alarming Service (Aodh)

部署节点:Controller

  • 为 Telemetry Alarming 服务创建数据库、服务证书、API 端点
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建 aodh 数据库

    CREATE DATABASE aodh;

    ③ 授予 aodh 数据库适当权限
    注:AODH_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON aodh.* TO 'aodh'@'localhost' IDENTIFIED BY 'AODH_DBPASS';
    GRANT ALL PRIVILEGES ON aodh.* TO 'aodh'@'%' IDENTIFIED BY 'AODH_DBPASS';

    ④ 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ⑤ 在 OpenStack 中创建一个 aodh 用户

    openstack user create --domain default --password-prompt aodh

    输入用户 aodh 的密码 AODH_PASS(将AODH_PASS 替换为前面设计的实际密码)。
    ⑥ 将 admin 角色授予 aodh 用户

    openstack role add --project service --user aodh admin

    ⑦ 创建 aodh 服务实体

    openstack service create --name aodh --description "Telemetry" alarming

    ⑧ 创建 Alarming 服务 API 路径

    openstack endpoint create --region RegionOne alarming public http://controller:8042
    openstack endpoint create --region RegionOne alarming internal http://controller:8042
    openstack endpoint create --region RegionOne alarming admin http://controller:8042
  • 安装配置 Telemetry Alarming 服务组件
    ① 安装组件

    sudo apt-get install aodh-api aodh-evaluator aodh-notifier aodh-listener aodh-expirer python-ceilometerclient

    ② 修改配置文件 sudo vi /etc/aodh/aodh.conf
    注:AODH_DBPASSAODH_PASSRABBIT_PASS替换为前面设计的实际密码。
    [database] 处配置数据访问连接:

    [database]
    connection = mysql+pymysql://aodh:AODH_DBPASS@controller/aodh

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [DEFAULT][keystone_authtoken]处配置认证服务访问:

    [DEFAULT]
    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 = aodh
    password = AODH_PASS

    [service_credentials] 处配置服务证书

    [service_credentials]
    auth_type = password
    auth_url = http://controller:5000/v3
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = aodh
    password = AODH_PASS
    interface = internalURL
    region_name = RegionOne

    ③ 修改配置文件 sudo vi /etc/aodh/api_paste.ini
    修改 [filter:authtoken] 如下:

    [filter:authtoken]
    oslo_config_project = aodh

    ④ 重启 Alarming 服务

    sudo service aodh-api restart
    sudo service aodh-evaluator restart
    sudo service aodh-notifier restart
    sudo service aodh-listener restart
  • 验证 Telemetry 服务是否安装配置正确
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 列出可用计量信息

    ceilometer meter-list`

    ③ 利用镜像服务下载镜像CirrOS

    IMAGE_ID=$(glance image-list | grep 'cirros' | awk '{print $2}')
    glance image-download $IMAGE_ID > /tmp/cirros.img

    ④ 重新列出可用计量信息,验证上一步镜像下载计量信息

    ceilometer meter-list

    ⑤ 从 image.download meter 中检索用量统计信息

    ceilometer statistics -m image.download -p 60

    ⑥ 删除下载的临时测试镜像

    sudo rm /tmp/cirros.img

4.12 数据库服务配置(Database Service – Trove)

4.12.1 Database Service(Trove)

部署节点:Controller

  • 为 Database 服务创建数据库、服务证书、API 端点
    ① 以 root 用户登录 MySQL

    mysql -u root -p

    ② 创建 trove 数据库

    CREATE DATABASE trove;

    ③ 授予 trove 数据库适当权限
    注:TROVE_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON trove.* TO 'trove'@'localhost' IDENTIFIED BY 'TROVE_DBPASS';
    GRANT ALL PRIVILEGES ON trove.* TO 'trove'@'%' IDENTIFIED BY 'TROVE_DBPASS';

    ④ 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ⑤ 在 OpenStack 中创建一个 trove 用户

    openstack user create --domain default --password-prompt trove

    输入用户 trove 的密码 TROVE_PASS(将TROVE_PASS 替换为前面设计的实际密码)。
    ⑥ 将 admin 角色授予 trove 用户

    openstack role add --project service --user trove admin

    ⑦ 创建 trove 服务实体

    openstack service create --name trove --description "Database" database

    ⑧ 创建 Database 服务 API 路径

    openstack endpoint create --region RegionOne database public http://controller:8779/v1.0/%\(tenant_id\)s
    openstack endpoint create --region RegionOne database internal http://controller:8779/v1.0/%\(tenant_id\)s
    openstack endpoint create --region RegionOne database admin http://controller:8779/v1.0/%\(tenant_id\)s
  • 安装配置 Database 服务组件
    ① 安装组件

    sudo apt-get update
    sudo apt-get install python-trove python-troveclient python-glanceclient trove-common trove-api trove-taskmanager trove-conductor

    ② 在目录 /etc/trove 下,修改文件 trove.conftrove-taskmanager.conftrove-conductor.conf,对于每个文件,执行下面步骤。
    注:TROVE_DBPASSRABBIT_PASS替换为前面设计的实际密码
    [DEFAULT][database]处修改如下项的值:

    [DEFAULT]
    log_dir = /var/log/trove
    trove_auth_url = http://controller:5000/v2.0
    nova_compute_url = http://controller:8774/v2
    cinder_url = http://controller:8776/v1
    swift_url = http://controller:8080/v1/AUTH_
    notifier_queue_hostname = controller
    
    [database]
    connection = mysql://trove:TROVE_DBPASS@controller/trove

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    ③ 检查 api-paste.ini 是否在 /etc/trove 目录下

    ll /etc/trove

    ④ 修改配置文件 sudo vi /etc/trove/trove.conf,检查确认下面所列设置项的值。
    注:TROVE_PASS 替换为前面设计的实际密码

    [DEFAULT]
    auth_strategy = keystone
    add_addresses = True
    network_label_regex = .*
    api_paste_config = /etc/trove/api-paste.ini
    
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_url = http://controller:35357
    auth_type = password
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = trove
    password = TROVE_PASS

    ⑤ 修改配置文件 sudo vi /etc/trove/trove-taskmanager.conf,检查确认下面所列设置项的值。
    注:ADMIN_PASS 替换为前面设计的实际密码

    [DEFAULT]
    nova_proxy_admin_user = admin
    nova_proxy_admin_pass = ADMIN_PASS
    nova_proxy_admin_tenant_name = service
    taskmanager_manager = trove.taskmanager.manager.Manager

    ⑥ 修改配置文件 sudo vi /etc/trove/trove-guestagent.conf,检查确认下面所列设置项的值。
    注:RABBIT_PASSADMIN_PASS替换为前面设计的实际密码

    rabbit_host = controller
    rabbit_password = RABBIT_PASS
    nova_proxy_admin_user = admin
    nova_proxy_admin_pass = ADMIN_PASS
    nova_proxy_admin_tenant_name = service
    trove_auth_url = http://controller:35357/v2.0

    ⑦ 将配置信息写入 trove 数据库

    su root
    su -s /bin/sh -c "trove-manage db_sync" trove

    注:若报错:

    InternalError: (pymysql.err.InternalError) (1832, u"Cannot change column'datastore_version_id': used in a foreign key constraint'instances_ibfk_1'") [SQL: u'\nALTER TABLE instances CHANGE COLUMN datastore_version_id datastore_version_id VARCHAR(36) NOT NULL']

    原因是 MariaDB 10.0+ 中对外键约束列变更时要求更严。一种变通的解决方案如下:
    首先,关闭外键约束检查功能:

    mysql -uroot -p
    use trove;
    SET GLOBAL foreign_key_checks=0;

    然后,重新执行上述命令。最后,在开启外键约束检查功能。

    mysql -uroot -p
    use trove;
    SET GLOBAL foreign_key_checks=1;

    参考链接:https://bugs.launchpad.net/trove/+bug/1473226
    ⑧ 重启服务完成安装
    由于 Ubuntu 安装包存在一个 BUG,需要修改 /etc/init/trove-taskmanager.conf/etc/init/trove-conductor.conf文件。
    在上述两个文件中,分别找到如下位置:

    exec start-stop-daemon --start --chdir /var/lib/trove \
        --chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-taskmanager.pid \
        --exec /usr/bin/trove-taskmanager -- ${DAEMON_ARGS}

    注意:上述参数中缺少--config-file(或者参数配置文件路径有误),对两个文件应修改如下:

    exec start-stop-daemon --start --chdir /var/lib/trove \
        --chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-taskmanager.pid \
        --exec /usr/bin/trove-taskmanager -- \
        --config-file=/etc/trove/trove-taskmanager.conf ${DAEMON_ARGS}
    exec start-stop-daemon --start --chdir /var/lib/trove \
        --chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-conductor.pid \
        --exec /usr/bin/trove-conductor -- \
        --config-file=/etc/trove/trove-conductor.conf ${DAEMON_ARGS}

    最后,重启数据库服务:

    sudo service trove-api restart
    sudo service trove-taskmanager restart
    sudo service trove-conductor restart
  • 验证 Database 服务是否安装配置正确
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 列出数据库信息

    trove list

    ③ 添加数据存储到 trove
    选择一个数据库类型,如 MySQLMongoDB,创建一个trove 镜像。
    参考链接:
    Building Guest Images for OpenStack Trove
    OpenStack Trove 专用镜像制作
    上传镜像到 Glance:

    glance image-create --name "mysqlTest" --disk-format qcow2 --container-format bare --file mysql-5.6.qcow2

    创建一个数据存储:

    su root
    su -s /bin/sh -c "trove-manage --config-file /etc/trove/trove.conf datastore_update mysql''" trove

    ④ 使用新的镜像更新数据存储

    su -s /bin/sh -c "trove-manage --config-file /etc/trove/trove.conf datastore_version_update mysql mysql-5.6 mysql glance_image_ID'' 1" trove

    ⑤ 创建一个数据库实例

4.12.2 Trove Dashboard

参考链接:https://github.com/openstack/trove-dashboard

  • 安装 Trove Dashboard
    查看列表:http://tarballs.openstack.org/trove-dashboard

    sudo pip install 'http://tarballs.openstack.org/trove-dashboard/trove-dashboard-stable-mitaka.tar.gz'
  • Horizon 中启用 Trove Dashboard
    查看 Trove Dashboard 安装路径:find /usr -name trove_dashboard

    cd /usr/local/lib/python2.7/dist-packages/trove_dashboard
    sudo cp ./enabled/_17*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
  • 重新加载Apache Web Server

    sudo service apache2 reload

4.13 数据处理服务配置(Data Processing Service – Sahara)

4.13.1 Data Processing Service(Sahara)

部署节点:Controller

  • 创建数据库 sahara
    ① 以root 用户登录 MySQL

    mysql -u root -p

    ② 创建 sahara 数据库

    CREATE DATABASE sahara;

    ③ 授予 CREATE DATABASE sahara; 数据库适当权限
    注:SAHARA_DBPASS 替换为前面设计的实际密码

    GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'localhost' IDENTIFIED BY 'SAHARA_DBPASS';
    GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'%' IDENTIFIED BY 'SAHARA_DBPASS';

    ④ 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ⑤ 在 OpenStack 中创建一个 sahara 用户

    openstack user create --domain default --password-prompt sahara

    输入用户 sahara 的密码 SAHARA_PASS(将SAHARA_PASS 替换为前面设计的实际密码)。
    ⑥ 将 admin 角色授予 sahara 用户

    openstack role add --project service --user sahara admin

    ⑦ 创建 Sahara Data Processing 服务实体sahara

    openstack service create --name sahara --description "Sahara Data Processing" data-processing

    ⑧ 创建 Sahara Data Processing 服务 API 路径

    openstack endpoint create --region RegionOne data-processing public http://controller:8386/v1.1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne data-processing internal http://controller:8386/v1.1/%\(tenant_id\)s
    openstack endpoint create --region RegionOne data-processing admin http://controller:8386/v1.1/%\(tenant_id\)s
  • 安装配置sahara
    ① 安装sahara

    sudo apt-get install sahara

    ① 修改配置文件 sudo vi /etc/sahara/sahara.conf
    注:SAHARA_DBPASSSAHARA_PASS替换为前面设计的实际密码
    [database] 处配置数据库连接:

    [database]
    connection = mysql://sahara:SAHARA_DBPASS@controller/sahara

    [DEFAULT][keystone_authtoken][paste_deploy]处,配置身份服务访问:

    [DEFAULT]
    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 = sahara
    password = SAHARA_PASS
    identity_uri = http://controller:35357
    admin_tenant_name = service
    admin_user = sahara
    admin_password = SAHARA_PASS
    
    [paste_deploy]
    flavor = keystone

    [DEFAULT] 处配置网络服务:

    [DEFAULT]
    use_neutron = true
    use_namespaces=True
    use_rootwrap=True
    rootwrap_command='sudo sahara-rootwrap /etc/sahara/rootwrap.conf'
    use_floating_ips = true
    verbose = true
    log_file = sahara.log
    log_dir = /var/log/sahara

    [oslo_messaging_notifications] 处配置通知服务:

    [oslo_messaging_notifications]
    enable = true
    driver = messaging

    [oslo_concurrency] 处配置lock_path

    [oslo_concurrency]
    lock_path = /var/lib/sahara/tmp

    [DEFAULT][oslo_messaging_rabbit]处配置 RabbitMQ 消息队列访问:
    注:RABBIT_PASS 替换为前面设计的实际密码

    [DEFAULT]
    rpc_backend = rabbit
    
    [oslo_messaging_rabbit]
    rabbit_host = controller
    rabbit_userid = openstack
    rabbit_password = RABBIT_PASS

    [infrastructure_engine] 处配置编排服务:

    [DEFAULT]
    infrastructure_engine = heat

    [service_credentials] 处添加如下内容:

    [service_credentials]
    auth_type = password
    auth_url = http://controller:5000/v3
    project_domain_name = default
    user_domain_name = default
    project_name = service
    username = sahara
    password = SAHARA_PASS
    interface = internalURL
    region_name = RegionOne

    ② 配置 MySQLsudo vi /etc/mysql/mariadb.conf.d/openstack.cnf,添加如下内容:

    [mysqld]
    max_allowed_packet = 256M

    重启数据库:

    sudo service mysql restart

    ③ 将配置写入数据库:

    sudo sahara-db-manage --config-file /etc/sahara/sahara.conf upgrade head

    ④ 启动 sahara 服务

    sudo service sahara-api start
    sudo service sahara-engine start

4.13.2 Sahara Dashboard

参考链接:https://github.com/openstack/sahara-dashboard

  • 安装 Sahara Dashboard
    查看列表:http://tarballs.openstack.org/sahara-dashboard

    sudo pip install 'http://tarballs.openstack.org/sahara-dashboard/sahara-dashboard-stable-mitaka.tar.gz'
  • Horizon 中启用 Sahara Dashboard
    查看 sahara Dashboard 安装路径:find /usr -name sahara_dashboard

    cd /usr/local/lib/python2.7/dist-packages/sahara_dashboard
    sudo cp ./enabled/_18*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
  • 重新加载Apache Web Server

    sudo service apache2 reload

1. 硬件服务器

  • 名称:浪潮 P8000 工作站
  • CPU:Intel Xeon CPU E5-2620 v3 2.40GHz * 2,共 12 个物理核,24 个逻辑核
  • 内存:16 * 8 = 128GB
  • 存储:SAS 300GB * 3 = 900GB
  • 网络:千兆网卡 * 6
  • 操作系统:Windows Server 2012 R2 DataCenter

2. OpenStack 部署分析及规划

2.1 目的

  • 部署一个 OpenStack 测试环境
  • 硬件虚拟化,提供一个 Infrastructure-as-a-Service (IaaS) 解决方案
  • 基于 OpenStack 云计算平台提供 Hadoop MapReduce、Spark 等计算服务
  • 提供 OpenStack 开源云计算学习平台

2.2 OpenStack 网络模型选择

官方文档中 OpenStack 提供了两种网络模型架构

  • Provider Networks
    OpenStack 最简单的部署方式,主要利用 二层网络服务 (Layer-2 Services)(通过网桥和交换机连接不同网络)和VLAN 划分,其本质上是将 虚拟机网络 (Virtual Networks)通过 桥接 物理网络 (Physical Networks)并利用 物理网络 设施提供 三层网络服务 (Layer-3 Services);此外,通过DHCP 服务向虚拟网络实例提供 IP 地址。
    注:该方式不支持 私有自服务网络 (Private Self-Service Networks),如 三层路由服务(Layer-3 Routing Services)。
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • Self-Service Networks
    该方式和 Provider Networks 方式相比,通过诸如 VXLAN 方式在 自服务网络 中支持 三层路由服务
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    本文采用 Provider Networks 网络模型设计

2.3 OpenStack 节点硬件需求

OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.4 OpenStack 服务组件选择

本文选择 OpenStack Mitaka 版本

  • Compute-Focused OpenStack Design
    根据 OpenStack 官方文档,以计算服务为主的 OpenStack 私有云计算平台可选取以下组件:

    For a compute-focused OpenStack design architecture, the following components may be present:
    Identity (keystone)
    Dashboard (horizon)
    Compute (nova)
    Object Storage (swift)
    Image (glance)
    Networking (neutron)
    Orchestration (heat)
  • OpenStack 服务组件选择:
    注:本文选择MariaDB(MySQL 的一个分支,完全兼容 MySQL)开源数据库为 OpenStack 组件提供后端数据访问服务。

    Service Name Component Name Brief Description
    Identity Service Keystone 身份服务,提供单点集成方式管理身份认证、授权、服务目录服务
    Image Service Glance 镜像服务
    Compute Service Nova 计算服务
    Networking Service Neutron 网络服务
    Dashboard Service Horizon 仪表盘,访问 OpenStack 服务的图形化接口
    Block Storage Service Cinder 块存储服务
    Shared File Systems Service Manila 共享文件系统服务,用于文件存储
    Object Storage Service Swift 对象存储服务,用于对象存储和检索
    Orchestration Service Heat 编排服务,基于模板创建管理云资源
    Telemetry Data Collection Service Ceilometer 计量服务
    Telemetry Alarming Service Aodh 警报服务
    Database Service Trove 数据库服务,用于云部署关系型和非关系性数据库引擎
    Data Processing Service Sahara 数据处理服务,提供一个数据处理框架,如 Hadoop、Spark、Storm

2.5 OpenStack 节点网络设计

  • OpenStack 官方文档建议网络布局如下:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • 本文采用如下网络设计
    总共 3 个子网:
    ① 互联网连接 / 对外出口(External)
    ② Openstack 管理网络(Management)
    ③ VM 虚拟机内网连接(Data)
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    注:此外,本文将 Block Storage NodeObject Storage Node加入Management Network

2.6 OpenStack 节点服务器规划

  • 6台 Ubuntu 16.04 LTS:
    Cotroller:用于整个集群的控制,高可靠性要求。承载数据库(MySQL)、队列服务器(RabbitMQ)、和最终的 web 入口(Apache+Memcache)。设置一块虚拟硬盘。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    Network:网络控制节点,高网络吞吐型节点。设置一块虚拟硬盘。要求 3 网卡,eth0 接 External Network,eth1 接 Management Network 子网, eth2 接 Data Network 子网。
    Compute:计算节点,高内存 +CPU+IO 消耗型节点。设置一块虚拟硬盘。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网,eth2 接 Data Network 子网。
    BlockStorage:块存储节点,提供块存储和共享文件系统服务。设置三块虚拟硬盘,一块安装操作系统,一块用于块存储服务,一块用于共享文件系统服务。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    ObjectStorage:两个对象存储节点,提供对象存储服务。设置三块虚拟硬盘,一块安装操作系统,两块用于对象存储服务。要求网卡 eth0 接 External Network,eth1 接 Management Network 子网。
    注:上述为了方便管理,对每个节点都添加了 eth0 网络接口,实际生产环境请根据实际情况配置。

  • 服务器配置:

    Node CPU 内存 存储
    Controller 4 核 16GB 100GB
    Network 2 核 8GB 100GB
    Compute 16 核 64GB 300GB
    BlockStorage 2 核 8GB 100GB+100GB+100GB
    ObjectStorage1 2 核 8GB 100GB+100GB+100GB
    ObjectStorage2 2 核 8GB 100GB+100GB+100GB

    注:此处资源分配超出了实际物理资源,可根据实际分配资源。

  • 网络配置:

    Node eth0 eth1 eth2
      External Network Management Network Data Network
    Controller 192.168.1.11 10.0.0.11  
    Network 192.168.1.21 10.0.0.21 10.0.1.21
    Compute 192.168.1.31 10.0.0.31 10.0.1.31
    BlockStorage 192.168.1.41 10.0.0.41  
    ObjectStorage1 192.168.1.51 10.0.0.51  
    ObjectStorage2 192.168.1.52 10.0.0.52  
    Subnet Mask 255.255.255.0 255.255.255.0 255.255.255.0
    Gateway 192.168.1.1 10.0.0.1 10.0.1.1

    注:由于实际网络限制,External Network 通过虚拟网卡 192.168.1.1 共享主机网络来访问外网

  • 物理主机端口映射信息:

    物理机端口 虚拟机 IP 虚拟机端口 服务描述
    11122 192.168.1.11 22 Controller SSH 服务
    12122 192.168.1.21 22 Network SSH 服务
    13122 192.168.1.31 22 Compute SSH 服务
    14122 192.168.1.41 22 BlockStorage SSH 服务
    15122 192.168.1.51 22 ObjectStorage1 SSH 服务
    15222 192.168.1.52 22 ObjectStorage2 SSH 服务
    11180 192.168.1.11 80 OpenStack Dashboard 服务
    6080 192.168.1.11 6080 OpenStack Compute Service of Nova Proxy

    注:将虚拟机 SSH 端口映射到物理主机特定端口,以便外网通过物理主机访问虚拟机。
    物理主机端口:为方便管理,针对 SSH 服务,将物理主机映射端口设计如下,前三位表示对应虚拟机地址末两字节,最后两位表示对应虚拟机端口。

  • OpenStack 服务密码要求:
    根据 OpenStack 官方文档
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.7 OpenStack 各节点组件规划

  • 节点组件信息:

    Node OpenStack Service
    Controller mariadb-server、mongodb-server、rabbitmq-server、memcached、keystone、apache2、glance、nova-api、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler、neutron-server、neutron-plugin-ml2、horizon(dashboard)、cinder-api cinder-scheduler、manila-api、manila-scheduler、Python-manilaclient、swift、swift-proxy、python-swiftclient、heat-api、heat-api-cfn、heat-engine、ceilometer-api、ceilometer-collector、ceilometer-agent-central、ceilometer-agent-notification、python-ceilometerclient、python-ceilometermiddleware、aodh-api、aodh-evaluator、aodh-notifier、aodh-listener、aodh-expirer、python-trove、python-troveclient、python-glanceclient、trove-common、trove-api、trove-taskmanager、trove-conductor、sahara-api、sahara-engine、sahara-templates、sahara-wsgi-api
    Network neutron-linuxbridge-agent、neutron-l3-agent、neutron-dhcp-agent、neutron-metadata-agent
    Compute nova-compute、neutron-linuxbridge-agent、kvm、ceilometer-agent-compute
    BlockStorage lvm2、cinder-volume、manila-share、neutron-plugin-linuxbridge-agent
    ObjectStorage xfsprogs、rsync、swift、swift-account、swift-container、swift-object
  • 各节点功能可参考下图
    注:仅供参考理解,具体根据实际情况而定
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

2.8 用户、密码、地址、端口信息登记

注:
① 请提前设计好所需密码并登记存档,并及时登记用到的服务地址 & 端口信息。
② 根据实际情况,将下面 Password 列替换为实际密码。
(若为测试环境,建议密码采用一定规则,方便记忆,但数据库等服务密码不要包含一些特殊字符,如:/+@

  • OpenStack 节点主机用户 & 密码:

    Node Hostname User Password
    Controller controller controller your_password
    Controller controller root your_password
    Network network network your_password
    Network network root your_password
    Compute compute compute your_password
    Compute compute root your_password
    BlockStorage blockstorage blockstorage your_password
    BlockStorage blockstorage root your_password
    ObjectStorage1 objectstorage1 objectstorage your_password
    ObjectStorage1 objectstorage1 root your_password
    ObjectStorage2 objectstorage2 objectstorage your_password
    ObjectStorage2 objectstorage2 root your_password
  • OpenStack 服务用户 & 密码:

    Name User Password
    Database_PASS(MariaDB/MySQL) root your_password
    RABBIT_PASS openstack your_password
    KEYSTONE_DBPASS keystone your_password
    ADMIN_PASS admin your_password
    DEMO_PASS demo your_password
    GLANCE_DBPASS glance your_password
    GLANCE_PASS glance your_password
    NOVA_DBPASS nova your_password
    NOVA_PASS nova your_password
    NEUTRON_DBPASS nuetron your_password
    NEUTRON_PASS nuetron your_password
    METADATA_SECRET   your_password
    CINDER_DBPASS cinder your_password
    CINDER_PASS cinder your_password
    MANILA_DBPASS manila your_password
    MANILA_PASS manila your_password
    SWIFT_PASS swift your_password
    HASH_PATH_PREFIX   your_password
    HASH_PATH_SUFFIX   your_password
    HEAT_DBPASS heat your_password
    HEAT_PASS heat your_password
    HEAT_DOMAIN_PASS heat_domain_admin your_password
    CEILOMETER_DBPASS ceilometer your_password
    CEILOMETER_PASS ceilometer your_password
    AODH_DBPASS aodh your_password
    AODH_PASS aodh your_password
    TROVE_DBPASS trove your_password
    TROVE_PASS trove your_password
    SAHARA_DBPASS sahara your_password
    SAHARA_PASS sahara your_password
  • OpenStack 各节点服务地址 & 端口
    参考:Firewalls and default ports
    注:可执行 sudo netstat -tnlp 查看

    节点 IP 地址 端口 服务描述
    Controller 192.168.1.11 22 SSH
    Controller 10.0.0.11 3306 MariaDB(MySQL)
    Controller 10.0.0.11 27017 MongoDB
    Controller 10.0.0.11 5672、25672 RabbitMQ
    Controller 10.0.0.11 4369 Erlang 端口映射守护进程(Erlang Port Mapper Daemon)
    Controller 10.0.0.11 11211 Memcached
    Controller 10.0.0.11 35357 OpenStack Identity Service of Apache HTTP Server(Admin)
    Controller 10.0.0.11 5000 OpenStack Identity Service of Apache HTTP Server(User)
    Controller 10.0.0.11 9191 OpenStack Image Service of Glance Registry
    Controller 10.0.0.11 9292 OpenStack Image Service of Glance API
    Controller 10.0.0.11 8774、8775 OpenStack Compute Service of Nova API
    Controller 10.0.0.11 6080 OpenStack Compute Service of Nova Proxy
    Controller 10.0.0.11 9696 OpenStack Networking Service of Neutron Server
    Controller 10.0.0.11 80 OpenStack Dashboard Service of Apache HTTP Server
    Controller 10.0.0.11 8776 OpenStack Block Storage Service of Cinder API
    Controller 10.0.0.11 8786 OpenStack Shared File Systems Service of Manila API
    Controller 10.0.0.11 8080 OpenStack Object Storage Service of Swift Proxy
    Controller 10.0.0.11 8000 OpenStack Orchestration Service of Heat API (CloudFormation)
    Controller 10.0.0.11 8004 OpenStack Orchestration Service of Heat API
    Controller 10.0.0.11 8777 OpenStack Telemetry Alarming Service of Ceilometer API
    Controller 10.0.0.11 8042 OpenStack Telemetry Alarming Service of Aodh API
    Controller 10.0.0.11 8779 OpenStack Database Service of Trove API
    Controller 10.0.0.11 8386 OpenStack Data Processing Service of Sahara API
    Network 192.168.1.21 22 SSH
    Compute 192.168.1.31 22 SSH
    Compute 192.168.122.1 53 Libvirt Dnsmasq
    BlockStorage 192.168.1.41 22 SSH
    BlockStorage 10.0.0.41 3260 OpenStack Block Storage Service of Tgtd(iSCSI target 后台服务)
    ObjectStorage 192.168.1.51/52 22 SSH
    ObjectStorage 10.0.0.51/52 873 OpenStack Object Storage Service of Remote Sync
    ObjectStorage 10.0.0.51/52 6000 OpenStack Object Storage Service of Object
    ObjectStorage 10.0.0.51/52 6001 OpenStack Object Storage Service of Container
    ObjectStorage 10.0.0.51/52 6002 OpenStack Object Storage Service of Account

3. 环境准备

3.1 物理主机基本配置

  • 物理机基本配置
    ① 开启物理主机虚拟化功能
    ② 在物理主机上安装 VMware Workstation 12.1 Pro

  • VMware 虚拟机配置
    ① 配置虚拟机网络
    虚拟机网络连接方式图解:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    打开 VMware Workstation 虚拟网络编辑器,添加如下虚拟网卡:
    其中 VMnet0 用于配置 External Network,VMnet1 用于配置 Management Network 子网, VMnet2 用于配置 Data Network 子网。如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ② 创建虚拟机,按前面要求设置 CPU、内存大小,并新建网络适配器同时指定网络连接方式,各节点对应名称如下表:

    Node VMnet0 VMnet1 VMnet2
    Controller 网络适配器 网络适配器 2  
    Network 网络适配器 网络适配器 2 网络适配器 3
    Compute 网络适配器 网络适配器 2 网络适配器 3
    BlockStorage 网络适配器 网络适配器 2  
    ObjectStorage1 网络适配器 网络适配器 2  
    ObjectStorage2 网络适配器 网络适配器 2  

    注:虚拟机中添加网络适配器的顺序跟系统内默认网卡名 eth0eth1eth2 对应。
    ③ 开启虚拟机 CPU 虚拟化功能
    对于每个虚拟机,虚拟机设置–> 处理器设置–> 虚拟化引擎,选择Intel VT-x/EPT 或 AMD-V/RVI,如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ④ 各节点虚拟机配置如下图:
    Controller 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    Network 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    Compute 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    BlockStorage 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ObjectStorage1 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    ObjectStorage2 节点:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

3.2 节点系统安装

在 VMware 中创建虚拟机,安装 Ubuntu 16.04 LTS

  • 创建虚拟机,设置 CPU 核心数、内存大小、存储大小。
  • 添加两块(或三块)虚拟网卡
  • 加载 Ubuntu Server 16.04 LTS 系统镜像
  • 启动系统,选择时区、语言,设置主机名和用户名、密码。
  • Partition disks配置步骤:
    ① 单独设置分区 /dev/sda1,大小200MB,用于挂载/boot
    选择手动配置–> 选择硬盘–> 创建新的分区表–> 选择空闲空间–> 新建分区–> 设置大小 200MB–> 选择主分区–> 选择开始位置–> 设置文件系统格式 Ext4–> 设置挂载点/boot–> 设置分区。
    ② 设置 LVM,方便扩展存储,挂载/swap
    配置逻辑卷 LVM–> 将修改写入磁盘并配置 LVM–> 新建卷组–> 卷组名称:vg_system–> 按空格键选中剩余空闲空间 /dev/sda–> 将修改写入磁盘并配置 LVM–> 新建逻辑卷–> 选择卷组vg_system–> 逻辑卷名:lv_root–> 设置逻辑卷大小:91GB–> 新建逻辑卷–> 选择卷组vg_system–> 逻辑卷名:lv_swap–> 设置逻辑卷大小为剩余空间–> 完成。
    ③ 分别对每一个逻辑卷进行配置
    磁盘格式:lv_root 选择 ext4,lv_swap 选择 swap area。
    挂载点:lv_root 选择”/”。
    最后选择完成分区并将更改写入磁盘,点击确定即可。
  • 选择服务器默认安装软件包
    空格键选择 OpenSSH Server,方便使用 SSH 传输文件。
  • 安装 Grub。
    按照上述步骤,创建其他节点服务器并安装 Ubuntu 16.04 LTS 系统

3.3 节点系统基本环境配置

  • 启用 root 用户,设置 root 密码

    sudo passwd root
  • 为普通用户添加 sudo 权限
    只需修改 /etc/sudoers 文件
    切换到 root 用户,输入命令 su -,输入 root 用户密码。
    输入命令 vi /etc/sudoers 编辑 /etc/sudoers 文件,在下面内容下添加一行 your_username ALL=(ALL:ALL) ALL,输入w! 强制保存,退出 vi。

    
    # User privilege specification
    
    root    ALL=(ALL:ALL) ALL
    
    # controller
    
    controller ALL=(ALL:ALL) ALL

    注:如没有修改权限,则为 /etc/sudoers 文件添加写权限chmod u+w /etc/sudoers,修改后撤销权限chmod u-w /etc/sudoers

  • 修改网卡命名方式
    输入 ifconfig -a 查看,发现网卡名称由 udev 管理命名为 ens33ens38,为了方便,将网卡名称修改为上述表格所示 eth0eth1eth2
    sudo vi /etc/default/grub 把 /etc/default/grub 中

    GRUB_CMDLINE_LINUX_DEFAULT=""
    GRUB_CMDLINE_LINUX=""

    改成:

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

    ② 重新生成 grub 文件

    sudo update-grub
    sudo grub-mkconfig -o /boot/grub/grub.cfg  

    ③ 重启系统,发现网卡名称已经改回 eth0eth1eth2 命名格式。
    注:以上步骤在 Controller 节点、Compute 节点、Network 节点配置方法相同

  • 修改各节点网卡和 VMware 虚拟网卡绑定关系
    可选环节:若网卡和虚拟网卡绑定关系不同,可手动指定
    按照前面表格所示,修改各节点网卡名称为对应的 eth0eth1eth2
    以 Controller 节点为例
    将默认网卡名 eth0eth1修改为 eth0eth2

    sudo vi /etc/udev/rules.d/70-persistent-net.rules
    // 如无该文件,新建一个即可

    添加如下内容,其中 00:0c:29:a9:66:8c00:0c:29:a9:66:96为网卡 MAC,可执行 ifconfig -a 查看,根据情况自行设定:

    
    # eth0
    
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:8c", NAME="eth0"
    
    # eth2
    
    SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:96", NAME="eth2"

    保存并重启电脑 sudo reboot
    注:配置完成后,不能 虚拟机设置 --> 网络适配器 --> 高级 中点击生成 MAC,否则上面 MAC 地址需要修改配置。
    注:Compute 节点、Network 节点配置方法类似

  • 设置静态 IP/DNS
    以 Controller 节点为例
    ① 修改文件sudo vi /etc/network/interfaces,将默认生成的(下面内容可能没有,可能不一样,配置时视自己情况而定):

    auto ens33
    iface ens33 inet dhcp

    改为:

    
    #eth0 config (connect to internet)
    
    auto eth0
    iface eth0 inet static
    address 192.168.1.11 #IP 地址
    netmask 255.255.255.0 # 子网掩码
    gateway 192.168.1.1 # 网关
    dns-nameserver 192.168.1.1 #DNS
    
    
    # eth1 config (connect to openstack management network)
    
    auto eth1
    iface eth1 inet static
    address 10.0.0.11 #IP 地址
    netmask 255.255.255.0 # 子网掩码

    ② 重启网卡,使配置生效:

    sudo /etc/init.d/networking restart
    sudo service networking restart

    注:若找不到上述命令或重启无效可尝试下面命令:

    sudo ifdown eth0
    sudo ifdown eth1
    sudo ifup eth0
    sudo ifup eth1

    注:若提示ifdown: interface eth0 not configured,可换下面命令尝试:

    sudo ifconfig eth0 down
    sudo ifconfig eth1 down
    sudo ifconfig eth0 up
    sudo ifconfig eth1 up

    ③ 运行 ifconfig -a 查看网络配置信息。
    ④ 通过 ping www.baidu.com 测试能否正常访问外网。若不能,可 sudo reboot 重启节点试试。
    注:Compute 节点、Network 节点配置方法类似

  • 在物理主机中为各节点 SSH 连接配置端口映射
    可参考:Windows 下实现端口映射  http://www.linuxidc.com/Linux/2016-09/135489.htm
    以 Controller 节点为例
    ① 利用 Windows 自带的netsh 配置端口映射,打开 cmd 命令行,输入:
    注:下面 xxx.xxx.xxx.xxx 为物理主机实际 IP

    // 配置端口映射
    netsh interface portproxy add v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122 connectaddress=192.168.1.11 connectport=22
    // 或者
    netsh interface portproxy add v4tov4 listenport=11122 connectaddress=192.168.1.11 connectport=22
    
    // 查看已配置的端口映射
    netsh interface portproxy show v4tov4  // all
    
    侦听 ipv4:                 连接到 ipv4:
    
    地址            端口        地址            端口
    --------------- ----------  --------------- ----------
    xxx.xxx.xxx.xxx 11122       192.168.1.11     22
    *               11122       192.168.1.11     22
    
    // 删除端口映射
    netsh interface portproxy delete v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122
    netsh interface portproxy delete v4tov4 listenport=11122

    ② 在系统防火墙高级设置中配置入站规则
    新建规则–> 端口–> 特定本地端口:11122–> 允许连接–> 选择域 / 专用 / 公用–> 名称:VMware OpenStack Controller SSH、描述:用于 VMware 中 OpenStack 云计算平台 Controller 节点 SSH 连接
    ③ 配置完成后,可在外网主机,通过 Xshell 连接 Controller 节点, 如下图:
    :若 XShell 连接��败,提示Xshell no matching outgoing encryption,可升级 Xshell 版本, 在链接的属性(SSH–> 安全性) 的加密算法列表中选择 aes256-ctr,mac 加密列表中选择 hmac-sha2-256,保存即可。
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

注:其他节点配置方法类似

  • 配置 hosts 文件
    以 Controller 节点为例
    OpenStack 要求所有的节点主机之间都是通过 host 互信的,编辑所有节点主机的 /etc/hosts 文件,注意将 YOUR_HOST_NAME 替换成本节点主机名称。配置完成后在每台主机上 ping 通 3 个主机名。此外,通过配置 hosts 文件,可在网络环境发生变化时提供可扩展性且便于迁移。
    可参考:OpenStack Doc : Controller hosts 文件配置 
    ① 执行sudo vi /etc/hosts,添加如下内容

    
    # config all nodes
    
    10.0.0.11       controller
    10.0.0.21       network
    10.0.0.31       compute
    10.0.0.41       blockstorage
    10.0.0.51       objectstorage1
    10.0.0.52       objectstorage2

    ② 注释掉除 127.0.0.1 之外的环回地址项,如下:

    
    #127.0.1.1      controller`
    

    注:其他节点配置方法类似
    至此,节点网络配置完成:
    ① Controller、Network、Compute 等节点可互相 ping 通;
    ② Controller、Network、Compute 等节点均可访问外网和进行地址解析。

  • 配置 ubuntu 的更新源
    使用阿里云的更新源,修改配置文件sudo vi /etc/apt/sources.list,添加:

    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
  • 更新系统
    ① 更新系统

    sudo apt update
    sudo apt upgrade
    sudo apt dist-upgrade
    sudo apt autoremove

    可能遇到的问题:
    Ubuntu 系统 /boot 容量不足引起的无法更新系统
    解决方法:
    查看 /boot 分区容量df -h /boot;查看当前使用内核版本号uname -a;删除旧内核,输入sudo apt-get remove linux-image-,接着按两下 tab 键,将显示所有的内核版本,把目前使用的版本之前的版本全部删除。最后执行

    sudo update-grub
    sudo grub-mkconfig -o /boot/grub/grub.cfg

    ② 查看系统发行版本和内核版本

    network@network:~$ sudo lsb_release -a
    No LSB modules are available.
    Distributor ID: Ubuntu
    Description:    Ubuntu 16.04 LTS
    Release:    16.04
    Codename:   xenial
    network@network:~$ uname -srpi
    Linux 4.4.0-23-generic x86_64 x86_64
  • 服务器时区设置
    ① 执行 sudo tzselect–> 选择亚洲(Asia)–> 选择中国(China)–> 选择北京(Beijing)–>
    ② 复制文件到 /etc 目录下:
    sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    注:若在系统安装时已设置正确时区,可跳过该步骤。

更多详情见请继续阅读下一页的精彩内容:http://www.linuxidc.com/Linux/2016-09/135488p2.htm

5. 启动实例

5.1 创建虚拟网络

部署节点:Controller Node

5.1.1 Provider Network

  • 网络结构
    Provider Network 中一个实例通过二层网络(桥接或交换)来访问外部网络,该网络包含一个 DHCP 服务器来给实例提供 IP 地址。
    如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • 创建 Provider Network
    ① 设置 OpenStack 中 admin 用户环境变量

    source ~/.openstack/.admin-openrc

    ② 创建网络provider

    neutron net-create --shared --provider:physical_network provider --provider:network_type flat provider

    其中,--shared设置允许所有项目访问虚拟网络,--provider:physical_network provider--provider:network_type flat 将扁平虚拟网络通过 Network 节点的 eth0 口连接到扁平物理网络。相关配置文件如下:
    Controller节点上的/etc/neutron/plugins/ml2/ml2_conf.ini

    [ml2_type_flat]
    flat_networks = provider

    Network节点上的/etc/neutron/plugins/ml2/linuxbridge_agent.ini

    [linux_bridge]
    physical_interface_mappings = provider:eth0

    ③ 创建子网

    neutron subnet-create --name provider --allocation-pool start=START_IP_ADDRESS,end=END_IP_ADDRESS --dns-nameserver DNS_RESOLVER --gateway PROVIDER_NETWORK_GATEWAY provider PROVIDER_NETWORK_CIDR

    其中,START_IP_ADDRESSEND_IP_ADDRESS 是将分配给实例的子网的起始 IP 和结束 IP 地址,需要替换为实际起始结束 IP 地址(这个 IP 地址范围不能包括任何已存在的活动 IP);DNS_RESOLVER是域名服务器,需替换为实际 DNS 服务器 IP(可查看 DNS 服务器配置文件 /etc/resolv.conf);PROVIDER_NETWORK_GATEWAY 是外部网络网关 IP,替换为实际网关 IP。例如,本文执行如下命令创建子网:

    neutron subnet-create --name provider --allocation-pool start=192.168.1.100,end=192.168.1.200 --dns-nameserver 192.168.1.1 --gateway 192.168.1.1 provider 192.168.1.0/24

5.1.2 Self-Service Network

  • 网络结构
    Self-Service 网络通过 NAT 连接到物理网络,包含一个 DHCP 服务器为实例提供 IP 地址,Self-Service 网络中的实例可自动访问外部网络,但外部网络主机访问 Self-Service 网络中的实例需要配置浮动 IP 才可以。其他普通用户也可以创建 Self-Service 网络,因为该网络只提供普通用户项目下实例之间的连通性。
    注:创建 Self-Service 网络前必须先创建 Provider 网络。
    网络结构如下图:
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南
    OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

  • 创建 Self-Service Network
    ① 设置 OpenStack 中 demo 用户环境变量

    source ~/.openstack/.demo-openrc

    ② 创建网络:

    neutron net-create selfservice

    注:普通用户在上述命令中无法提供额外参数,相关参数在
    Controller节点上的 /etc/neutron/plugins/ml2/ml2_conf.ini 文件中配置:

    [ml2]
    tenant_network_types = vxlan
    
    [ml2_type_vxlan]
    vni_ranges = 1:1000

    ③ 创建子网

    neutron subnet-create --name selfservice --dns-nameserver DNS_RESOLVER --gateway SELFSERVICE_NETWORK_GATEWAY selfservice SELFSERVICE_NETWORK_CIDR

    注:子网 IP 段可参考 RFC1918 中关于私有地址空间的规定,如下

    10.0.0.0        -   10.255.255.255  (10/8 prefix)
    172.16.0.0      -   172.31.255.255  (172.16/12 prefix)
    192.168.0.0     -   192.168.255.255 (192.168/16 prefix)

    本文采用如下命令创建子网:

    neutron subnet-create --name selfservice --dns-nameserver 8.8.4.4 --gateway 172.16.1.1 selfservice 172.16.1.0/24

    ④ 创建配置虚拟路由器
    Self-Service 网络通过虚拟路由器(如实现双向 NAT)连接到 Provider 网络。每个虚拟路由器包含至少一个连接到 Self-Service 网络的接口和一个位于 Provider 网络的网关。Provider 网络必须包含 router:external 设置项,以便 Self-Service 网络虚拟路由器可连接到外部网络,可以网络创建时或创建后添加(必须具有 admin 或其他特权用户权限)。如下:

    source ~/.openstack/.admin-openrc
    neutron net-update provider --router:external
    source ~/.openstack/.demo-openrc
    neutron router-create router
    neutron router-interface-add router selfservice
    neutron router-gateway-set router provider

    ⑤ 验证配置是否正确
    Network 节点上执行ip netns,列出网络命名空间:

    qdhcp-20b2a466-cd25-4b9a-9194-2b8005a8b547 (id: 2)
    qdhcp-e82fd421-79dc-446d-82dc-3cfb5a491644 (id: 1)
    qrouter-70837112-c3e0-4702-b4e4-ee9ce9cc4b8f (id: 0)

    设置 admin 环境变量:

    source ~/.openstack/.admin-openrc

    列出 router 路由器网络接口,查看连接 Provider 网络的网关 IP:

    neutron router-port-list router

    可看到 router 路由器连接 Provider 网络的网关 IP 为 192.168.1.101
    在 Controller 节点或其他 OpenStack 节点或物理主机上 ping 上述网关:

    ping -c 4 192.168.1.101

5.2 创建虚拟机类型模板(Flavor)

部署节点:Controller Node

  • CirrOS 镜像创建用于测试的虚拟机类型模板m1.nano

    source ~/.openstack/.admin-openrc
    openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

5.3 生成密钥对

部署节点:Controller Node

大多数云平台镜像支持公钥认证而不支持传统的口令认证,在启动实例前必须为计算服务添加一个公钥。生成密钥对步骤如下:

  • 设置普通用户 demo 的认证环境变量

    source ~/.openstack/.demo-openrc
  • 生成一个密钥对

    ssh-keygen -q -N ""
    openstack keypair create --public-key ~/.ssh/id_rsa.pub demokey

    注:上面可以跳过 ssh-keygen 命令,直接使用已有的公钥。

  • 验证公钥对

    openstack keypair list

5.4 添加安全组规则

部署节点:Controller Node

默认安全组规则适用于所有实例,并且包含防火墙规则,该防火墙规则拒绝远程访问实例。对于 Linux 镜像,建议至少允许 ICMP (ping)secure shell (SSH)。添加规则到默认安全组步骤如下:

  • 添加规则允许 ICMP 协议

    openstack security group rule create --proto icmp default
  • 添加规则允许 secure shell (SSH) 访问

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

5.5 启动实例

部署节点:Controller Node

启动实例前,至少需要制定虚拟机模板类型、镜像名称、网络、安全组、密钥对和实例名称。

  • 设置普通用户 demo 的认证环境变量

    source ~/.openstack/.demo-openrc
  • 列出可用虚拟机模板
    虚拟机模板指定了处理器、内存、存储等虚拟资源的分配概况。

    openstack flavor list
  • 列出可用镜像

    openstack image list
  • 列出可用网路

    openstack network list

    注:若实例启动使用 Provider 网络provider,或者使用 Self-Service 网络selfservice,则必须使用 ID 代替名称来使用该网络名称。

  • 列出可用安全组

    openstack security group list
  • 在 Provider 网络中启动实例
    注:PROVIDER_NET_ID 替换为实际 Provider 网络 ID。

    openstack server create --flavor m1.nano --image cirros --nic net-id=PROVIDER_NET_ID --security-group default --key-name demokey provider-instance

    获取 Provider 网络 provider 的网络 ID:

    export PROVIDER_NET_ID=$(openstack network list | awk '/ provider / {print $2}')

    例如本文采用如下命令启动实例:

    openstack server create --flavor m1.nano --image cirros --nic net-id=$PROVIDER_NET_ID --security-group default --key-name demokey provider-instance-cirros
  • 在 Self-Service 网络中启动实例
    注:SELFSERVICE_NET_ID 替换为实际 Self-Service 网络 ID。

    openstack server create --flavor m1.nano --image cirros --nic net-id=SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance

    获取 Self-Service 网络 selfservice 的网络 ID:

    export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / {print $2}')

    例如本文采用如下命令启动实例:

    openstack server create --flavor m1.nano --image cirros --nic net-id=$SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance-cirros
  • 查看实例状态

    openstack server list
  • 使用虚拟控制台访问实例
    ① 获取一个 Virtual Network Computing (VNC) 会话 URL,通过 Web 浏览器访问该 URL。

    controller@controller:~$ openstack console url show provider-instance-cirros
    +-----+-------------------------------------------------------------------------------+
    |Field| Value                                                                         |
    +-----+-------------------------------------------------------------------------------+
    |type | novnc                                                                         |
    | url |http://controller:6080/vnc_auto.html?token=5ed8f684-7ee5-4c10-aa5d-6bbd8f55cd1f|
    +-----+-------------------------------------------------------------------------------+
    controller@controller:~$ openstack console url show selfservice-instance-cirros
    +-----+-------------------------------------------------------------------------------+
    |Field| Value                                                                         |
    +-----+-------------------------------------------------------------------------------+
    |type | novnc                                                                         |
    | url |http://controller:6080/vnc_auto.html?token=ba0af1cb-83b6-4757-8b58-8951d4933ff9|
    +-----+-------------------------------------------------------------------------------+

    注:若客户端主机无法解析 controller 可在客户机 hosts 文件中添加对应规则,或者直接将 controller 替换为对应 IP 地址。
    ② 通过 Web 浏览器访问上述 URL,输入用户密码(cirros/cubswin:)),进入 Cirros 系统后,验证网络连通性。
    对于 Provider 网络虚拟机:

    ping -c 4 192.168.1.1
    ping -c 4 openstack.org
    ifconfig -a

    对于 Self-Service 网络虚拟机:

    ping -c 4 172.16.1.1
    ping -c 4 openstack.org
    ifconfig -a
  • 远程访问实例
    对于 Provider 网络虚拟机:
    ① 在 Controller 节点或其他任何位于物理网络中的节点上,测试能否连通实例。

    ping -c 4 192.168.1.102

    ② 使用 SSH 访问实例

    ssh cirros@192.168.1.102

    对于 Self-Service 网络虚拟机:
    ③ 在 Provider 虚拟网络中创建浮动 IP

    openstack ip floating create provider

    ④ 将上述浮动 IP 和实例相关联

    openstack ip floating add 192.168.1.103 selfservice-instance-cirros

    ⑤ 查看浮动 IP 绑定状态

    openstack server list

    ⑥ 在 Controller 节点或其他任何位于物理网络中的节点上,验证浮动 IP 能否连通

    ping -c 4 192.168.1.103

    ⑦ 使用 SSH 访问实例

    ssh cirros@192.168.1.103

5.6 测试块存储服务

部署节点:Controller Node

  • 创建一个卷
    ① 设置普通用户 demo 的环境变量

    source ~/.openstack/.demo-openrc

    ② 创建一个 1GB 的卷

    openstack volume create --size 1 volume1

    ③ 列出可用卷

    openstack volume list
  • 将一个卷添加到指定实例
    ① 添加卷到实例
    注:INSTANCE_NAMEVOLUME_NAME替换为实际实例名和卷名。

    openstack server add volume INSTANCE_NAME VOLUME_NAME

    例如,本文执行如下命令添加卷到实例:

    openstack server add volume provider-instance-cirros volume1

    ② 查看卷状态

    openstack volume list

    ③ 通过 SSH 登录实例,使用 fdisk 命令验证新添加的卷设备/dev/sdb

    ssh cirros@192.168.1.102
    sudo fdisk -l

    注:在使用卷之前,必须在块设备上创建文件系统并将其挂载到系统中。

5.7 测试编排服务

部署节点:Controller Node

  • 创建一个模板
    编排服务采用模板来设计栈。创建文件demo-template.yml,添加如下内容:

    heat_template_version: 2015-10-15
    description: Launch a basic instance with CirrOS image using the
                 ``m1.nano`` flavor, ``demokey`` key,  and one network.
    
    parameters:
      NetID:
        type: string
        description: Network ID to use for the instance.
    
    resources:
      server:
        type: OS::Nova::Server
        properties:
          image: cirros
          flavor: m1.nano
          key_name: demokey
          networks:
          - network: {get_param: NetID}
    
    outputs:
      instance_name:
        description: Name of the instance.
        value: {get_attr: [ server, name] }
      instance_ip:
        description: IP address of the instance.
        value: {get_attr: [ server, first_address] }
  • 创建一个栈
    ① 设置普通用户 demo 的环境变量

    source ~/.openstack/.demo-openrc

    ② 查看可用网络:

    openstack network list

    ③ 设置环境变量 NET_ID,如下将NET_ID 设置为 provider 网络 ID:

    export NET_ID=$(openstack network list | awk '/ provider / {print $2}')

    ④ 在 provider 网络中创建含有一个 Cirros 实例的栈

    openstack stack create -t demo-template.yml --parameter "NetID=$NET_ID" stack

    ⑤ 列出可用栈

    openstack stack list

    ⑥ 查看实例名和 IP,和 OpenStack 客户端输出信息作比较

    controller@controller:~$ openstack stack output show --all stack
    +---------------+-------------------------------------------------+
    | Field         | Value                                           |
    +---------------+-------------------------------------------------+
    | instance_name | {                                               |
    |               |   "output_value": "stack-server-zxf6yokswyje",  |
    |               |   "output_key": "instance_name",                |
    |               |   "description": "Name of the instance."        |
    |               | }                                               |
    | instance_ip   | {                                               |
    |               |   "output_value": "192.168.1.104",              |
    |               |   "output_key": "instance_ip",                  |
    |               |   "description": "IP address of the instance."  |
    |               | }                                               |
    +---------------+-------------------------------------------------+

    ⑦ 查看 OpenStack 客户端信息

    openstack server list

    ⑧ 删除栈

    openstack stack delete --yes stack

5.8 测试共享文件系统服务

部署节点:Controller Node

  • 创建服务镜像
    根据传统的部署方式,需要从一个支持诸如 NFS/CIFS 等网络文件系统的镜像中创建一个实例,来评估共享文件系统。本文为了降低资源要求,测试实例采用 CirrOS 镜像,但 CirrOS 镜像不支持网络文件系统。为了评估共享文件系统服务,本文采用支持网络文件系统的 manila-share-service 镜像创建一个普通实例,通过限制内存为 256MB 来减少对资源的消耗。
    ① 下载 manila-share-service 镜像

    wget http://tarballs.openstack.org/manila-image-elements/images/manila-service-image-master.qcow2

    ② 设置普通用户 admin 的环境变量

    source ~/.openstack/.admin-openrc

    ③ 添加镜像到镜像服务

    openstack image create "manila-service-image" --file manila-service-image-master.qcow2 --disk-format qcow2 --container-format bare --public

    ③ 为支持上述镜像服务创建一个新的模板类型

    openstack flavor create manila-service-flavor --id 100 --ram 256 --disk 0 --vcpus 1
  • 创建共享
    根据共享文件系统服务配置时选择的模式,本文采用需要共享驱动器支持的共享服务器管理模式,因此创建一个需要共享服务器管理支持的共享。在创建共享之前,启用 DHSS 模式的通用驱动需要定义至少一个镜像、一个类型模板、一个网络和一个共享网络(用于创建提供 NFS/CIFS 服务的共享服务器)。步骤如下:
    ① 创建共享类型
    设置普通用户 admin 的环境变量:

    source ~/.openstack/.admin-openrc

    创建启用 DHSS 的默认共享类型:

    manila type-create generic_share_type True

    ② 创建共享网络
    设置普通用户 demo 的环境变量:

    source ~/.openstack/.demo-openrc

    列出可用网络,获取 Self-Service 网络 selfservice 的网络 ID 及其子网 ID:

    neutron net-list

    获取 selfservice 网络 ID:

    export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / {print $2}')

    获取 selfservice 子网 ID:

    export SELFSERVICE_SUBNET_ID=$(openstack subnet list | awk '/ selfservice / {print $2}')

    利用 selfservice 网络 ID 和子网 ID 创建共享网络:

    manila share-network-create --name selfservice-net-share1 --neutron-net-id $SELFSERVICE_NET_ID --neutron-subnet-id $SELFSERVICE_SUBNET_ID

    ③ 创建共享
    设置普通用户 demo 的环境变量:

    source ~/.openstack/.demo-openrc

    利用共享网络创建一个 NFS 共享:

    manila create NFS 1 --name share2 --share-network selfservice-net-share1 --share-type generic_share_type

    查看可用共享,等待一段时间,新创建的共享状态将从 creating 变为available

    manila list

    注:若创建共享出错,可参考6.11

  • 创建支持 NFS 的测试实例
    ① 获取 Self-Service 网络 selfservice 的网络 ID:

    export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / {print $2}')

    ② 启动实例:

    openstack server create --flavor manila-service-flavor --image manila-service-image --nic net-id=$SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance-manila

    ③ 查看实例状态

    openstack server list

    ④ 使用虚拟控制台访问实例
    获取一个 Virtual Network Computing (VNC) 会话 URL,通过 Web 浏览器访问该 URL。

    controller@controller:~$ openstack console url show selfservice-instance-manila | awk '/ url / {print $4}'
    http://controller:6080/vnc_auto.html?token=2d11eb78-f15c-4e55-a9ef-9efe5ae33ea2

    注:用户名密码均为manila

  • 挂载共享到测试实例
    ① 在尝试通过网络挂载共享前,配置使实例可以访问新建共享:

    manila access-allow share2 ip INSTANCE_IP_ADDRESS

    注:INSTANCE_IP_ADDRESS 替换为 selfservice 网络实例 IP 地址(本文此处可用实例 selfservice-instance-manila 的 IP 地址)
    ② 确定共享的对外 IP 地址:

    manila show share2 | grep path

    例如,本文得到的 path 为:10.254.0.22:/shares/share-fc9f6166-f2ee-4785-ba24-d7e7a598e161

    ③ 在测试实例 selfservice-instance-manila 上创建一个挂载点

    mkdir ~/test_folder

    ④ 根据共享地址在实例上挂载 NFS 共享,在测试实例上执行如下挂载命令:

    sudo mount -t nfs 10.254.0.22:/shares/share-fc9f6166-f2ee-4785-ba24-d7e7a598e161 ~/test_folder

6. 遇到的问题

6.1 安装 MariaDB 时 mariadb.cnf 配置问题

  • 问题
    安装 MySQL 后卸载,删除 /etc/mysql/ 下所有文件,重新安装 MariaDB 时报错。
    问题 ①:找不到配置文件mariadb.cnf

    Setting up mariadb-common (10.0.24-7) ...
    update-alternatives: error: alternative path /etc/mysql/mariadb.cnf doesn't exist
    dpkg: error processing package mariadb-common (--configure):
     subprocess installed post-installation script returned error exit status 2
    Errors were encountered while processing:
     mariadb-common
    E: Sub-process /usr/bin/dpkg returned an error code (1)

    问题 ②:依赖包 mariadb-server-10.0 未配置

    Setting up libhttp-message-perl (6.11-1) ...
    dpkg: dependency problems prevent configuration of mariadb-server:
     mariadb-server depends on mariadb-server-10.0 (>= 10.0.24-7); however:
      Package mariadb-server-10.0 is not configured yet.
    dpkg: error processing package mariadb-server (--configure):No apport report written because the error message indicates its a followup error from a previous failure.
     dependency problems - leaving unconfigured
    Processing triggers for libc-bin (2.23-0Ubuntu3) ...
    Errors were encountered while processing:
     mariadb-server-10.0
     mariadb-server
    E: Sub-process /usr/bin/dpkg returned an error code (1)
  • 原因
    问题 ①:重装 MariaDB 时将配置文件删除,导致找不到配置文件mariadb.cnf

  • 解决方法
    问题 ①:在 /etc/mysql/ 下新建一个 mariadb.cnf 文件,或者从别的电脑上拷贝一个 mariadb.cnf 到该目录。
    问题 ②:彻底清除配置文件,删除软件,重新安装。

    sudo service mysql stop
    sudo apt-get purge mysql* mariadb*
    sudo apt autoremove
    sudo rm -r /var/lib/mysql
    sudo rm -r /var/log/mysql
    sudo rm -r /etc/mysql
    sudo reboot
    sudo apt-get install mariadb-server

6.2 MariaDB 监听地址无法绑定到指定 IP

  • 问题
    /etc/mysql/conf.d/openstack.cnf 中指定了 bind_address = 10.0.0.11,但是netstat -ntlp 显示 MySQL 仍然绑定在地址127.0.0.1,导致其他节点无法访问数据库。

  • 原因
    ① 查看 mysqld 默认参数,执行:/usr/sbin/mysqld --print-defaults

    /usr/sbin/mysqld would have been started with the following arguments:
    --bind-address=10.0.0.11 --default-storage-engine=innodb --innodb_file_per_table --collation-server=utf8_general_ci --character-set-server=utf8 --log-error --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --basedir=/usr --datadir=/var/lib/mysql --tmpdir=/tmp --lc-messages-dir=/usr/share/mysql --skip-external-locking --bind-address=127.0.0.1 --key_buffer_size=16M --max_allowed_packet=16M --thread_stack=192K --thread_cache_size=8 --myisam-recover=BACKUP --query_cache_limit=1M --query_cache_size=16M --log_error=/var/log/mysql/error.log --expire_logs_days=10 --max_binlog_size=100M --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci

    发现参数开头是自定义配置信息,后面又添加了其他参数被覆盖了
    ② 启动 mysql 服务,查看后台进程,如下:

    root      28195      1  0 18:31 ?        00:00:00 /bin/bash /usr/bin/mysqld_safe
    root      28196      1  0 18:31 ?        00:00:00 logger -p daemon err -t /etc/init.d/mysql -i
    mysql     28360  28195  0 18:31 ?        00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-log-error --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
    root      28361  28195  0 18:31 ?        00:00:00 logger -t mysqld -p daemon error

    发现服务启动时候传入的参数和上一步查到的默认参数不一致,而且添加了 --skip-log-error,导致/var/log/mysql/error.log 不再记录错误信息。
    ③ 查看 /etc/mysql/mariadb.cnf 可以看到配置文件加载顺序:

    The MariaDB/MySQL tools read configuration files in the following order:
    1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
    2. "/etc/mysql/conf.d/*.cnf" to set global options.
    3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
    4. "~/.my.cnf" to set user-specific options.

    发现 /etc/mysql/mariadb.conf.d/ 下的 50-server.cnf50-mysqld_safe.cnf文件中设置了默认配置信息,根据加载顺序,覆盖了 /etc/mysql/conf.d/ 下的配置信息。

  • 解决方法
    根据需要修改 50-server.cnf50-mysqld_safe.cnf即可。

6.3 neutron-l3-agent 无法启动且日志文件不更新

  • 问题
    neutron-l3-agent无法启动,日志文件 /var/log/neutron/neutron-l3-agent.log 没有记录任何信息。

  • 原因
    ① 查看日志 /var/log/neutron/neutron-l3-agent.log
    发现报错信息如下:

    5400 ERROR neutron.agent.l3.agent [-] An interface driver must be specified
    l3-agent cannot check service plugins enabled on the neutron server

    造成这个错误的原因是,第一次误将 neutron-serverneutron-plugin-ml2安装在 Network 节点上,导致找不到服务。
    解决方法:
    neutron-serverneutron-plugin-ml2重新安装在 Controller节点即可。

    ② 在执行 sudo service neutron-l3-agent restart 启动后,迅速执行ps -ef | grep neutron-l3-agent,可以看到后台进程信息,如下:

    network@network:~$ ps -ef | grep neutron-l3-agent
    neutron    7269      1 30 21:38 ?        00:00:01 /usr/bin/Python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini --config-file=/etc/neutron/fwaas_driver.ini --log-file=/var/log/neutron/neutron-l3-agent.log
    network    7284   2453  0 21:38 pts/0    00:00:00 grep --color=auto neutron-l3-agent

    ③ 从上一步获取 neutron-l3-agent 启动命令行参数,手动执行启动,如下,获取启动错误信息:

    root@network:/var/log/neutron# /usr/bin/python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini --config-file=/etc/neutron/fwaas_driver.ini --log-file=/var/log/neutron/neutron-l3-agent.log
    Guru mediation now registers SIGUSR1 and SIGUSR2 by default for backward compatibility. SIGUSR1 will no longer be registered in a future release, so please use SIGUSR2 to generate reports.
    Traceback (most recent call last):
    File "/usr/bin/neutron-l3-agent", line 10, in <module>
    sys.exit(main())
    File "/usr/lib/python2.7/dist-packages/neutron/cmd/eventlet/agents/l3.py", line 17, in main
    l3_agent.main()
    File "/usr/lib/python2.7/dist-packages/neutron/agent/l3_agent.py", line 51, in main
    common_config.init(sys.argv[1:])
    File "/usr/lib/python2.7/dist-packages/neutron/common/config.py", line 243, in init
    **kwargs)
    File "/usr/lib/python2.7/dist-packages/oslo_config/cfg.py", line 2164, in __call__
    raise ConfigFilesNotFoundError(self._namespace._files_not_found)
    oslo_config.cfg.ConfigFilesNotFoundError: Failed to find some config files: /etc/neutron/fwaas_driver.ini

    ④ 由最后一行可发现是找不到文件 /etc/neutron/fwaas_driver.ini 导致无法启动的。这是因为之前为了重新安装,删除了 Network 节点上的部署的 neutron 相关的所有组件,并删除了 /etc/neutron/ 下所有配置文件。重新安装后导致缺失 /etc/neutron/fwaas_driver.ini,从而导致neutron-l3-agent 无法启动且日志文件 /var/log/neutron/neutron-l3-agent.log 没有记录任何信息。

  • 解决方法
    Controller节点拷贝一份到 Network 节点,执行命令:

    sudo scp controller@controller:/etc/neutron/fwaas_driver.ini /etc/neutron/fwaas_driver.ini

    输入 controller 用户密码,完成拷贝。
    为了保持权限一致,查看 fwaas_driver.iniController节点上的权限:

    controller@controller:~$ ll /etc/neutron/fwaas_driver.ini
    -rw-r--r-- 1 root neutron 149 Apr  8 08:15 /etc/neutron/fwaas_driver.ini
    network@network:~$ ll /etc/neutron/fwaas_driver.ini
    -rw-r--r-- 1 root root 149 May 30 22:14 /etc/neutron/fwaas_driver.ini
    network@network:~$ sudo chgrp neutron /etc/neutron/fwaas_driver.ini
    network@network:~$ ll /etc/neutron/fwaas_driver.ini
    -rw-r--r-- 1 root neutron 149 May 30 22:14 /etc/neutron/fwaas_driver.ini

6.4 Apache 服务无法启动

  • 问题
    执行 sudo service apache2 start 发现 Apache 服务无法启动,

    2016-07-24 17:55:29.873 112434 CRITICAL keystone [req-8a1299fa-c406-4d70-bd33-9b8eb509a76d - - - - -] error: [Errno 98] Address already in use
  • 原因
    官方安装文档中的关闭 keystone 服务的方法不起作用,重启后 默认 keystone 服务未禁止自启动,已经监听端口 5000 和 35357,发生冲突。可执行 ps -ef | grep keystone 查看 keystone 服务进程信息。

  • 解决方法
    ① 安装sysv-rc-conf

    sudo apt-get install sysv-rc-conf

    查看系统运行级别 who -r
    ② 执行sudo sysv-rc-conf 可看到 keystone 默认运行级别为 2345,取消选中。
    参考:http://www.linuxidc.com/Linux/2016-09/135490.htm 
    ③ 修改启动配置文件 sudo vi /etc/init/keystone.conf,将start on runlevel [2345] 修改为start on runlevel []
    ③ 重新启动服务

    sudo reboot

    ④ 若重启后发现默认 keystone 服务仍然自动启动,可执行

    sudo service keystone stop
    sudo rm /lib/systemd/system/keystone.service
    sudo rm /etc/systemd/system/multi-user.target.wants/keystone.service
    sudo reboot

6.5 云主机状态错误,无法启动

  • 问题
    创建云主机,状态错误,无法启动,提示NoValidHost: No valid host was found. There are not enough hosts available.。查看日志sudo /var/log/nova/nova-conductor.log

    2016-07-19 10:48:36.873 12190 WARNING nova.scheduler.utils [req-7233346a-5a7d-4af0-9f3d-39d23b567984 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] [instance: fa47a094-d1b5-41ab-9636-780025afb273] Setting instance to ERROR state.
    2016-07-19 11:35:03.463 12188 ERROR nova.scheduler.utils [req-a47318b9-a386-41bc-a527-d6764d2b9917 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] [instance: 2d1f1eba-2034-4515-9382-9c75436da40d] Error from last host: compute (node compute): [u'Traceback (most recent call last):\n', u'File"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1926, in _do_build_and_run_instance\n    filter_properties)\n', u'File"/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 2116, in _build_and_run_instance\n    instance_uuid=instance.uuid, reason=six.text_type(e))\n', u"RescheduledException: Build of instance 2d1f1eba-2034-4515-9382-9c75436da40d was re-scheduled: Request Failed: internal server error while processing your request.\nNeutron server returns request_ids: ['req-822378f2-1544-4f73-88fd-34de66547565']\n"]
    2016-07-19 11:35:03.546 12188 WARNING nova.scheduler.utils [req-a47318b9-a386-41bc-a527-d6764d2b9917 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] Failed to compute_task_build_instances: No valid host was found. There are not enough hosts available.
    ......
    NoValidHost: No valid host was found. There are not enough hosts available.
  • 原因
    controller 节点上,/etc/neutron/neutron.conf文件中未指定lock_path,发生网络服务 neutron 异常,无法访问目标主机。

  • 解决方法
    参考下面 6.6

6.6 创建路由失败,缺少lock_path

  • 问题

    controller@controller:~$ neutron router-interface-add router selfservice
    Request Failed: internal server error while processing your request.
    Neutron server returns request_ids: ['req-0dbe9380-5c83-48ec-b012-a1f258ef3e0d']
  • 原因
    未指定 lock_path
    controller节点上,查看日志sudo vi /var/log/neutron/neutron-server.log

    2016-07-19 19:25:36.734 15677 ERROR oslo_messaging.rpc.dispatcher [req-adc3fe7b-9fcf-4280-8a0b-b98d018be7b2 - - - - -] Exception during message handling: value required for option: lock_path
    2016-07-19 19:25:36.734 15677 ERROR oslo_messaging.rpc.dispatcher RequiredOptError: value required for option: lock_path
  • 解决方法
    controller 节点上,修改配置文件 sudo vi /etc/neutron/neutron.conf,在[oslo_concurrency] 处添加如下内容

    [oslo_concurrency]
    lock_path = /var/lib/neutron/tmp

    将修改写入数据库,重启服务

    su root
    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
    sudo service neutron-server restart

6.7 bridge-nf-call-arptables不存在

  • 问题
    查看日志sudo vi /var/log/neutron/neutron-linuxbridge-agent.log,显示错误:

    2016-07-19 19:52:01.365 6194 ERROR neutron.agent.linux.utils [req-b8081842-66f0-487e-91c0-62127d7830f2 - - - - -] Exit code: 255; Stdin: ; Stdout: ; Stderr: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory
  • 原因
    sudo ll /proc/sys/net/bridge/bridge-nf-call-arptables发现文件存在,但暂时还未发现影响哪个组件的哪个功能,待解决

6.8 计量数据收集服务异常

  • 问题
    查看日志sudo vi /var/log/ceilometer/ceilometer-agent-central.log

    2016-07-19 20:45:47.074 7482 ERROR ceilometer.agent.manager [req-57db422d-f131-4c99-97cc-fd874956efbc admin - - - -] Skipping endpoint, keystone issue: The request you have made requires authentication. (HTTP 401) (Request-ID: req-69262a02-156c-4b5f-ab3f-924190a6cd98) (HTTP 401)
    2016-07-19 20:45:47.078 7482 INFO ceilometer.agent.manager [req-57db422d-f131-4c99-97cc-fd874956efbc admin - - - -] Skip pollster power, no resources found this cycle
  • 原因
    待解决

6.9 计量警报服务异常

  • 问题
    计量警报服务,后台日志一直报错,sudo vi /var/log/aodh/aodh-evaluator.log

    2016-07-19 20:34:20.605 7474 ERROR aodh.evaluator [-] alarm evaluation cycle failed
    ......
    2016-07-19 20:33:20.547 7474 ERROR aodh.evaluator ProgrammingError: (pymysql.err.ProgrammingError) (1146, u"Table'aodh.alarm'doesn't exist") [SQL: u'SELECT alarm.alarm_id AS alarm_alarm_id, alarm.enabled AS alarm_enabled, alarm.name AS alarm_name, alarm.type AS alarm_type, alarm.severity AS alarm_severity, alarm.description AS alarm_description, alarm.timestamp AS alarm_timestamp, alarm.user_id AS alarm_user_id, alarm.project_id AS alarm_project_id, alarm.state AS alarm_state, alarm.state_timestamp AS alarm_state_timestamp, alarm.ok_actions AS alarm_ok_actions, alarm.alarm_actions AS alarm_alarm_actions, alarm.insufficient_data_actions AS alarm_insufficient_data_actions, alarm.repeat_actions AS alarm_repeat_actions, alarm.rule AS alarm_rule, alarm.time_constraints AS alarm_time_constraints \nFROM alarm \nWHERE alarm.enabled = true AND alarm.type != %(type_1)s ORDER BY alarm.timestamp DESC'] [parameters: {u'type_1': 'event'}]
    2016-07-19 20:33:20.547 7474 ERROR aodh.evaluator
  • 原因
    待解决

6.10 数据库服务异常

  • 问题

    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task [-] Error during Manager.publish_exists_event
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task Traceback (most recent call last):
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task   File "/usr/lib/python2.7/dist-packages/oslo_service/periodic_task.py", line 220, in run_periodic_tasks
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task     task(self, context)
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task   File "/usr/lib/python2.7/dist-packages/trove/taskmanager/manager.py", line 407, in publish_exists_event
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task     self.admin_context)
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task   File "/usr/lib/python2.7/dist-packages/trove/extensions/mgmt/instances/models.py", line 178, in publish_exist_events
    ......
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task Unauthorized: The request you have made requires authentication. (HTTP 401)
    2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task
  • 原因
    待解决

6.11 manila创建共享错误

  • 问题
    创建共享,显示状态错误,在 blockstorage 节点上查看日志sudo vi /var/log/neutron/neutron-linuxbridge-agent.log

    2016-07-19 22:28:44.914 5844 ERROR neutron.plugins.ml2.drivers.agent._common_agent [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Error in agent loop. Devices info: {'current': set(['tap5636fd8b-48']), 'timestamps': {'tap5636fd8b-48': None}, 'removed': set([]), 'added': set(['tap5636fd8b-48']), 'updated': set([])}
    2016-07-19 22:28:41.967 5844 INFO neutron.agent.securitygroups_rpc [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Preparing filters for devices set(['tap5636fd8b-48'])
    2016-07-19 22:28:42.335 5844 ERROR neutron.agent.linux.utils [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Exit code: 255; Stdin: ; Stdout: ; Stderr: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory

    查看日志sudo vi /var/log/manila/manila-share.log,显示无法获取共享服务器:

    2016-07-19 22:34:08.628 6095 ERROR manila.share.manager [req-c68dc620-0eb4-4847-a271-3ccd76509f48 18d3670a039649299ed141229c509b62 4bedcb61d9eb47cfb5fc79ea4a1a03b0 - - -] Creation of share instance a7c60e8e-9368-4869-abea-ad6196c3ce07 failed: failed to get share server.
    2016-07-19 22:34:08.660 6095 ERROR oslo_messaging.rpc.dispatcher [req-c68dc620-0eb4-4847-a271-3ccd76509f48 18d3670a039649299ed141229c509b62 4bedcb61d9eb47cfb5fc79ea4a1a03b0 - - -] Exception during message handling: SSH connection has not been established to 10.254.0.19 in 300s. Giving up.
  • 原因
    在安装配置共享服务时网络配置有错,无法更新网络拓扑变化。创建的网络 manila_service_network 在节点 BlockStorage 上的端口 manila:share 未能及时加入到 vxlan,导致创建共享时,网络不通,无法连接节点BlockStorage 上的共享网络。

    ① 查看 BlockStorage 节点上的共享服务网络端口

    source ~/.openstack/.admin-openrc
    openstack network list
    openstack port list

    最后得到端口 ID:5636fd8b-48

    ② 查看 BlockStorage 节点接口信息

    blockstorage@blockstorage:~$ ifconfig -a
    ns-5636fd8b-48 Link encap:Ethernet  HWaddr fa:16:3e:76:15:f3  
    tap5636fd8b-48 Link encap:Ethernet  HWaddr a2:22:f6:eb:de:dd 
    vxlan-71  Link encap:Ethernet  HWaddr 5a:ff:85:17:37:af 

    ③ 查看网桥信息

    blockstorage@blockstorage:~$ brctl show
    bridge name bridge id       STP enabled interfaces
    brqe82fd421-79      8000.5aff851737af   no      vxlan-71

    可见端口 tap5636fd8b-48 未绑定到网桥brqe82fd421-79,不能访问vxlan-71

  • 解决方法:
    手动添加端口 tap5636fd8b-48 到网桥 brqe82fd421-79
    参考:
    https://ask.openstack.org/en/question/92678
    https://ask.openstack.org/en/question/92395

    sudo brctl addif brqe82fd421-79 tap5636fd8b-48
    brctl show
    bridge name bridge id       STP enabled interfaces
    brqe82fd421-79      8000.5aff851737af   no      tap5636fd8b-48
                                                    vxlan-71

6.12 无法获取云硬盘一致性组

  • 问题
    点击 Dashboard 中的 云硬盘一致性组,提示“错误:无法获取云硬盘一致性组”

    controller@controller:~$ cinder consisgroup-list
    ERROR: Policy doesn't allow consistencygroup:get_all to be performed. (HTTP 403) (Request-ID: req-45148cb9-ba43-4a66-bd57-0e4f7cfcb6bb)
  • 原因
    cinder 策略配置文件中禁用了一致性组 API

  • 解决方法
    ① 修改配置文件 sudo vi /etc/cinder/policy.json,删除`consistencygroup 规则下的 group:nobody 来启用一致性组 API。可用 vim 打开文件,执行如下命令。

    :1,$ s/group:nobody//g

    ② 重启块存储 API 服务

    sudo service cinder-api restart

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-09/135488.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计127547字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中