OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南

【聲明】


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)。
    此處輸入圖片的描述

  • Self-Service Networks
    該方式和Provider Networks方式相比,通過諸如VXLAN方式在自服務網絡中支持三層路由服務
    此處輸入圖片的描述
    本文采用Provider Networks網絡模型設計

2.3 OpenStack節點硬件需求

此處輸入圖片的描述

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官方文檔建議網絡佈局如下:
    此處輸入圖片的描述

  • 本文采用如下網絡設計
    總共3個子網:
    ① 互聯網連接/對外出口(External)
    ② Openstack管理網絡(Management)
    ③ VM虛擬機內網連接(Data)
    此處輸入圖片的描述
    注:此外,本文將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官方文檔
    此處輸入圖片的描述

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
  • 各節點功能可參考下圖
    注:僅供參考理解,具體根據實際情況而定
    此處輸入圖片的描述
    此處輸入圖片的描述

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虛擬機配置
    ① 配置虛擬機網絡
    虛擬機網絡連接方式圖解:
    此處輸入圖片的描述
    打開VMware Workstation虛擬網絡編輯器,添加如下虛擬網卡:
    其中VMnet0用於配置External Network,VMnet1用於配置Management Network子網, VMnet2用於配置Data Network子網。如下圖:
    此處輸入圖片的描述
    ② 創建虛擬機,按前面要求設置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,如下圖:
    此處輸入圖片的描述
    ④ 各節點虛擬機配置如下圖:
    Controller節點:
    此處輸入圖片的描述
    Network節點:
    此處輸入圖片的描述
    Compute節點:
    此處輸入圖片的描述
    BlockStorage節點:
    此處輸入圖片的描述
    ObjectStorage1節點:
    此處輸入圖片的描述
    ObjectStorage2節點:
    此處輸入圖片的描述

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下實現端口映射
    以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,保存即可。
    此處輸入圖片的描述

注:其他節點配置方法類似

  • 配置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
    注:若在系統安裝時已設置正確時區,可跳過該步驟。

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

5. 啓動實例

5.1 創建虛擬網絡

部署節點:Controller Node

5.1.1 Provider Network

  • 網絡結構
    Provider Network中一個實例通過二層網絡(橋接或交換)來訪問外部網絡,該網絡包含一個DHCP服務器來給實例提供IP地址。
    如下圖:
    此處輸入圖片的描述
    此處輸入圖片的描述

  • 創建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網絡。
    網絡結構如下圖:
    此處輸入圖片的描述
    此處輸入圖片的描述

  • 創建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://blog.163.com/thinki_cao/blog/static/839448752012112694037995/
    ③ 修改啓動配置文件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

參考鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章