OpenStack Kolla 初體驗

Kolla 提供 OpenStack 生產環境就緒的容器與部署工具,其具備快速、擴展、可靠等特性,並提供社群版本的最佳本版升級實現。

節點配置

本安裝將使用三台實體主機與一台虛擬機器來進行簡單叢集部署,主機規格如以下所示:

Role RAM CPUs Disk IP Address
controller1 8 GB 4vCPU 250 GB 10.0.0.11
network1 2 GB 1vCPU 250 GB 10.0.0.21
compute1 8 GB 8vCPU 500 GB 10.0.0.31
docker-registry 2 GB 1vCPU 50 GB 10.0.0.90

作業系統皆為Ubuntu Server 14.04

另外每台實體主機的網卡網路分別為以下:

Role Management Tunnel Public
controller1 eth0 eth1 eth2
network1 eth0 eth1 eth2
compute1 eth0 eth1 eth2

網卡若是實體主機,請設定為固定 IP,如以下:

auto eth0
iface eth0 inet static
address 10.0.0.11
netmask 255.255.255.0
gateway 10.0.0.1
dns-nameservers 8.8.8.8

若想修改主機的網卡名稱,可以編輯/etc/udev/rules.d/70-persistent-net.rules

其中network節點的 Public 需設定網卡為以下:

auto <ethx>
iface <ethx> inet manual
up ip link set dev $IFACE up
down ip link set dev $IFACE down

事前準備

在開始部署 OpenStack 之前,我們需要先將一些相依軟體與函式庫安裝完成,並且需要部署一用於存取映像檔的倉庫(Docker registry)。

部署 Docker Registry

首先進入到 docker-registry 節點,本教學採用一台虛擬機作為部署使用,並安裝 Docker engine:

$ curl -fsSL "https://get.docker.com/" | sh

安裝完成 Docker engine 後,透過以下指令建置 Docker registry:

$ docker run -d -p 5000:5000 --restart=always --name registry \
-v $(pwd)/data:/var/lib/registry \
registry:2

接著為了方便檢視 Docker image,這邊另外部署 Docker registry UI:

$ docker run -d -p 8080:80 \
-e ENV_DOCKER_REGISTRY_HOST=10.26.1.49 \
-e ENV_DOCKER_REGISTRY_PORT=5000 \
konradkleine/docker-registry-frontend:v2

完成以上即可透過瀏覽器查看該主機 8080 Port。也可以透過以下指令檢查是否部署成功:

$ docker pull ubuntu:14.04
$ docker tag ubuntu:14.04 localhost:5000/ubuntu:14.04
$ docker push localhost:5000/ubuntu:14.04

The push refers to a repository [localhost:5000/ubuntu]
447f88c8358f: Pushed
df9a135a6949: Pushed
...

其他 Docker registry 列表:

部署節點準備

當完成上述後,即可進行部署節點的相依軟體安裝,首先在每台節點透過以下指令更新與安裝一些套件:

$ sudo apt-get update -y && sudo apt-get upgrade -y
$ sudo apt-get install -y python-pip python-dev
$ curl -fsSL "https://get.docker.com/" | sh
$ sudo timedatectl set-timezone Asia/Taipei

由於使用Ubuntu server 14.04,故需要更新 Kernel:

$ sudo apt-get install -y linux-image-generic-lts-wily

接著更新 pip,並安裝 docker-python 函式庫:

$ sudo pip install -U pip docker-py

編輯每台節點的/etc/default/docker檔案,加入以下內容:

DOCKER_OPTS="--insecure-registry <registry-ip>:5000"

這邊{registry-ip}為 Docker registry 的 IP 位址。若使用 Ubuntu Server 16.04 版本的話,需要編輯/lib/systemd/system/docker.service檔案,修改以下:

EnvironmentFile=-/etc/default/%p
ExecStart=/usr/bin/dockerd -H fd:// \
$DOCKER_OPTS

完成上述後,需要 reload service:

$ sudo systemctl daemon-reload

接著編輯每台節點的/etc/rc.local檔案,加入以下內容:

mount --make-shared /run

# 在 compute 節點額外加入
mount --make-shared /var/lib/nova/mnt

接著在compute1節點執行以下指令:

sudo mkdir -p /var/lib/nova/mnt /var/lib/nova/mnt1
sudo mount --bind /var/lib/nova/mnt1 /var/lib/nova/mnt
sudo mount --make-shared /var/lib/nova/mnt

完成後重新啟動每台節點

當上述步驟都完成後,進入到controller1root使用者執行以下指令安裝與設定額外套件:

$ sudo apt-get install -y software-properties-common
$ sudo apt-add-repository -y ppa:ansible/ansible && sudo apt-get update
$ sudo apt-get install -y ansible libffi-dev libssl-dev gcc git

NTP 部分可自行設定,這邊不再說明。

