開頭語
前段時間對公司測試環境進行了重構,將虛擬化技術從KVM改爲了OpenStack集羣,並結合了CEPH存儲。目前整個集羣承擔着Dev和測試環境的運行,以及公司內部服務,如Wiki,Git等,目前已穩定運行了一段時間。在部署的整個過程以及使用的這段時間,產生了一些心得也積累了些經驗,想分享給更多需要的朋友。考慮到OpenStack組件較多,一篇文章的篇幅不足以概括,所以會以系列專欄的形式呈現出來。
OpenStack是什麼?
OpenStack 是一個適用於所有云環境、旨在實現簡單、可擴展性強、功能豐富的開源雲計算平臺。自2010年NASA(美國國家航空航天局)和Rackspace共同發起後,到現在其開發人員遍及世界各地,已成長爲全球第二大開源社區。
OpenStack通過一組相互關聯的服務提供基礎架構即服務(IaaS)解決方案。每個服務都提供了API來實現服務間調用。根據需要,您可以安裝部分或全部服務。
服務與項目名稱對照表
OpenStack的服務名和項目名稱是不一樣的,以下是筆者基於Queens版本梳理出的核心服務和項目對應關係及描述:
Service | Project Name | Description |
---|---|---|
Dashboard | Horizon | 提供基於 Web 的自助服務門戶,以便與底層 OpenStack 服務進行交互,例如啓動實例,分配IP地址和配置訪問控制。 |
Compute Service | Nova | 在 OpenStack 環境中管理虛擬實例的生命週期。職責包括按需產生,調度和停用虛擬機。 |
Networking Service | Neutron | 爲其他 OpenStack 服務組件啓用網絡連接服務,例如 OpenStack Compute。爲用戶提供一個API來定義網絡及其附件。具有支持許多流行網絡供應商和技術的可插拔架構。 |
Object Storage Service | Swift | 對象存儲服務,通過基於HTTP的 RESTful API 來存儲和檢索任意的非結構化數據對象。高度的容錯及多副本存儲。 |
Block Storage Service | Cinder | 爲運行的實例提供塊存儲。 |
Identity Service | Keystone | 爲其他 OpenStack 服務提供認證和授權服務。能列出所有 OpenStack 服務的端點目錄。也是需要最先部署的組件。 |
Image Service | Glance | 鏡像存儲檢索服務。 |
Telemetry Service | Ceilometer | 計費服務。 |
Orchestration Service | Heat | 編排服務。 |
Database Service | Trove | 爲關係數據庫和非關係數據庫引擎提供可伸縮和可靠的雲數據庫即服務功能。 |
Data Processing Service | Sahara | 通過指定 Hadoop 版本,集羣拓撲和節點硬件信息等參數,提供在 OpenStack 中配置和擴展 Hadoop 羣集的功能。 |
架構
介紹了核心服務功能,我們來看看 OpenStack 的架構,下圖是 OpenStack 的概念架構:
要設計、部署和配置 OpenStack,運維人員必須瞭解它的邏輯體系結構。
如上圖的概念架構所示,OpenStack 由幾個獨立部分共同組成了 OpenStack 服務。所有服務都通過 Keystone 組件進行身份驗證。
在內部,OpenStack 服務由多個進程組成。所有服務都至少有一個API進程,它監聽其他API的請求,預處理它們並將它們傳遞給服務的其他部分。除身份服務外,實際工作由不同的進程完成。進程間的通信採用消息隊列,進程的狀態存儲在數據庫中。
用戶可以通過 Horizon Dashboard、命令行客戶端以及瀏覽器插件或 curl 等工具發起請求來訪問 OpenStack。對於應用程序,有幾個 SDK 可用。最終,所有這些訪問方法都會對各種 OpenStack 服務發出 REST API 調用。
下圖是OpenStack最常見的體系結構:
大家可以按照圖上列出的組件來定製部署自己的 OpenStack 環境,在部署 OpenStack 前,我們先來準備依賴環境。
兵馬未動,糧草先行
在筆者的 OpenStack 環境中,操作系統均使用的 CentOS7 版本,OpenStack 爲 Queens 版本。
CentOS中可以通過 redhat-release 文件查看操作系統版本:
[root@ct1 ~]# cat /etc/redhat-release
OpenStack 最小化部署需要兩臺主機:一個 Controller 節點,一個 Computer 節點。所以,想嘗試的同學,請至少準備好兩個節點(可以是物理機,也可以是虛擬機),每個節點上至少兩塊網卡。本例中的主機信息如下:
Role | Name | Private IP | Public IP |
---|---|---|---|
Controller | ct1.vtlab.io | 192.168.1.231 | 10.0.0.231 |
Computer | cp1.vtlab.io | 192.168.1.233 | 10.0.0.233 |
Controller 節點一般運行服務端的程序,Computer 節點運行客戶端程序及VMS。接下來我們部署和配置環境。
配置主機名
#設置控制節點的主機名爲 ct1.vtlab.io
[root@ct1 ~]# hostnamectl set-hostname ct1.vtlab.io
#設置計算節點的主機名爲 cp1.vtlab.io
[root@cp1 ~]# hostnamectl set-hostname cp1.vtlab.io
配置各節點時區,統一爲 Asia/Shanghai:
[root@ct1 ~]# timedatectl set-timezone Asia/Shanghai
配置各節點的編碼
當編碼爲中文,啓動 OpenStack 組件可能會報下面的錯誤,所以提前設置好主機編碼均爲 en_US.UTF-8
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 14: ordinal not in range(128)
[root@cp1 ~]# cat /etc/locale.conf
LANG="en_US.UTF-8"
修改hosts文件,使彼此能通過主機名訪問,如果環境中有DNS,可以使用DNS。
[root@ct1 ~]# cat /etc/hosts
192.168.1.231 ct1.vtlab.io
192.168.1.233 cp1.vtlab.io
關閉各節點防火牆和Selinux
[root@ct1 ~]# systemctl stop firewalld.service
[root@ct1 ~]# setenforce 0
#編輯selinux配置文件,替換一下內容
[root@ct1 ~]# vim /etc/selinux/config
SELINUX=disabled
NTP 服務:
在集體活動中,大家時間同步,才能保證行動一致、有條,顯得像一個集體。集羣環境更是如此。CentOS7.x 中,默認的時鐘同步服務改爲了 Chrony。 Chrony 可以同時作爲NTP服務的客戶端和服務端。默認安裝後有兩個程序chronyd 和 chronyc。chronyd 是一個在系統後臺運行的守護進程,chronyc 是用來監控chronyd 性能和配置的工具。
Chrony 的優勢包括:
- 更快的同步只需要數分鐘而非數小時時間,從而最大程度減少了時間和頻率誤差,這對於並非全天 24 小時運行的臺式計算機或系統而言非常有用
- 能夠更好地響應時鐘頻率的快速變化,這對於具備不穩定時鐘的虛擬機或導致時鐘頻率發生變化的節能技術而言非常有用。
- 在初始同步後,它不會停止時鐘,以防對需要系統時間保持單調的應用程序造成影響。
- 在應對臨時非對稱延遲時(例如,在大規模下載造成鏈接飽和時)提供了更好的穩定性。
- 無需對服務器進行定期輪詢,因此具備間歇性網絡連接的系統仍然可以快速同步時鐘。
#安裝 chrony,在所有OpenStack節點上執行 yum install -y chrony #如果有 Ansible 等配置管理工具會更方便,只需要一條命令就能在所有節點上安裝完成我們需要的程序包了。 [root@ct1 ~]# ansible node -m yum -a "name=chrony state=present" #在 Chrony 服務端執行 #編輯配置文件 vim /etc/chrony.conf,添加下列部分 allow 192.168.0.0/16 allow 172.31.1.0/24 allow 10.0.0.0/24 #啓動服務 [root@ct1 ~]# systemctl start chronyd.service [root@ct1 ~]# systemctl enable chronyd.service #在 Chrony 客戶端執行 #編輯配置文件 vim /etc/chrony.conf,修改下列部分,其中 cp1.vtlab.io 爲Chrony 服務端的地址,可以寫主機名也可以寫IP。 server cp1.vtlab.io iburst #啓動服務 [root@cp1 ~]# systemctl start chronyd.service [root@cp1 ~]# systemctl enable chronyd.service #執行命令驗證 [root@cp1 ~]# chronyc sources
準備網絡環境
網絡接口要求,雙網卡,分爲管理網絡和專用網絡,禁用DHCP功能,手動配置IP地址。
出於管理目的,例如:安裝包,安全更新, DNS 和 NTP,所有的節點都需要可以訪問互聯網。在大部分情況下,節點應該通過管理網絡接口訪問互聯網。爲了更好的突出網絡隔離的重要性,示例架構中爲管理網絡使用 "private address space"(192.168.1.x),並假定物理網絡設備通過 "NAT" 或者其他方式提供互聯網訪問。示例架構使用可路由的IP地址隔離服務商(外部)網絡並且假定物理網絡設備直接提供互聯網訪問。
在提供者網絡(10.0.0.x)架構中,所有實例直接連接到提供者網絡。在自服務(私有)網絡架構,實例可以連接到自服務或提供者網絡。自服務網絡可以完全在 OpenStack 環境中或者通過外部網絡使用 “NAT ” 提供某種級別的外部網絡訪問。
示例網絡架構如下:
- 管理網絡使用 192.168.1.0/24 帶有網關 192.168.1.1 的網絡段,這個網絡需要一個網關爲所有節點提供內部管理目的的訪問,例如:包安裝、安全更新、DNS、時鐘同步。
- 提供者網段 10.0.0.0/24,網關10.0.0.1
這個網絡需要一個網關來提供在環境中內部實例的訪問。
控制節點網絡配置:
1.將第一個接口配置爲管理網絡接口:
[root@ct1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno1
BOOTPROTO=static
DEVICE=eno1
ONBOOT=yes
IPADDR=192.168.1.231
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
2.提供者網絡接口使用一個特殊的配置,不分配給它IP地址。配置第二塊網卡作爲提供者網絡:
[root@ct1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno2
BOOTPROTO=static
DEVICE=eno2
ONBOOT=yes
IPADDR=10.0.0.231
GATEWAY=10.0.0.1
NETMASK=255.255.255.0
3.重啓網絡服務,是配置生效
[root@ct1 ~]# systemctl restart network
計算節點網絡配置:
1.將第一個接口配置爲管理網絡接口
[root@cp1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno1
BOOTPROTO=static
DEVICE=eno1
ONBOOT=yes
IPADDR=192.168.1.233
GATEWAY=192.168.1.1
NETMASK=255.255.255.0
2.配置第二塊網卡作爲提供者網絡:
[root@cp1 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno2
BOOTPROTO=static
DEVICE=eno2
ONBOOT=yes
IPADDR=10.0.0.233
GATEWAY=10.0.0.1
NETMASK=255.255.255.0
配置域名解析
- 通過修改/etc/hosts文件。
- 通過DNS 服務。
通過 yum 方式安裝,啓用 OpenStack 庫
[root@ct1 ~]# yum -y install centos-release-openstack-queens
#升級包
[root@ct1 ~]# yum upgrade
#安裝OpenStack客戶端
[root@ct1 ~]# yum install -y python-openstackclient
#安裝openstack-selinux 軟件包以便自動管理OpenStack服務的安全策略
[root@ct1 ~]# yum install -y openstack-selinux
安裝數據庫服務
OpenStack服務使用MySQL數據庫存儲信息。本處使用MariaDB。
安裝MariaDB並配置bind_address爲控制節點管理網卡的IP地址。
[root@ct1 ~]# yum -y install mariadb mariadb-server python2-PyMySQL
[root@ct1 ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
skip-name-resolve
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8mb4
#啓動
[root@ct1 ~]# systemctl enable mariadb.service
[root@ct1 ~]# systemctl start mariadb.service
#可選操作:
#檢查空密碼用戶並刪除
[root@ct1 ~]# mysql_secure_installation
delete from mysql.user where password="";
flush privileges;
select user,host,password from mysql.user where password="";
安裝NoSQL服務
Telemetry 服務使用 NoSQL 數據庫來存儲信息。這裏選擇 MongoDB數據庫。
安裝 MongoDB。配置 bind_ip 爲控制節點管理網卡的IP地址。
[root@ct1 ~]# yum install mongodb-server mongodb -y
[root@ct1 ~]# vim /etc/mongod.conf
bind_ip = 192.168.1.231
smallfiles = true
#啓動服務
[root@ct1 ~]# systemctl enable mongod.service
[root@ct1 ~]# systemctl start mongod.service
安裝消息隊列
OpenStack使用消息隊列協調操作和各服務的狀態信息。消息隊列服務一般運行在控制節點上。OpenStack 支持RabbitMQ、Qpid 和 ZeroMQ。我選用的 RabbitMQ。
[root@ct1 ~]# yum -y install rabbitmq-server
#設置開機啓動並啓動RabbitMQ
[root@ct1 ~]# systemctl enable rabbitmq-server.service
[root@ct1 ~]# systemctl start rabbitmq-server.service
#添加RabbitMQ用戶並設置密碼,需要把RABBIT_PASS修改爲真實密碼。
[root@ct1 ~]# rabbitmqctl add_user openstack RABBIT_PASS
#開啓頁面監控
[root@ct1 ~]# rabbitmq-plugins enable rabbitmq_management
#添加openstack用戶配置、寫入和讀取的權限
[root@ct1 ~]# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
[root@ct1 ~]# rabbitmqctl set_user_tags openstack administrator management
安裝緩存服務
認證服務的認證緩存使用 Memcached 緩存令牌。緩存服務 Memcached 運行在控制節點。在生產環境中,推薦聯合啓用防火牆、認證和加密保證它的安全。
[root@ct1 ~]# yum install -y memcached python-memcached
#編輯文件,修改監聽地址
[root@ct1 ~]# vim /etc/sysconfig/memcached
OPTIONS="-l 127.0.0.1,::1,ct1.vtlab.io"
#設置開機啓動並啓動memcached
[root@ct1 ~]# systemctl enable memcached.service
[root@ct1 ~]# systemctl start memcached.service
安裝ETCD服務
[root@ct1 ~]# yum install -y etcd
#修改etcd配置文件 /etc/etcd/etcd.conf
[root@ct1 ~]# vim /etc/etcd/etcd.conf
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.1.231:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.231:2379"
ETCD_NAME="ct1.vtlab.io"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.231:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.231:2379"
ETCD_INITIAL_CLUSTER="ct1.vtlab.io=http://192.168.1.231:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_INITIAL_CLUSTER_STATE="new"
#設置開機啓動並啓動etcd
[root@ct1 ~]# systemctl enable etcd
[root@ct1 ~]# systemctl start etcd
到目前爲止,OpenStack 依賴的環境已經準備完畢,下一篇文章,將介紹 OpenStack 的驗證服務——keystone。