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、參考資料

    2014年9月25日 星期四

    安裝 OpenStack @ Ubuntu 14.04 (3) - 安裝 Image Service (Glance)

    安裝 OpenStack @ Ubuntu 14.04 (3) - 安裝 Image Service (Glance)

    目錄

    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、Image Service 概觀

    在 OpenStack 中,Image Service 的用途在於讓使用者可以尋找/註冊/取得虛擬機器的映像檔來使用,而提供這樣的服務的專案稱為 Glance

    Glance 是用來管理虛擬磁碟的 image 之用,除了可以讓使用者新增 image 之外,也可以從正在運作的 server 上取得 snapshop 來作為 image 的備份或者是其他虛擬磁碟的 image。

    Glance 包含了以下四個主要部分:

    • glance-api

      • 接受來自其他服務的 API call
    • glance-registry

      • 管理 image 的 metadata 之用(例如:image 的大小 & 類型)。
    • Database

      • 儲存 image metadata 之用,可選擇 MySQL or SQLite。
    • 存放 image 的 storage repository

      • 存放 image 的位置有很多種不同的選擇,例如:一般的檔案系統、Object Storage、RADOS Block device、甚至是 Amazon S3 也可以。(但某些 repository 僅支援唯讀模式)

    OpenStack conceptual architecture

    以上是 OpenStack 的概念架構圖,從圖中可以看出 Glance 的定位:

    1. 可以將 image 存於 Swift 中
    2. 提供 image 給 Nova 作為執行 VM 之用
    3. 使用者可以透過 Horizon 呼叫 Glance API 來管理 image
    4. 在使用 Glance API 之前,都需要通過 Keystone 的認證

    3、安裝 Glance

    3.1 安裝套件

    這個範例會將 Glance 安裝在 controller 上,執行以下指令:

    $ apt-get install glance python-glanceclient

    3.2 設定資料庫

    原本預設 Glance 會將資料存於 SQLite 中,為了跟其他服務一致,以下把它改成使用 MySQL,首先先在 MySQL 中建立 glance 資料庫並給定權限:

    root@controller:~/OpenStack# mysql -u root -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 107
    Server version: 5.5.38-0ubuntu0.14.04.1 (Ubuntu)
    
    Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> create database glance;
    Query OK, 1 row affected (0.00 sec)
    
    mysql> grant all privileges on glance.* to 'glance'@'localohost' identified by 'YOUR_GLANCE_DBPASS';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> grant all privileges on glance.* to 'glance'@'%' identified by 'YOUR_DB_PASSWORD';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> exit

    3.3 修改設定

    接著修改 Glance API & Registry 的設定,分別是以下的兩個檔案:

    • /etc/glance/glance-api.conf
    • /etc/glance/glance-registry.conf

    修改 [database] 區段,移除原本的 SQLite 設定,改為以下內容:

    [database]
    connection = mysql://glance:YOUR_GLANCE_DBPASS@controller/glance

    3.4 建立 Glance 用 MySQL DB

    建立 MySQL DB for Glance:

    $ sh -c "glance-manage db_sync" glance

    3.5 將 Glance 與 Identity Service(Keystone) 連結

    每個 service 都必須跟 Identity Service(Keystone) 進行連結,以下分成兩個步驟:

    3.5.1 建立認證用帳號(Glance 管理者)

    # 建立認證用帳號 & E-Mail
    keystone user-create --name=glance --pass=YOUR_GLANCE_AUTH_PASS \
       --email=admin@example.com
    +----------+----------------------------------+
    | Property |              Value               |
    +----------+----------------------------------+
    |  email   |        admin@example.com         |
    | enabled  |               True               |
    |    id    | ec4848f8a9d342038668029c78f77565 |
    |   name   |              glance              |
    | username |              glance              |
    +----------+----------------------------------+
    
    # 指定使用 service Tenant 並隸屬於 admin Role
    $ keystone user-role-add --user=glance --tenant=service --role=admin

    3.5.2 註冊 Image Service

    同樣修改 API(/etc/glance/glance-api.conf) & Registry(/etc/glance/glance-registry.conf) 兩個設定檔,修改 [keystone_authtoken] & [paste_deploy] 區段內容如下:

    [keystone_authtoken]
    auth_uri = http://controller:5000
    auth_host = controller
    auth_port = 35357
    auth_protocol = http
    admin_tenant_name = service
    admin_user = glance
    admin_password = YOUR_GLANCE_AUTH_PASS
    
    [paste_deploy]
    flavor = keystone

    最後下指令將 Glance 註冊至 Keystone 中並產生 API 服務端點,讓 OpenStack 其他的 service 可以知道 Image Service(Glance) 所在的位置:

    # 註冊 Glance 服務
    $ keystone service-create --name=glance --type=image --description="OpenStack Image Service"
    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    | description |     OpenStack Image Service      |
    |   enabled   |               True               |
    |      id     | 95a34885c3dc486f98153cf2d3740355 |
    |     name    |              glance              |
    |     type    |              image               |
    +-------------+----------------------------------+
    
    # 註冊 Glance API 端點服務
    $ keystone endpoint-create --service-id=$(keystone service-list | awk '/ image / {print $2}') --publicurl=http://controller:9292 --internalurl=http://controller:9292 --adminurl=http://controller:9292
    +-------------+----------------------------------+
    |   Property  |              Value               |
    +-------------+----------------------------------+
    |   adminurl  |      http://controller:9292      |
    |      id     | 4ca758a4fe4049c491a5c5ace5b792f2 |
    | internalurl |      http://controller:9292      |
    |  publicurl  |      http://controller:9292      |
    |    region   |            regionOne             |
    |  service_id | 95a34885c3dc486f98153cf2d3740355 |
    +-------------+----------------------------------+

    3.6 啟動服務

    最後重新啟動 Glance service 讓之前的設定生效:

    $ service glance-registry restart
    $ service glance-api restart

    4、驗證 Glance 安裝是否成功

    我們可以透過下載隨意一個 linux image 並註冊到 Glance 來測試安裝是否成功。

    下載 Linux image:

    $ mkdir /tmp/images
    $ cd /tmp/images/
    $ wget http://cdn.download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img

    將下載的 Linux image 註冊到 Glance:

    # 透過 shell script 匯入 OS_USERNAME / OS_PASSWORD / OS_TENANT_NAME / OS_AUTH_URL 等環境變數
    $ source ~/OpenStack/admin-openrc.sh
    
    # 註冊 image 至 Glance
    $ glance image-create --name "cirros-0.3.3-x86_64" --disk-format qcow2 --container-format bare --is-public true --progress < cirros-0.3.3-x86_64-disk.img
    [=============================>] 100%
    +------------------+--------------------------------------+
    | Property         | Value                                |
    +------------------+--------------------------------------+
    | checksum         | 133eae9fb1c98f45894a4e60d8736619     |
    | container_format | bare                                 |
    | created_at       | 2014-09-24T23:29:42                  |
    | deleted          | False                                |
    | deleted_at       | None                                 |
    | disk_format      | qcow2                                |
    | id               | 77c0d5f8-1bcc-4937-932c-72f4b0eccbc3 |
    | is_public        | True                                 |
    | min_disk         | 0                                    |
    | min_ram          | 0                                    |
    | name             | cirros-0.3.3-x86_64                  |
    | owner            | 27466ca061e34b469f84da1e57b5605e     |
    | protected        | False                                |
    | size             | 13200896                             |
    | status           | active                               |
    | updated_at       | 2014-09-24T23:29:42                  |
    | virtual_size     | None                                 |
    +------------------+--------------------------------------+

    因為 Linux image 都可以直接在網路上取得,所以我們也不需要真的下載到本機空間,也可以直接透過 copy-from 參數來使用外部的連結來註冊:

    # 使用 copy-from 變數註冊來自外部的 image
    $ glance image-create --name "cirros-0.3.3-x86_64" --disk-format qcow2 --container-format bare --is-public true --copy-from http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img
    +------------------+--------------------------------------+
    | Property         | Value                                |
    +------------------+--------------------------------------+
    | checksum         | None                                 |
    | container_format | bare                                 |
    | created_at       | 2014-09-24T23:36:17                  |
    | deleted          | False                                |
    | deleted_at       | None                                 |
    | disk_format      | qcow2                                |
    | id               | 0985b2f3-058e-4ab9-84e3-65c51f849408 |
    | is_public        | True                                 |
    | min_disk         | 0                                    |
    | min_ram          | 0                                    |
    | name             | cirros-0.3.3-x86_64                  |
    | owner            | 27466ca061e34b469f84da1e57b5605e     |
    | protected        | False                                |
    | size             | 13200896                             |
    | status           | queued                               |
    | updated_at       | 2014-09-24T23:36:17                  |
    | virtual_size     | None                                 |
    +------------------+--------------------------------------+

    最後透過以下指令可以查詢目前 image 的註冊狀況:

    $ glance image-list
    +--------------------------------------+---------------------+-------------+------------------+----------+--------+
    | ID                                   | Name                | Disk Format | Container Format | Size     | Status |
    +--------------------------------------+---------------------+-------------+------------------+----------+--------+
    | 77c0d5f8-1bcc-4937-932c-72f4b0eccbc3 | cirros-0.3.3-x86_64 | qcow2       | bare             | 13200896 | active |
    | 0985b2f3-058e-4ab9-84e3-65c51f849408 | cirros-0.3.3-x86_64 | qcow2       | bare             | 13200896 | active |
    +--------------------------------------+---------------------+-------------+------------------+----------+--------+
    

    2014年9月19日 星期五

    安裝 OpenStack @ Ubuntu 14.04 (2) - 設定 Identity Service (Keystone)

    安裝 OpenStack @ Ubuntu 14.04 (2) - 設定 Identity Service (Keystone)

    目錄

    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、Identity Service 概觀

    Identity Service 在整個 OpenStack 架構中提供了兩項功能:

    1. 認證 &授權
    2. 提供可用服務的 API 服務端點目錄資訊

    Identity Service 提供了 Role-based 的管理概念,並提供傳統的 UserName/Password & Token 的認證方式。

    以下的來自官網的圖,描述了 Identity Service(Keystone) 的完整作業流程:
    Keystone 作業流程

    2.1 重要名詞說明

    Identity Service 有些觀念要先清楚,列出比較容易搞混的:

    2.1.1 Tenant

    tenant 是 identity 服務的操作者用來將特定的 resource 或是 identity objects 區隔。

    每一個 tenant 可能會對應到一個客戶,或是一個帳號,也有可能是一個專案。

    2.1.2 Role

    role 包含了指定功能的使用權限,管理者可以根據不同的 role 給定不同的權限,再將 role 指定給 user,每個 user 可以同時被指定為多個 role 藉以授予系統存取權限。

    Keystone 中已經有一個預設的 Role,名稱為 _member_

    3、安裝 Identity Service

    接著要安裝認證用的服務:

    apt-get -y install keystone

    安裝完一卡車的套件後,這裡先為 keystone 準備儲存認證用的資料庫(MySQL),輸入以下指令:

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

    接著修改 keystone 設定,將資料庫指向剛剛建立的 MySQL DB,編輯 /etc/keystone/keystone.conf

    修改 [database] 區段的 connection 設定如下:

    [database]
    connection = mysql://keystone:YOURKEYSTONEDBPASSWORD@controller/keystone

    並移除原本的 SQLite DB:

    rm /var/lib/keystone/keystone.db

    建立認證服務用的資料庫 table:

    su -s /bin/sh -c “keystone-manage db_sync” keystone

    產生 shared secret:

    openssl rand -hex 10

    編輯 keystone 設定(/etc/keystone/keystone.conf),加入以下兩個設定:

    [DEFAULT]
    admin_token = YOUR_SHARED_SECRET   #填入上一個步驟中使用 openssl 指令產生的 shared secret
    log_dir = /var/log/keystone

    重新啟動 keystone 服務:

    service keystone restart

    預設 keystone 的 token 是沒有過期的設定,因此透過以下指令將 token 的過期時間設定為 1 小時:

    (crontab -l -u keystone 2>&1 | grep -q token_flush) || echo ‘@hourly /usr/bin/keystone-manage token_flush >/var/log/keystone/keystone-tokenflush.log 2>&1’ >> /var/spool/cron/crontabs/keystone

    安裝好 Identity Service 之後,接著就要來設定認證相關資訊了。

    4、設定 user / role / tenant

    在建立 user / role / tenant 之前,必須先設定好 OS_SERVICE_TOKEN & OS_SERVICE_ENDPOINT 兩個環境變數,目的是為了以管理者的身分啟用並註冊 Identity Service:

    $ export OS_SERVICE_TOKEN=YOUR_ADMIN_TOKEN
    $ export OS_SERVICE_ENDPOINT=http://controller:35357/v2.0

    4.1 新增 User

    # 新增 user - admin
    $ keystone user-create --name=admin --pass=ADMIN_PASS --email=ADMIN_EMAIL
    
    # 新增 user - demo
    $ keystone user-create --name=demo --pass=DEMO_PASS --email=DEMO_EMAIL

    4.2 新增 Role

    # 新增 role - admin
    $ keystone role-create --name=admin

    Keystone 已經內建 _member_ 為預設 role,之後會將一般的帳號與 _member_ 進行連結。

    4.3 新增 tenant

    最後新增兩個 tenant 類型,分別是管理者(admin)以及一般使用者(demo):

    # 新增 tenant - admin
    $ keystone tenant-create --name=admin --description="Admin Tenant"
    
    # 新增 tenant - demo
    $ keystone tenant-create --name=demo --description="Demo Tenant"

    4.4 將 user / role / tenant 進行連結

    # 將 user(admin) 與 role(admin) & tenant(admin) 連結
    $ keystone user-role-add --user=admin --tenant=admin --role=admin
    
    # 將 user(admin) 與 role(_member_) & tenant(admin) 連結
    $ keystone user-role-add --user=admin --role=_member_ --tenant=admin
    
    # 將 user(demo) 與 role(_member_) & tenant(demo) 連結
    $ keystone user-role-add --user=demo --role=_member_ --tenant=demo

    4.5 設定 OpenStack services 之間用的認證資訊

    同樣的,OpenStack 中不同的 service 也需要 username / role / tenant 來進行認證並存取其他的 service,以下建立 service 用的 username / role / tenant:

    # 建立 service 用 user - service_user
    $ keystone user-create --name=service_user --pass=SERVICE_USER_PASS --email=SERVICE_USER_EMAIL
    
    # 建立 service 用 role
    $ keystone role-create --name=service_role
    
    # 建立 service 用 tenant
    $ keystone tenant-create --name=service --description="Service Tenant"
    
    # 將 user(service_user) 與 role(service_role) & tenant(service) 連結
    $ keystone user-role-add --user=service_user --role=service_role --tenant=service

    5、定義 services & API 服務端點

    之前提過 Identity Service 其中一個重要功能是「提供可用服務的 API 服務端點目錄資訊」,因此安裝好的服務都必須向 Identity Service 註冊,就連 Identity Service 自己也不例外。

    # 註冊 keystone service
    $ keystone service-create --name=keystone --type=identity --description="OpenStack Identity"
    
    # 設定 Identity Service 的 API 服務端點
    $ keystone endpoint-create --service-id=$(keystone service-list | awk '/ identity / {print $2}') --publicurl=http://controller:5000/v2.0 --internalurl=http://controller:5000/v2.0 --adminurl=http://controller:35357/v2.0

    6、驗證 Identity Service 是否安裝成功

    為了確保 Identity Service 安裝正確,首先清除 OS_SERVICE_TOKEN & OS_SERVICE_ENDPOINT 兩個環境變數。

    這兩個環境變數用途只是為了以管理者的身分設定 & 註冊 Identity Service 之用。

    $ unset OS_SERVICE_TOKEN OS_SERVICE_ENDPOINT

    6.1 進行 name-based 認證

    $ keystone --os-username=admin --os-password=YOUR_ADMIN_PASS --os-auth-url=http://controller:35357/v2.0 token-get

    這個指令會取得有效期間為一個小時(上面有設定)的 token,並搭配指定 user 的 id 資訊。

    【註】有 token 資訊表示 Identity Service 正確地被安裝 & 註冊

    6.2 進行 tenant-based 認證

    $ keystone --os-username=admin --os-password=YOUR_ADMIN_PASS --os-tenant-name=admin --os-auth-url=http://controller:35357/v2.0 \
      token-get

    這個指令會取得有效期間為一個小時(上面有設定)的 token,並搭配指定 user & tenant 的 id 資訊。

    【註】有 token 資訊表示 Identity Service 正確地被安裝 & 註冊

    6.3 簡化指令的方式

    看上面這麼一大串指令,看了頭都暈了,其實就是指定了好幾個參數,可以設定一個 bash 檔,指定所需要的環境變數,就可以將指令簡化,建立檔案 admin-openrc.sh,並填入以下內容:

    export OS_USERNAME=admin
    export OS_PASSWORD=YOUR_ADMIN_PASS
    export OS_TENANT_NAME=admin
    export OS_AUTH_URL=http://controller:35357/v2.0

    透過以下指令就可以取得全新的 token:

    $ source admin-openrc.sh
    $ keystone token-get

    最後檢視一下之前設定的 user / role / tenant 是否都有對應正確:

    # 檢視目前的 user 清單 
    $ keystone user-list
    +----------------------------------+--------------+---------+-------------------+
    |                id                |     name     | enabled |       email       |
    +----------------------------------+--------------+---------+-------------------+
    | eb54ed5c89e1411a9db5cadfd825ae42 |    admin     |   True  | admin@example.com |
    | bc1ae50e167f45edb064e582702c5792 |     demo     |   True  | admin@example.com |
    | 877f000de0064ad0a2ef33519af6cc87 | service_user |   True  | admin@example.com |
    +----------------------------------+--------------+---------+-------------------+
    
    # 檢視 role 與 user(admin) 的對應資訊
    $ keystone user-role-list --user admin --tenant admin
    +----------------------------------+----------+----------------------------------+----------------------------------+
    |                id                |   name   |             user_id              |            tenant_id             |
    +----------------------------------+----------+----------------------------------+----------------------------------+
    | 9fe2ff9ee4384b1894a90878d3e92bab | _member_ | afea5bde3be9413dbd60e479fddf9228 | e519b772cb43474582fa303da62559e5 |
    | 5d3b60b66f1f438b80eaae41a77b5951 |  admin   | afea5bde3be9413dbd60e479fddf9228 | e519b772cb43474582fa303da62559e5 |
    +----------------------------------+----------+----------------------------------+----------------------------------+

    7、參考資料

    2014年9月10日 星期三

    安裝 OpenStack @ Ubuntu 14.04 (1) - 基本環境設定

    安裝 OpenStack @ Ubuntu 14.04 (1) - 基本環境設定

    目錄

    1、前言

    這次 OpenStack 的安裝過程中,在網路的部分選擇使用 Neutron 來管理,不使用 nova-network,因此需要額外一個 Network Node 來處理網路的工作,如下圖所示:

    Three-node architecture with OpenStack Networking (Neutron)

    2、安裝環境說明

    • 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

    3、套件安裝

    3.1 時間同步

    架設 IaaS 平台,機器間的時間同步是非常重要的,因此這邊要安裝 ntp client 的處理這個部分的需求。

    apt-get -y install ntp

    3.2 資料庫安裝 & 設定

    OpenStack 在很多部分的控制都仰賴資料庫來處理,因此資料庫的安裝 & 設定也是相當重要的一環,這邊使用 MySQL 作為資料庫,而僅有 controller 需要安裝 mysql server,其他 node 則是安裝 python mysql client 即可。

    3.2.1 Controller

    安裝 MySQL Server:

    apt-get -y install python-mysqldb mysql-server

    編輯 /etc/mysql/my.cnf,並將以下內容加到 [mysqld] 區段中:

    bind-address = 10.0.0.11    #原本的 bind-address 要移除
    default-storage-engine = innodb
    innodb_file_per_table
    collation-server = utf8_general_ci
    init-connect = 'SET NAMES utf8'
    character-set-server = utf8

    重新啟動 MySQL Server:

    service mysql restart

    3.2.2 其他 node

    安裝 python mysql client:

    apt-get -y install python-mysqldb

    3.3 OpenStack 套件

    加入 apt 套件庫資訊並更新套件:

    apt-get -y install python-software-properties
    add-apt-repository cloud-archive:icehouse
    apt-get update
    apt-get -y dist-upgrade

    若是 Ubuntu 的其他版本,apt repository 的資訊可以參考此處

    3.4 Messaging Server

    OpenStack 使用 message broker 來整合不同服務之間的運作 & 狀態資訊,一般都是在 contoller node 上執行。

    不同的 Linux 套件有其所支援的 message broker,而 Ubuntu 使用的是 RabbitMQ

    在 contoller node 上使用以下指令安裝 RabbitMQ:

    apt-get -y install rabbitmq-server

    安裝好 RabbitMQ 之後,會自動產生一個名為 guest 的使用者帳號,以下的範例所使用的就是這個帳號(正式環境建議另外建立帳號),因此來改一下密碼:

    rabbitmqctl change_password guest YOURMESSAGEBROKERPASSWORD

    之後有使用到 message broker 的 OpensStack 服務,就可以在設定檔中設定 RabbitMQ 的密碼,就可以使用到 message broker 的服務了!

    4、參考資料