接著繼續在controller1節點的root使用者執行以下指令:

$ ssh-keygen -t rsa
$ cat .ssh/id_rsa.pub >> .ssh/authorized_keys

複製controller1節點的root底下的.ssh/id_rsa.pub公有金鑰到其他節點的root使用者底下的.ssh/authorized_keys

建立 OpenStack Kolla Docker 映像檔

在使用 Kolla 部署 OpenStack 叢集之前,我們需要預先建立用於部署的映像檔,才能進行節點的部署。首先進入到controller1節點,並下載 Kolla 專案:

$ git clone "https://github.com/openstack/kolla.git" -b stable/newton
$ cd kolla && pip install .
$ pip install tox python-openstackclient && tox -e genconfig
$ cp -r etc/kolla /etc/

接著執行指令進行建立 Docker 映像檔,若不指定名稱預設下將建立全部映像檔,如以下:

$ kolla-build --base ubuntu --type source --registry {registry-ip}:5000 --push

這邊{registry-ip}為 Docker registry 的 IP 位址。

若要改變 OS 與版本,可以編輯/etc/kolla/kolla-build.conf檔案修改以下內容:

base = centos
base_tag = 3.0.3
push = true
install_type = rdo
registry = {registry-ip}:5000

可參考官方文件 Building Container Images

當映像檔建置完成後,即可查看docker-regisrtry節點的 UI 介面,來確認是否上傳成功。

部署 OpenStack 節點

當完成映像檔建立後,即可開始進行部署 OpenStack 節點。

首先到controller1進入剛下載的kolla-ansible專案目錄,並編輯ansible/inventory/multinode檔案,修改以下內容:

[control]
controller1

[network]
network1

[compute]
compute1

[storage]
controller1

這邊由於機器不夠,所以將 storage 也放到 controller。

接著編輯/etc/kolla/globals.yml檔案,修改以下內容:

config_strategy: "COPY_ALWAYS"
kolla_base_distro: "ubuntu"
kolla_install_type: "source"
openstack_release: "3.0.3"
kolla_internal_vip_address: "10.0.0.10"
docker_registry: "10.0.0.90:5000"
network_interface: "eth0"
tunnel_interface: "eth1"
neutron_external_interface: "eth2"
neutron_plugin_agent: "openvswitch"

# OpenStack service
enable_cinder: "yes"
enable_neutron_lbaas: "yes"
cinder_volume_group: "cinder-volumes"

若要將 API 開放給 Public network 存取的話,需要設定以下內容:

kolla_external_vip_address: "10.26.1.251"
kolla_external_vip_interface: "eth3"

(Option)建立 Cinder LVM volume group:

$ sudo apt-get install lvm2 -y
$ sudo pvcreate /dev/sdb
$ sudo vgcreate cinder-volumes /dev/sdb
$ sudo pvdisplay

--- Physical volume ---
PV Name /dev/sdb
VG Name cinder-volumes
PV Size 465.76 GiB / not usable 4.02 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 119234
Free PE 119234
Allocated PE 0
PV UUID 5g01hz-Ebds-EVSF-yGm4-evNm-5Kfp-2h8kUR

然後透過以下指令產生亂數密碼:

$ kolla-genpwd

接著要執行預先檢查確認節點是否可以進行部署,透過以下指令:

$ kolla-ansible prechecks -i ansible/inventory/multinode

PLAY RECAP *********************************************************************
compute1 : ok=8 changed=0 unreachable=0 failed=0
controller1 : ok=35 changed=0 unreachable=0 failed=0
network1 : ok=29 changed=0 unreachable=0 failed=0

若中途發生錯誤,請檢查錯誤訊息。

確認沒問題後即可部署 OpenStack,透過以下指令進行:

$ kolla-ansible deploy -i ansible/inventory/multinode
PLAY RECAP *********************************************************************
compute1 : ok=44 changed=31 unreachable=0 failed=0
controller1 : ok=154 changed=96 unreachable=0 failed=0
network1 : ok=37 changed=28 unreachable=0 failed=0

P.S. 若發生映像檔無法下載,請自行透過以下指令傳到該節點:

$ docker save {image} > image.tar
$ scp image.tar network1:~/
$ ssh network1 "docker load < image.tar"

驗證服務

完成後,就可以產生 Credential 檔案來進行系統驗證:

$ kolla-ansible post-deploy
$ source /etc/kolla/admin-openrc.sh

透過 OpenStack Client 來檢查 Keystone,並查看所有使用者:

$ openstack user list

+----------------------------------+-------------------+
| ID | Name |
+----------------------------------+-------------------+
| 19af62000d334c4d9de3aa29b9fd06df | heat_domain_admin |
| 83fa8ba1deff46e58e716470dbdaeb03 | heat |
| 9661e2a4b1f648a6a3ed5c52f22c52bb | nova |
| 9fa2a71716d046a893dcbaef3d7375ce | admin |
| acdfdc4fae2248b0af4c8788a9858cf3 | glance |
| b683b3c611dd4bdba2c25321a0f03cf0 | cinder |
| dc57ebf4e6c548e990767f00ffda19d8 | neutron |
+----------------------------------+-------------------+

