學習openstack(三)
一、OpenStack初探
1.1 OpenStack簡介
OpenStack是一整套開源軟體專案的綜合,它允許企業或服務提供者建立、執行自己的雲端計算和儲存設施。Rackspace與NASA是最初重要的兩個貢獻者,前者提供了“雲檔案”平臺程式碼,該平臺增強了OpenStack物件儲存部分的功能,而後者帶來了“Nebula”平臺形成了OpenStack其餘的部分。而今,OpenStack基金會已經有150多個會員,包括很多知名公司如“Canonical、DELL、Citrix”等。
1.2 OpenStack的幾大元件
1.2.1 圖解各大元件之間關係
1.2.2 談談openstack的元件
-
OpenStack 認證(keystone)
Keystone為所有的OpenStack元件提供認證和訪問策略服務,它依賴自身REST(基於Identity API)系統進行工作,主要對(但不限於)Swift、Glance、Nova等進行認證與授權。事實上,授權通過對動作訊息來源者請求的合法性進行鑑定
Keystone採用兩種授權方式,一種基於使用者名稱/密碼,另一種基於令牌(Token)。除此之外,Keystone提供以下三種服務:
a.令牌服務:含有授權使用者的授權資訊
b.目錄服務:含有使用者合法操作的可用服務列表
c.策略服務:利用Keystone具體指定使用者或群組某些訪問許可權
認證服務元件
1)通過賓館對比keystone
User 住賓館的人
Credentials 身份證
Authentication 認證你的身份證
Token 房卡
project 組間
Service 賓館可以提供的服務類別,比如,飲食類,娛樂類
Endpoint 具體的一種服務,比如吃燒烤,打羽毛球
Role VIP 等級,VIP越高,享有越高的許可權
2)keystone元件詳細說明
a.服務入口endpoint:如Nova、Swift和Glance一樣每個OpenStack服務都擁有一個指定的埠和專屬的URL,我們稱其為入口(endpoints)。
b.使用者user:Keystone授權使用者
注:代表一個個體,OpenStack以使用者的形式來授權服務給它們。使用者擁有證書(credentials),且可能分配給一個或多個租戶。經過驗證後,會為每個單獨的租戶提供一個特定的令牌。
c.服務service:總體而言,任何通過Keystone進行連線或管理的元件都被稱為服務。舉個例子,我們可以稱Glance為Keystone的服務。
d.角色role:為了維護安全限定,就內特定使用者可執行的操作而言,該使用者關聯的角色是非常重要的。注:一個角色是應是某個租戶的使用許可權集合,以允許某個指定使用者訪問或使用特定操作。角色是使用許可權的邏輯分組,它使得通用的許可權可以簡單地分組並繫結到與某個指定租戶相關的使用者。
e.租間project:租間指的是具有全部服務入口並配有特定成員角色的一個專案。注:一個租間對映到一個Nova的“project-id”,在物件儲存中,一個租間可以有多個容器。根據不同的安裝方式,一個租間可以代表一個客戶、帳號、組織或專案。
-
OpenStack Dashboard介面 (horizon)
Horizon是一個用以管理、控制OpenStack服務的Web控制面板,它可以管理例項、映象、建立密匙對,對例項添加捲、操作Swift容器等。除此之外,使用者還可以在控制面板中使用終端(console)或VNC直接訪問例項。總之,Horizon具有如下一些特點:
a.例項管理:建立、終止例項,檢視終端日誌,VNC連線,添加捲等
b.訪問與安全管理:建立安全群組,管理密匙對,設定浮動IP等
c.偏好設定:對虛擬硬體模板可以進行不同偏好設定
d.映象管理:編輯或刪除映象
e.檢視服務目錄
f.管理使用者、配額及專案用途
g.使用者管理:建立使用者等
h.卷管理:建立卷和快照
i.物件儲存處理:建立、刪除容器和物件
j.為專案下載環境變數 -
OpenStack nova
圖解nova
API:負責接收和響應外部請求,支援OpenStackAPI,EC2API
nova-api 元件實現了RESTfulAPI功能,是外部訪問Nova的唯一途徑,接收外部的請求並通過Message Queue將請求傳送給其他服務元件,同時也相容EC2API,所以可以用EC2的管理工具對nova進行日常管理
Cert:負責身份認證
Scheduler:用於雲主機排程
Nova Scheduler模組在openstack中的作用是決策虛擬機器建立在哪個主機(計算節點),一般會根據過濾計算節點或者通過加權的方法排程計算節點來建立虛擬機器。
1)過濾
首先得到未經過過濾的主機列表,然後根據過濾屬性,選擇服務條件的計算節點主機
2)排程
經過過濾後,需要對主機進行權值的計算,根據策略選擇相應的某一臺主機(對於每一個要建立的虛擬機器而言)
注:Openstack預設不支援指定的計算節點建立虛擬機器
你可以得到更多nova的知識==>>Nova過濾排程器
Conductor:計算節點訪問,資料的中介軟體
Consloeauth:用於控制檯的授權認證
Novncproxy:VNC代理
-
OpenStack 物件儲存 (swift)
Swift為OpenStack提供一種分散式、持續虛擬物件儲存,它類似於Amazon Web Service的S3簡單儲存服務。Swift具有跨節點百級物件的儲存能力。Swift內建冗餘和失效備援管理,也能夠處理歸檔和媒體流,特別是對大資料(千兆位元組)和大容量(多物件數量)的測度非常高效。
swift功能及特點
- 海量物件儲存
- 大檔案(物件)儲存
- 資料冗餘管理
- 歸檔能力—–處理大資料集
- 為虛擬機器和雲應用提供資料容器
- 處理流媒體
- 物件安全儲存
- 備份與歸檔
- 良好的可伸縮性
Swift的元件
- Swift賬戶
- Swift容器
- Swift物件
- Swift代理
- Swift RING
Swift代理伺服器
使用者都是通過Swift-API與代理伺服器進行互動,代理伺服器正是接收外界請求的門衛,它檢測合法的實體位置並路由它們的請求。
此外,代理伺服器也同時處理實體失效而轉移時,故障切換的實體重複路由請求。
Swift物件伺服器
物件伺服器是一種二進位制儲存,它負責處理本地儲存中的物件資料的儲存、檢索和刪除。物件都是檔案系統中存放的典型的二進位制檔案,具有擴充套件檔案屬性的元資料(xattr)。注:xattr格式被Linux中的ext3/4,XFS,Btrfs,JFS和ReiserFS所支援,但是並沒有有效測試證明在XFS,JFS,ReiserFS,Reiser4和ZFS下也同樣能執行良好。不過,XFS被認為是當前最好的選擇。
Swift容器伺服器
容器伺服器將列出一個容器中的所有物件,預設物件列表將儲存為SQLite檔案(譯者注:也可以修改為MySQL,安裝中就是以MySQL為例)。容器伺服器也會統計容器中包含的物件數量及容器的儲存空間耗費。
Swift賬戶伺服器
賬戶伺服器與容器伺服器類似,將列出容器中的物件。
Ring(索引環)
Ring容器記錄著Swift中物理儲存物件的位置資訊,它是真實物理儲存位置的實體名的虛擬對映,類似於查詢及定位不同叢集的實體真實物理位置的索引服務。這裡所謂的實體指賬戶、容器、物件,它們都擁有屬於自己的不同的Rings。
-
OpenStack 塊儲存(cinder)
API service:負責接受和處理Rest請求,並將請求放入RabbitMQ佇列。Cinder提供Volume API V2
Scheduler service:響應請求,讀取或寫向塊儲存資料庫為維護狀態,通過訊息佇列機制與其他程序互動,或直接與上層塊儲存提供的硬體或軟體互動,通過driver結構,他可以與中隊的儲存
提供者進行互動
Volume service: 該服務執行在儲存節點上,管理儲存空間。每個儲存節點都有一個Volume Service,若干個這樣的儲存節點聯合起來可以構成一個儲存資源池。為了支援不同型別和型號的儲存 -
OpenStack Image service (glance)
glance 主要有三個部分構成:glance-api,glance-registry以及image store
glance-api:接受雲系統映象的建立,刪除,讀取請求
glance-registry:雲系統的映象註冊服務 -
OpenStack 網路 (neutron)
這裡就不詳細介紹了,後面會有詳細的講解
二、環境準備
2.1 準備機器
本次實驗使用的是VMvare虛擬機器。詳情如下
- 控制節點
hostname:linux-node1.oldboyedu.com
ip地址:192.168.56.11 網絡卡NAT eth0
系統及硬體:CentOS 7.1 記憶體2G,硬碟50G - 計算節點:
hostname:linux-node2.oldboyedu.com
ip地址:192.168.56.12 網絡卡NAT eth0
系統及硬體:CentOS 7.1 記憶體2G,硬碟50G
2.2 OpenStack版本介紹
2.3 安裝元件服務
2.3.1 控制節點安裝
- Base
yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm -y
yum install centos-release-openstack-liberty -y
yum install python-openstackclient -y
- MySQL
yum install mariadb mariadb-server MySQL-python -y
- RabbitMQ
yum install rabbitmq-server -y
- Keystone
yum install openstack-keystone httpd mod_wsgi memcached python-memcached -y
- Glance
yum install openstack-glance python-glance python-glanceclient -y
- Nova
yum install openstack-nova-api openstack-nova-cert openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler python-novaclient -y
- Neutron
yum install openstack-neutron openstack-neutron-ml2 openstack-neutron-linuxbridge python-neutronclient ebtables ipset -y
- Dashboard
yum install openstack-dashboard -y
2.3.2 計算節點安裝
- Base
yum install -y http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum install centos-release-openstack-liberty -y
yum install python-openstackclient -y
- Nova linux-node2.example.com
yum install openstack-nova-compute sysfsutils -y
- Neutron
yum install openstack-neutron openstack-neutron-linuxbridge ebtables ipset -y
三、實戰OpenStack之控制節點
3.1 CentOS7的時間同步伺服器chrony
下載chrony
[[email protected]-node1 ~]# yum install -y chrony
修改其配置檔案
[[email protected]-node1 ~]# vim /etc/chrony.conf
allow 192.168/16
chrony開機自啟動,並且啟動
[[email protected]-node1 ~]#systemctl enable chronyd.service
[[email protected]-node1 ~]#systemctl start chronyd.service
設定Centos7的時區
[[email protected]-node1 ~]# timedatectl set-timezoneb Asia/Shanghai
檢視時區和時間
[[email protected]-node1 ~]# timedatectl status
Local time:Tue2015-12-1512:19:55 CST
Universal time:Tue2015-12-1504:19:55 UTC
RTC time:Sun2015-12-1315:35:33
Timezone:Asia/Shanghai(CST,+0800)
NTP enabled: yes
NTP synchronized: no
RTC inlocal TZ: no
DST active: n/a
[[email protected]-node1 ~]# date
TueDec1512:19:57 CST 2015
3.2 入手mysql
Openstack的所有元件除了Horizon,都要用到資料庫,本文使用的是mysql,在CentOS7中,預設叫做MariaDB。
拷貝配置檔案
[root[@linux-node1 ~]#cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
修改mysql配置並啟動
[[email protected]-node1 ~]# vim /etc/my.cnf(在mysqld模組下新增如下內容)
[mysqld]
default-storage-engine = innodb 預設的儲存引擎
innodb_file_per_table 使用獨享的表空間
collation-server = utf8_general_ci設定校對標準
init-connect ='SET NAMES utf8'設定連線的字符集
character-set-server = utf8 設定建立資料庫時預設的字符集
開機自啟和啟動mysql
[[email protected]-node1 ~]# systemctl enable mariadb.service
ln -s '/usr/lib/systemd/system/mariadb.service''/etc/systemd/system/multi-user.target.wants/mariadb.service'
[[email protected]-node1 ~]# systemctl start mariadb.service
設定mysql的密碼
[[email protected]-node1 ~]# mysql_secure_installation
建立所有元件的庫並授權
[[email protected]-node1 ~]# mysql -uroot -p123456
執行sql
CREATE DATABASE keystone;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'keystone';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'keystone';
CREATE DATABASE glance;
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'glance';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'glance';
CREATE DATABASE nova;
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'nova';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova';
CREATE DATABASE neutron;
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'neutron';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'neutron';
CREATE DATABASE cinder;
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'cinder';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'cinder';
3.3 Rabbit訊息佇列
SOA架構:面向服務的體系結構是一個元件模型,它將應用程式的不同功能單元(稱為服務)通過這些服務之間定義良好的介面和契約聯絡起來。介面是採用中立的方式進行定義的,它應該獨立於實現服務的硬體平臺、作業系統和程式語言。這使得構建在各種各樣的系統中的服務可以使用一種統一和通用的方式進行互動。
在這裡Openstack採用了SOA架構方案,結合了SOA架構的鬆耦合特點,單獨元件單獨部署,每個元件之間可能互為消費者和提供者,通過訊息佇列(openstack 支援Rabbitmq,Zeromq,Qpid)進行通訊,保證了當某個服務當掉的情況,不至於其他都當掉。
啟動Rabbitmq
[[email protected]-node1 ~]# systemctl enable rabbitmq-server.service
ln -s '/usr/lib/systemd/system/rabbitmq-server.service''/etc/systemd/system/multi-user.target.wants/rabbitmq-server.service'
[[email protected]-node1 ~]# systemctl start rabbitmq-server.service
新建Rabbitmq使用者並授權
[[email protected]-node1 ~]# rabbitmqctl add_user openstack openstack
[[email protected]-node1 ~]# rabbitmqctl set_permissions openstack ".*"".*"".*"
啟用Rabbitmq的web管理外掛
[[email protected]-node1 ~]rabbitmq-plugins enable rabbitmq_management
重啟Rabbitmq
[[email protected]-node1 ~]# systemctl restart rabbitmq-server.service
檢視Rabbit的埠,其中5672是服務埠,15672是web管理埠,25672是做叢集的埠
[[email protected]-node1 ~]# netstat -lntup |grep 5672
tcp 000.0.0.0:256720.0.0.0:* LISTEN 52448/beam
tcp 000.0.0.0:156720.0.0.0:* LISTEN 52448/beam
tcp6 00:::5672:::* LISTEN 52448/beam
在web介面新增openstack使用者,設定許可權,首次登陸必須使用賬號和密碼必須都是guest
role設定為administrator,並設定openstack的密碼
3.4 Keystone元件
修改keystone的配置檔案
[[email protected]-node1 opt]# vim /etc/keystone/keystone.conf
admin_token =863d35676a5632e846d9
用作無使用者時,建立使用者來連結,此內容使用openssl隨機產生
connection = mysql://keystone:[email protected].168.56.11/keystone
用作連結資料庫,三個keysthone分別為keystone元件,keystone使用者名稱,mysql中的keysthone庫名
切換到keystone使用者,匯入keystoe資料庫
[[email protected]-node1 opt]# su -s /bin/sh -c "keystone-manage db_sync" keystone
[[email protected]-node1 keystone]# cd /var/log/keystone/
[[email protected]-node1 keystone]# ll
total 8
-rw-r--r--1 keystone keystone 7064Dec1514:43 keystone.log(通過切換到keystone使用者下匯入資料庫,當啟動的時候回把日誌寫入到該日誌中,如果使用root執行倒庫操作,則無法通過keysthone啟動keystone程式)
31:verbose = true開啟debug模式
1229:servers =192.168.57.11:11211更改servers標籤,填寫memcache地址
1634:driver = sql開啟預設sql驅動
1827:provider = uuid開啟並使用唯一識別碼
1832:driver = memcache(使用使用者密碼生成token時,儲存到memcache中,高效能提供服務)
檢視更改結果
[[email protected]-node1 keystone]# grep -n "^[a-Z]"/etc/keystone/keystone.conf
12:admin_token =863d35676a5632e846d9
31:verbose = true
419:connection = mysql://keystone:[email protected].168.56.11/keystone
1229:servers =192.168.57.11:11211
1634:driver = sql
1827:provider = uuid
1832:driver = memcache
檢查資料庫匯入結果
MariaDB[keystone]> show tables;
+------------------------+
|Tables_in_keystone|
+------------------------+
| access_token |
| assignment |
| config_register |
| consumer |
| credential |
| domain |
| endpoint |
| endpoint_group |
| federation_protocol |
| group |
| id_mapping |
| identity_provider |
| idp_remote_ids |
| mapping |
| migrate_version |
| policy |
| policy_association |
| project |
| project_endpoint |
| project_endpoint_group |
| region |
| request_token |
| revocation_event |
| role |
| sensitive_config |
| service |
| service_provider |
| token |
| trust |
| trust_role |
| user |
| user_group_membership |
| whitelisted_config |
+------------------------+
33 rows inset(0.00 sec)
新增一個apache的wsgi-keystone配置檔案,其中5000埠是提供該服務的,35357是為admin提供管理用的
[[email protected]-node1 keystone]# cat /etc/httpd/conf.d/wsgi-keystone.conf
Listen5000
Listen35357
<VirtualHost*:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias//usr/bin/keystone-wsgi-public
WSGIApplicationGroup%{GLOBAL}
WSGIPassAuthorizationOn
<IfVersion>=2.4>
ErrorLogFormat"%{cu}t %M"
</IfVersion>
ErrorLog/var/log/httpd/keystone-error.log
CustomLog/var/log/httpd/keystone-access.log combined
<Directory/usr/bin>
<IfVersion>=2.4>
Require all granted
</IfVersion>
<IfVersion<2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
</VirtualHost><