Network Time Protocol (NTP)

由於要讓各節點的時間能夠同步,我們需要安裝ntp套件來提供服務,這邊推薦將 NTP Server 安裝於 Controller 上,再讓其他節點進行關聯即可。

Controller 節點設定

在 Controller 節點上,我們可以以下指令來安裝套件:

$ sudo yum install -y ntp

P.S NTP Server 也可以考慮使用 chrony,透過以下方式安裝:

$ sudo yum install chrony

若要修改設定檔則編輯/etc/chrony.conf。基本設定上與 ntp 雷同。這邊要在設定檔多加入allow 10.0.0.0/24

完成安裝後,預設 NTP 會透過公有的伺服器來同步時間,但也可以修改/etc/ntp.conf來選擇伺服器:

restrict 10.0.0.0 mask 255.255.255.0 nomodify notrap

server 2.tw.pool.ntp.org
server 3.asia.pool.ntp.org
server 0.asia.pool.ntp.org

NTP_SERVER 替換為主機名稱或更準確的(lower stratum) NTP 伺服器 IP 地址。這個設定支援多個 server 關鍵字。

如果系統有/var/lib/ntp/ntp.conf.dhcp存在,請將它刪除。

設定正確的 Time Zone:

$ sudo timedatectl set-timezone Asia/Taiwan

完成後重新啟動 NTP 服務:

sudo systemctl enable ntp.service
sudo systemctl start ntp.service

Chrony 使用以下指令:

$ sudo systemctl enable chronyd.service
$ sudo systemctl start chronyd.service

其他節點設定

在其他節點一樣安裝 NTP:

$ sudo yum install -y ntp

P.S NTP Server 也可以考慮使用 chrony,透過以下方式安裝:

$ sudo yum install chrony

若要修改設定檔則編輯/etc/chrony.conf。基本設定上與 ntp 雷同。

完成安裝後,編輯/etc/ntp.conf檔案,註解掉所有server的參數,並將其設定為 Controller IP:

server 10.0.0.11 iburst

如果系統有/var/lib/ntp/ntp.conf.dhcp存在,請將它刪除。

設定正確的 Time Zone:

$ sudo timedatectl set-timezone Asia/Taiwan

完成後重新啟動 NTP 服務:

sudo systemctl enable ntp.service
sudo systemctl start ntp.service

Chrony 使用以下指令:

$ sudo systemctl enable chronyd.service
$ sudo systemctl start chronyd.service

驗證設定

當完成上述設定後,建議在進一步的安裝之前驗證NTP 是否已同步。有些節點,特別是哪些引用了 Controller 節點,需要花費一些時間去同步。

可以在 Controller 節點,下該指令:

$ ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp-server1     192.0.2.11       2 u  169 1024  377    1.901   -0.611   5.483
+ntp-server2     192.0.2.12       2 u  887 1024  377    0.922   -0.246   2.864

Chrony 使用以下指令:

$ chronyc sources

也可以透過以下指令,進一步對 Controller 做驗證:

$ ntpq -c assoc
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 20487  961a   yes   yes  none  sys.peer    sys_peer  1
  2 20488  941a   yes   yes  none candidate    sys_peer  1

當都沒問題後,可以在其他節點下達該指令:

$ ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*controller      192.0.2.21       3 u   47   64   37    0.308   -0.251   0.079

Chrony 使用以下指令:

$ chronyc sources

安裝 OpenStack 套件

接下來我們需在每個節點安裝 Openstack 相關套件,但由於 CentOS 的版本差異,會影響 OpenStack 支援的版本,在安裝時要特別注意是否支援,才會有對應的 Repository 可以使用。

首先透過以下指令加入 Repository 來獲取套件:

$ sudo yum install centos-release-openstack-mitaka

若要安裝 pre-release 測試版本可以使用以下指令:

$ sudo yum install yum-plugin-priorities
$ cd /etc/yum.repos.d/
$ curl -O http://trunk.rdoproject.org/centos7/delorean-deps.repo
$ curl -O http://trunk.rdoproject.org/centos7/current-passed-ci/delorean.repo