透過 OpenStack Client 檢查 Nova 的服務列表:

$ openstack compute service list

+----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+
| Id | Binary | Host | Zone | Status | State | Updated_at | Disabled Reason |
+----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+
| 3 | nova-consoleauth | controller1 | internal | enabled | up | 2016-08-16T05:40:16.000000 | - |
| 5 | nova-scheduler | controller1 | internal | enabled | up | 2016-08-16T05:40:20.000000 | - |
| 6 | nova-conductor | controller1 | internal | enabled | up | 2016-08-16T05:40:12.000000 | - |
| 10 | nova-compute | compute1 | nova | enabled | up | 2016-08-16T05:40:16.000000 | - |
+----+------------------+-------------+----------+---------+-------+----------------------------+-----------------+

透過 OpenStack Client 檢查 Neutron 的服務列表:

$ openstack network agent list
+------------------+------------------+----------+-------------------+-------+----------------+------------------+
| id | agent_type | host | availability_zone | alive | admin_state_up | binary |
+------------------+------------------+----------+-------------------+-------+----------------+------------------+
| 2254dcb0-9d5b- | Open vSwitch | network1 | | :-) | True | neutron- |
| 46da-b1f2-b03719 | agent | | | | | openvswitch- |
| 5913b1 | | | | | | agent |
| acb81021-2efd-4b | DHCP agent | network1 | nova | :-) | True | neutron-dhcp- |
| b6-9af7-a3df95ce | | | | | | agent |
| 479b | | | | | | |
| b564c005-779d- | Metadata agent | network1 | | :-) | True | neutron- |
| 45f4-b10f- | | | | | | metadata-agent |
| 788bb788491b | | | | | | |
| d95d75e5-6429-44 | Open vSwitch | compute1 | | :-) | True | neutron- |
| 65-aef1-a6a9f4e7 | agent | | | | | openvswitch- |
| 995f | | | | | | agent |
| e0dbbff4-d7a7-4f | L3 agent | network1 | nova | :-) | True | neutron-l3-agent |
| a2-8fa2-b3d3de42 | | | | | | |
| d899 | | | | | | |
+------------------+------------------+----------+-------------------+-------+----------------+------------------+

從網路上下載一個測試用映像檔cirros-0.3.4-x86_64,並上傳至 Glance 服務:

$ wget "http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img"
$ openstack image create "cirros-0.3.4-x86_64" \
--file cirros-0.3.4-x86_64-disk.img \
--disk-format qcow2 --container-format bare \
--public

這邊可以透過 Neutron client 來查看建立外部網路:

$ openstack network create --external \
--provider-physical-network physnet1 \
--provider-network-type flat public1

$ openstack subnet create --no-dhcp --network public1 \
--allocation-pool start=10.26.1.230,end=10.26.1.240 \
--subnet-range 10.26.1.0/24 --gateway 10.26.1.254 public1-subnet

$ openstack network create --provider-network-type vxlan admin-net

$ openstack subnet create --subnet-range 192.168.10.0/24 \
--network admin-net --gateway 192.168.10.1 \
--dns-nameserver 8.8.8.8 admin-subnet

$ openstack router create admin-router
$ openstack router add subnet admin-router admin-subnet
$ openstack router set --external-gateway public1 admin-router

建立 flavor 來提供虛擬機樣板:

openstack flavor create --id 1 --ram 512 --disk 1 --vcpus 1 m1.tiny
openstack flavor create --id 2 --ram 2048 --disk 20 --vcpus 1 m1.small
openstack flavor create --id 3 --ram 4096 --disk 40 --vcpus 2 m1.medium
openstack flavor create --id 4 --ram 8192 --disk 80 --vcpus 4 m1.large
openstack flavor create --id 5 --ram 16384 --disk 160 --vcpus 8 m1.xlarge

上傳 Keypair 來提供虛擬機 SSH 登入認證用:

$ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

開啟一台虛擬機進行測試:

$ openstack server create --image cirros-0.3.4-x86_64 \
--flavor m1.tiny \
--nic net-id=admin-net \
--key-name mykey \
admin-instance

查看 instance 列表:

$ openstack server list

+--------------------------------------+----------------+--------+------------------------+---------------------+
| ID | Name | Status | Networks | Image Name |
+--------------------------------------+----------------+--------+------------------------+---------------------+
| bb3b31b6-56a4-4c68-bd53-b7efb451f0fc | admin-instance | ACTIVE | admin-net=192.168.10.6 | cirros-0.3.4-x86_64 |
+--------------------------------------+----------------+--------+------------------------+---------------------+
Share Comments