2014年9月29日 星期一

安裝 OpenStack @ Ubuntu 14.04 (4) - 安裝 Compute Service (Nova)

安裝 OpenStack @ Ubuntu 14.04 (4) - 安裝 Compute Service (Nova)

目錄

1、安裝環境說明

  • OS:Ubuntu 14.04 LTS

  • Controller

    • IP:10.0.0.11 / 24
    • Gateway:10.0.0.1
  • Network

    • Management IP:10.0.0.21 / 24 (eth0)
    • Gateway:10.0.0.1
    • Instance Tunnel IP:10.0.1.21 / 24 (eth1)
    • External Interface (eth2)
      • IP:不指定 IP
      • 設定方式如下:(修改 /etc/network/interfaces)

    auto eth2
    iface eth2 inet manual
    up ip link set dev $IFACE up
    down ip link set dev $IFACE down

  • Compute 1

    • Management IP:10.0.0.31 / 24
    • Gateway:10.0.0.1
    • Instance Tunnel IP:10.0.1.31
  • 修改每個 node 的 /etc/hosts 檔案,並加入以下內容:

    10.0.0.11 controller
    10.0.0.21 network
    10.0.0.31 compute1

    • 使用者身分:root

    2、Compute Service (NOVA) 概觀

    Compute Service 在整個 IaaS 的架構中是屬於最主要的部份,同時會向 Identity Service 進行認證授權、向 Image Service 要求 image、將資料提供給 Dashboard …. 等等。

    而整個 Compute Service (NOVA) 包含了以下幾個重要部分:

    2.1 API

    2.1.1 nova-api service

    用來處理 & 回應終端使用者的 Compute API call,除了支援 OpenStack API 之外,還支援了 Amazon EC2 以及管理用 API。

    2.1.2 nova-api-metadata service

    通常會用在多個 compute node 並安裝 nova-network 時使用,用來回應來自 instance 對 metadata 的要求。

    2.2. Compute core

    這元件包含了幾個重要的 daemon,來共同組成 Compute Core 以提供服務:

    2.2.1 nova-compute

    主要目的是與 hypervisor API 溝通,已建立 / 中止 VM instance。

    簡單來說,這個 daemon 僅接受來自 Message Queue 的訊息並執行相關命令而已,例如啟動一個 KVM instance、更新 instance 在資料庫中的狀態。

    2.2.2 nova-scheduler

    取得 VM instance 的需求後,根據制定的規則 & 目前情況,決定要讓 VM 在哪一台實體主機啟動。

    2.2.3 nova-conductor

    作為 nova-ompute 與 DB 之間的橋樑,目的是為了減少 nova-compute 直接存取 DB 的行為。

    2.3 Networking for VMs

    這個部分的功能已經被移進獨立的 Network Service (Neutron) 了,但還是可以簡單說明一下:

    2.3.1 nova-network

    同樣也是一支 daemon,接收來自 Message Queue 的網路相關需求並處理,例如:設定 bridge 介面 or iptables 規則 …. 等等。

    2.3.2 nova-dhcpbridge script

    用來追蹤在資料庫中 IP 租用 & 釋放的資訊。

    2.4 Console interface

    2.4.1 nova-novncproxy (daemon)

    作為透過 VNC 連線時存取 instance VM 的 proxy 之用,支援 browser-based novnc client。

    2.4.2 nova-xvpnvncproxy (daemon)

    作為透過 VNC 連線時存取 instance VM 的 proxy 之用,支援 Java client 的連線。

    2.4.2 nova-consoleauth (daemon)

    用來驗證由 console proxy (上面的 nova-novncproxy & nova-xvpnvncproxy) 所提供的使用者 token。

    2.5 Command-line clients and other interfaces

    2.5.1 nova client

    允許使用者以 tenant admin or 一般使用者的身分執行命令。

    2.5.2 nova-manage client

    允許 OpenStack 管理者執行命令。

    2.6 Other components

    2.6.1 Message Queue

    任何實作 AMQP 的 message queue 服務,用來作為所有 daemon 通訊的中介,這邊我們所使用的 RabbitMQ。

    2.6.2 SQL Database

    儲存在 OpenStack 上運行的所有 VM instance 的狀態、網路設定、相關專案,任何 SQLAlchemy 支援的 DB 都可以使用,我們這邊所使用的是 MySQL。

    3、安裝 Compute Service

    Compute Service 其實是由好幾個 service 一同合作,讓使用者可以啟用 VM instance。

    安裝的時候可以將這些 service 安裝在不同的機器上,也可以都裝在相同的機器上;在這邊我們將大部分的 service 安裝在 controller node 上,而主要啟動 VM instance 的服務則安裝在 compute node 上。

    首先在 controller node 上安裝 Compute 相關必要套件:

    controller# apt-get -y install nova-api nova-cert nova-conductor nova-consoleauth nova-novncproxy nova-scheduler python-novaclient

    3.1 設定 Message Queue & VNC

    修改 nova 設定檔(/etc/nova/nova.conf),指定 Message Queue 服務 & VNC 相關設定,在 [DEFAULT] 區段中加入以下設定:

    [DEFAULT]
    
    rpc_backend = rabbit
    rabbit_host = controller
    rabbit_password = YOUR_RABBIT_PASS
    
    my_ip = 10.0.0.11
    vncserver_listen = 10.0.0.11
    vncserver_proxyclient_address = 10.0.0.11

    3.2 設定資料庫

    接著準備好 nova 相關 daemon 會用到的 DB & 權限設定:

    controller# mysql -u root -p
    Enter password:
    
    mysql> create database nova;
    mysql> grant all privileges on nova.* to 'nova'@'localhost' identified by 'YOUR_NOVA_DB_PASSWORD';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant all privileges on nova.* to 'nova'@'%' identified by 'YOUR_NOVA_DB_PASSWORD';
    Query OK, 0 rows affected (0.00 sec)

    新增 Tables @ Nova DB:

    controller# sh -c "nova-manage db sync" nova

    修改 nova 設定檔(/etc/nova/nova.conf),加入 DB 相關設定:

    [database]
    connection = mysql://nova:YOUR_NOVA_DBPASS@controller/nova

    移除原本存在的 SQLite 檔案:

    controller# rm /var/lib/nova/nova.sqlite

    3.3 設定 Identity Service 認證

    # 建立 nova 用的 user
    controlle# keystone user-create --name=nova --pass=YOUR_NOVA_PASSWORD --email=admin@example.com
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |  email   |        admin@example.com         |
    | enabled  |               True               |
    |    id    | 5cdbbe2f486641e5966199af5d743441 |
    |   name   |               nova               |
    | username |               nova               |
    +----------+----------------------------------+
    
    # 將 user / service Tenant / admin Role 連結
    controller# keystone user-role-add --user=nova --tenant=service --role=admin

    3.4 向 Identity Service 註冊 Nova 為 Compute Service

    # 建立 service 資訊
    controller# keystone service-create --name=nova --type=compute --description="OpenStack Compute"
    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    | description |        OpenStack Compute         |
    |   enabled   |               True               |
    |      id     | 87c4529e337e45df94a9c101d7097db4 |
    |     name    |               nova               |
    |     type    |             compute              |
    +-------------+----------------------------------+
    
    # 建立 API 服務端點資訊並與 service 連結
    controller# # keystone endpoint-create --service-id=$(keystone service-list | awk '/ compute / {print $2}') --publicurl=http://controller:8774/v2/%\(tenant_id\)s --internalurl=http://controller:8774/v2/%\(tenant_id\)s --adminurl=http://controller:8774/v2/%\(tenant_id\)s
    +-------------+-----------------------------------------------------+
    |   Property  |                        Value                        |
    +-------------+-----------------------------------------------------+
    |   adminurl  |       http://controller:8774/v2/%(tenant_id)s       |
    |      id     |           be0f81e5b41a453a920dd2360c713af6          |
    | internalurl |       http://controller:8774/v2/%(tenant_id)s       |
    |  publicurl  | --publicurl=http://controller:8774/v2/%(tenant_id)s |
    |    region   |                      regionOne                      |
    |  service_id |           87c4529e337e45df94a9c101d7097db4          |
    +-------------+-----------------------------------------------------+

    修改 nova 設定檔(/etc/nova/nova.conf),加入以下設定:

    [DEFAULT]
    auth_strategy = keystone
    
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_host = controller
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = service
    admin_user = nova
    admin_password = YOUR_NOVA_PASS

    3.5 啟動 Compute 相關服務

    controller# service nova-api restart
    controller# service nova-cert restart
    controller# service nova-consoleauth restart
    controller# service nova-scheduler restart
    controller# service nova-conductor restart
    controller# service nova-novncproxy restart

    3.6 驗證安裝是否成功

    # 透過 shell script 匯入 OS_USERNAME / OS_PASSWORD / OS_TENANT_NAME / OS_AUTH_URL 等環境變數
    controller# source ~/OpenStack/admin-openrc.sh
    
    # 查詢目前 compute host 可用的 image list (向 Glance 查詢)
    controller# nova image-list
    +--------------------------------------+---------------------+--------+--------+
    | ID                                   | Name                | Status | Server |
    +--------------------------------------+---------------------+--------+--------+
    | 0985b2f3-058e-4ab9-84e3-65c51f849408 | cirros-0.3.3-x86_64 | ACTIVE |        |
    | 77c0d5f8-1bcc-4937-932c-72f4b0eccbc3 | cirros-0.3.3-x86_64 | ACTIVE |        |
    +--------------------------------------+---------------------+--------+--------+

    4、設定 Compute Node

    設定好 controller 上的 compute service 之後,接著要來設定實際執行 VM instance 的 compute node。

    Compute node 主要的工作是接收來自 controller 的命令,並運行 VM instance。

    4.1 安裝操作 Hypervisor 用套件

    OpenStack 可以兼容多種 hypervisor (KVM / Xen / VMware ESXi / MS Hyper-V … etc),這邊以 KVM 為例,安裝相關操作套件:

    compute1# apt-get -y install nova-compute-kvm

    4.2 修改設定檔 (/etc/nova/nova.conf)

    # 設定 Message Queue 相關資訊
    rpc_backend = rabbit
    rabbit_host = controller
    rabbit_password = YOUR_RABBIT_PASS
    
    # 設定 compute node IP & 相關的 vnc server 位置
    my_ip = 10.0.0.31
    vnc_enabled = True
    vncserver_listen = 0.0.0.0
    vncserver_proxyclient_address = 10.0.0.31
    novncproxy_base_url = http://controller:6080/vnc_auto.html
    
    # 指定以 keystone 進行認證工作
    auth_strategy = keystone
    
    # 指定 Glace 服務所在位置(這邊設定在 controller 上)
    glance_host = controller
    
    # 資料庫相關設定
    [database]
    connection = mysql://nova:YOUR_NOVA_DB_PASSWORD@controller/nova
    
    # keystone 相關設定
    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_host = controller
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = service
    admin_user = nova
    admin_password = YOUR_KEYSTONE_PASSWORD

    4.3 檢查 compute node 是否具備硬體加速功能 for 虛擬化

    透過以下指令:

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

    若以上指令出現的數字為 0,表示目前 compute node 的 cpu 不支援虛擬化硬體加速,這時候就要編輯 /etc/nova/nova-compute.conf 檔案,將 virt_type 改成 qemu

    [libvirt]
    virt_type = qemu

    4.4 啟動 compute 服務

    # 移除不需要的 SQLite 檔案
    compute1# rm /var/lib/nova/nova.sqlite
    
    # 啟動 nova-compute 服務
    compute1# service nova-compute restart

    5、參考資料

    18 則留言:

    1. 看起來像是 Image Service(Glance) 沒有安裝好,你可以先檢查:

      1、controller 的 8774 port 是否有在 listen ?

      2、查詢 Glance 是否有向 Keystone 註冊服務 & 建立 API endpoint?

      回覆刪除
    2. 1.# netstat -nlp
      tcp 0 0 0.0.0.0:8774 0.0.0.0:* LISTEN 29439/python
      看起來是有在listen

      2.請問如何查詢??
      謝謝

      回覆刪除
    3. Glance 有沒有向 Keystone 註冊成功可以進到 controller 的 MySQL 檢查(因為 Glance & Keystone 在這個範例中都是裝在 controller 中的)。

      另外,你有執行 admin-openrc.sh 這個 script 將 OS_USERNAME / OS_PASSWORD / OS_TENANT_NAME / OS_AUTH_URL 等環境變數設定完成了嗎?

      回覆刪除
    4. 你好
      你說的是指在mysql databases裡的keystone中要有glance嗎?
      若是的話,我沒看到
      該從哪查找原因呢?
      我有執行 admin-openrc.sh
      謝謝

      回覆刪除
      回覆
      1. 請檢查 controller 中的 MySQL:

        1. glance 資料庫 是否存在

        2. keystone 資料庫中,查詢 "service" Table (SELECT * FROM keystone.service;),檢查是否有 type 為 image 的資料列存在,若不存在,請按照網頁(http://godleon.blogspot.tw/2014/09/openstack-ubuntu-1404-3-image-service.html) 章節 3.5 的步驟操作一遍,將 Glance 註冊到 Keystone 上

        PS. 所有的 service & API endpoint 都必須向 Keystone 註冊....

        刪除
    5. mysql> SELECT * FROM keystone.service;
      +----------------------------------+----------+--------------------------------------------------------------+---------+
      | id | type | extra | enabled |
      +----------------------------------+----------+--------------------------------------------------------------+---------+
      | 7d9846a0c4c546cab434abe96b4b1c53 | identity | {"name": "keystone", "description": "OpenStack Identity"} | 1 |
      | bfe1bc72e2a84c2b95d29397684bded9 | compute | {"name": "nova", "description": "OpenStack Compute"} | 1 |
      | fde83afc84db43308134f5ca303f8b9b | image | {"name": "glance", "description": "OpenStack Image Service"} | 1 |
      +----------------------------------+----------+--------------------------------------------------------------+---------+
      3 rows in set (0.00 sec)

      mysql> show databases;
      +--------------------+
      | Database |
      +--------------------+
      | information_schema |
      | glance |
      | keystone |
      | mysql |
      | nova |
      | performance_schema |
      +--------------------+
      6 rows in set (0.00 sec)

      好像都有您說的耶...
      還有其他可能原因嗎?
      我的ubuntu是14.04.1 LTS
      版本應該跟您一樣吧?

      謝謝您熱心回應我這新手 :-)

      回覆刪除
      回覆
      1. 我使用的 Ubuntu 版本是跟您相同的~

        建議你輸入以下指令,讓 openstack 輸出 debug 訊息來尋找真正原因~

        nova --debug image-list

        glance --debug image-list

        PS. 我也是新手,大家一起加油吧! XD

        刪除
    6. 作者已經移除這則留言。

      回覆刪除
    7. 您好
      您這段有多打一次--publicurl=
      # keystone endpoint-create --service-id=$(keystone service-list | awk '/ compute / {print $2}') --publicurl=--publicurl=http://controller:8774/v2/%\(tenant_id\)s --internalurl=http://controller:8774/v2/%\(tenant_id\)s --adminurl=http://controller:8774/v2/%\(tenant_id\)s

      回覆刪除
      回覆
      1. 我的出錯也是因為我偷懶用複製貼上而沒注意到 ><"

        刪除
      2. 阿對了,後來我有找到這個錯誤,不過我忘記把 Blog 的內容修正了....真是抱歉...

        您去修改 keystone 資料庫的 endpoint table,把 url 的內容修正,重新啟動服務,應該就會正常了!

        謝謝您的提醒! ^_^

        刪除
    8. 您好 想請問一下

      做到4.3 檢查 compute node 是否具備硬體加速功能 for 虛擬化

      一開始打指令是顯示0,最後照步驟去更改/etc/nova/nova-compute.conf裡的
      [libvirt]
      virt_type = qemu

      還是顯示0,是哪邊有出錯呢 還是系統本來就不支援呢
      我是用Ubuntu14.04圖形化界面的

      回覆刪除
      回覆
      1. 顯示 0 只是表示您的 compute node 的 CPU 不支援虛擬化硬體加速,跟您設定的 virt_type 沒什麼關係

        您只要確認你的 virt_type = qemu 就行了

        如果有支援虛擬化硬體加速(大於 0),才可以改成 kvm

        刪除
      2. 作者已經移除這則留言。

        刪除
      3. 意思是說顯示0沒關係
        直要有把virt_type = qemu 設好
        就算是顯示0 也可以繼續往下做了嗎?

        刪除
      4. 是的,顯示 0 沒關係

        只要將 virt_type 設定為 qemu 就可以繼續往下~

        刪除
    9. 您好:
      目前遇到一個問題,想請教大大
      在controller node 輸入nova image-list後
      出現以下的錯誤:
      ERROR (ConnectionError): HTTPConnectionPool(host='controller', port=8774): Max retries exceeded with url: /v2/e04fb9e442d04e189df4503f3e0f70d8/images/detail (Caused by : [Errno 111] Connection refused)

      有檢查過keystone,請問大大這是哪邊出錯了呢??找好久找不出來QAQ...

      回覆刪除
      回覆
      1. 剛剛我試著執行service nova-api restart,
        stop: Unknown instance:
        nova-api start/running, process 3820
        感覺這邊就有問題了

        netstat -nlp 似乎也沒有listen.....不過剛剛確認一圈,該裝的的有裝阿QAQ....

        刪除