若要安裝 liberty,修改為centos-release-openstack-liberty

更新 Repository 與系統核心套件:

$ sudo yum upgrade

如果 Upgrade 包含了新的核心套件的話,請重新開機。

由於 RHEL 與 CentOS 預設會使用 SELinux,故要安裝 openstack-selinux 來自動管理安全策略:

$ sudo yum install openstack-selinux

SQL database 安裝

大部份的 OpenStack 套件服務都是使用 SQL 資料庫來儲存訊息,該資料庫一般運作於Controller上。以下我們使用了 MariaDB 或 MySQL 來當作各套件的資訊儲存。OpenStack 也支援了其他資料庫,諸如:PostgreSQL。這邊透過以下指令來安裝 MariaDB 套件:

$ sudo yum install mariadb mariadb-server python2-PyMySQL

記住 Python MySQL 和 MariaDB 是相容的。

完成安裝後,需要建立並編輯/etc/my.cnf.d/openstack.cnf來設定資料庫。在[mysqld]部分加入以下修改:

[mysqld]
bind-address = 10.0.0.11

default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
character-set-server = utf8

這邊的檔案 mysqld_openstack.cnf 是可以修改名稱的。

完成後重新啟動 MySQL 服務:

sudo systemctl enable mariadb.service
sudo systemctl start mariadb.service

並對資料庫進行安全設定:

$ sudo mysql_secure_installation

因為資料庫預設沒有 root 密碼所以看到

Enter current password for root (enter for none):

直接按 Enter 就可以進行資料庫密碼變更

若要備份資料庫可以用以下指令:

$ mysqldump --user=root -p --all-databases > mysql.sql

若要恢復資料庫可以用以下指令:

$ mysql -u root -p < mysql.sql

除了更換密碼外,其餘每個項目都輸入yes,並設置對應資訊。

Message queue 安裝

OpenStack 使用 Message Queue 來對整個叢集提供協調與狀態訊息收集。Openstack 支援的 Message Queue 包含以下RabbitMQQpidZeroMQ。但是大多數的釋出版本支援特殊的 Message Queue 服務,這邊我們使用了RabbitMQ來實現,並安裝於Controller節點上,透過以下指令安裝套件:

$ sudo yum install rabbitmq-server

完成安裝後,啟動 RabbitMQ 服務:

sudo systemctl enable rabbitmq-server.service
sudo systemctl start rabbitmq-server.service

新增一個名稱為 openstack 的 User:

$ sudo rabbitmqctl add_user openstack RABBIT_PASS
Creating user "openstack" ...
...done.

可以更改 RABBIT_PASS,來改變密碼。

為剛建立的 User 設定存取權限:

$ sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...
...done.

提醒

在以下的操作中,我們建議使用 root 權限操作,避免一些權限設定的問題

接下來會依序針對 OpenStack 的基礎套件進行安裝與設定教學,若發現有設定格式中有 ... 代表上面有預設設定的其他參數,若沒提示要註解掉,請不要修改:

[DEFAULT]
...
admin_token = 74e00617afa2008fcf25

P.S. 若在設定時,找不到對應的[section]部分,請自行新增。

如果在想要在 log 檔增加顏色,提高辨識度,我可以透過修改各套件的 conf 檔案來達成以下動作:

[DEFAULT]
...
logging_exception_prefix = %(color)s%(asctime)s.%(msecs)d TRACE %(name)s %(instance)s
logging_debug_format_suffix = from (pid=%(process)d) %(funcName)s %(pathname)s:%(lineno)d
logging_default_format_string = %(asctime)s.%(msecs)d %(color)s%(levelname)s %(name)s [-%(color)s] %(instance)s%(color)s%(message)s
logging_context_format_string = %(asctime)s.%(msecs)d %(color)s%(levelname)s %(name)s [%(request_id)s %(user_id)s %(project_id)s%(color)s] %(instance)s%(color)s%(message)s