天天看點

OpenStack 原理小結

OpenStack有非常的多的元件和服務,不同的服務都會有不同的監聽端口。了解openstack的工作原理和服務端口,對于更加深入的學習openstack非常重要。

OpenStack的常用服務和端口

計算機節點服務

虛拟機管理:openstac如果使用的是KVM虛拟機,則會在計算節點是有qemu-kvm來管理虛拟機(會有兩個程序)。預設會監聽VNC的5900和5901兩個端口。

網絡:使用橋接網絡br0,橋接到本地的網卡上(如eth0).

虛拟機儲存路徑:/var/lib/nova/instances/

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>[root@node2 ~]</code><code># tree /var/lib/nova/instances/</code>

<code>/var/lib/nova/instances/</code>

<code>├── _base            </code><code># 鏡像</code>

<code>│   └── 314553a43b9258a9bee633340ba7b3ad50ee35bb</code>

<code>├── compute_nodes</code>

<code>├── d17934ec-689b-4553-81d3-ee2fa6cef912 </code><code>#虛拟機執行個體</code>

<code>│   ├── console.log  </code><code># 控制台日志,和在Web界面看到的日志相同</code>

<code>│   ├── disk         </code><code># 虛拟磁盤</code>

<code>│   ├── disk.info    </code><code># 虛拟磁盤資訊,其實就是一個路徑</code>

<code>│   └── libvirt.xml  </code><code># libvirt生成的配置xml檔案</code>

<code>└── locks</code>

<code>    </code><code>├── nova-314553a43b9258a9bee633340ba7b3ad50ee35bb</code>

<code>    </code><code>└── nova-storage-registry-lock</code>

這裡的ID和在控制節點上通過openstack server list所檢視的虛拟機ID相同:

<code>[root@node1 ~]</code><code># openstack server list    </code>

<code>+--------------------------------------+-------+--------+----------------------+</code>

<code>| ID                                   | Name  | Status | Networks             |</code>

<code>| d17934ec-689b-4553-81d3-ee2fa6cef912 | demo1 | ACTIVE | public=172.16.10.102 |</code>

進入磁盤,會發現虛拟磁盤的大小并不是我們配置設定的1G,隻有2.6M:

<code>[root@node2 d17934ec-689b-4553-81d3-ee2fa6cef912]</code><code># ls -lh</code>

<code>total 2.6M</code>

<code>-rw-rw---- 1 nova qemu  20K Nov  2 20:09 console.log</code>

<code>-rw-r--r-- 1 qemu qemu 2.6M Nov  2 20:09 disk</code>

<code>-rw-r--r-- 1 nova nova   79 Nov  1 20:01 disk.info</code>

<code>-rw-r--r-- 1 nova nova 2.6K Nov  2 17:53 libvirt.xml</code>

使用file disk 檢視這個檔案的資訊:

<code># file disk</code>

<code>disk: QEMU QCOW Image (v3), has backing </code><code>file</code> <code>(path </code>

<code>/var/lib/nova/instances/_base/314553a43b9258a9bee633340ba7b3ad5</code><code>), </code>

<code>1073741824 bytes</code>

告訴我們在/var/lib/nova/instances/_base/後端檔案中儲存的實體鏡像,而在disk檔案中儲存的是變化的檔案,原始鏡像不會再次加載如disk.

libvirt.xml是動态生成檔案,裡面顯示了虛拟機的建構資訊,由于這裡的檔案是啟動虛拟機後動态生成的,是以即使修改也無法改動虛拟機的配置。

SSHKEY如何自動會傳入虛拟機

在虛拟機的執行個體中,可以通過meta-data和這個特殊的IP擷取到key值:

14

15

16

<code>$ curl http:</code><code>//169</code><code>.254.169.254</code><code>/2009-04-04/meta-data</code>

<code>ami-</code><code>id</code>

<code>ami-launch-index</code>

<code>ami-manifest-path</code>

<code>block-device-mapping/</code>

<code>hostname</code>

<code>instance-action</code>

<code>instance-</code><code>id</code>

<code>instance-</code><code>type</code>

<code>local</code><code>-</code><code>hostname</code>

<code>local</code><code>-ipv4</code>

<code>placement/</code>

<code>public-</code><code>hostname</code>

<code>public-ipv4</code>

<code>public-keys/</code>

<code>reservation-</code><code>id</code>

可以通過路由追蹤找到這個特殊的IP:

<code>$ curl http:</code><code>//169</code><code>.254.169.254</code><code>/2009-04-04/meta-data/local-ipv4</code>

<code>172.16.10.102</code>

<code>$ ip ro li</code>

<code>default via 172.16.0.1 dev eth0 </code>

<code>169.254.169.254 via 172.16.10.100 dev eth0 </code>

<code>172.16.0.0</code><code>/16</code> <code>dev eth0  src 172.16.10.102</code>

這裡的172.16.10.100為建立網絡的起始位址,但是這裡自動生成的位址為DHCP服務。這個IP是在命名空間中:

17

18

<code>[root@node1 instances]</code><code># ip netns li</code>

<code>qdhcp-ff609289-4b36-4294-80b8-5591d8196c42 (</code><code>id</code><code>: 0)</code>

<code>[root@node1 instances]</code><code># ip netns exec qdhcp-ff609289-4b36-4294-80b8-5591d8196c42 ip ad li</code>

<code>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN </code>

<code>    </code><code>link</code><code>/loopback</code> <code>00:00:00:00:00:00 brd 00:00:00:00:00:00</code>

<code>    </code><code>inet 127.0.0.1</code><code>/8</code> <code>scope host lo</code>

<code>       </code><code>valid_lft forever preferred_lft forever</code>

<code>    </code><code>inet6 ::1</code><code>/128</code> <code>scope host </code>

<code>2: ns-48901cde-e3@if3: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast state UP qlen 1000</code>

<code>    </code><code>link</code><code>/ether</code> <code>fa:16:3e:95:71:9b brd ff:ff:ff:ff:ff:ff link-netnsid 0</code>

<code>    </code><code>inet 172.16.10.100</code><code>/16</code> <code>brd 172.16.255.255 scope global ns-48901cde-e3</code>

<code>    </code><code>inet 169.254.169.254</code><code>/16</code> <code>brd 169.254.255.255 scope global ns-48901cde-e3</code>

<code>    </code><code>inet6 fe80::f816:3eff:fe95:719b</code><code>/64</code> <code>scope link </code>

DHCP和169.254.169.254的路由是在配置檔案中所确定的:

<code>[root@node1 ~]</code><code># grep "enable_isolated_metadata" /etc/neutron/dhcp_agent.ini    </code>

<code>enable_isolated_metadata = True</code>

通過btctl  show 指令可以看到Linux主機中的網絡橋接狀态。使用route 指令,檢視目前的路由資訊,可以發現169.254.169.254的路由走向。

而通過curl + URL的方式預設會通路80端口,是以在命名空間中一空啟用一個80端口:

檢視端口:

<code>[root@node1 instances]</code><code># ip netns exec qdhcp-ff609289-4b36-4294-80b8-5591d8196c42 netstat -ntlp</code>

<code>Active Internet connections (only servers)</code>

<code>Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID</code><code>/Program</code> <code>name    </code>

<code>tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3575</code><code>/python2</code>        

<code>tcp        0      0 172.16.10.100:53        0.0.0.0:*               LISTEN      3566</code><code>/dnsmasq</code>        

<code>tcp        0      0 169.254.169.254:53      0.0.0.0:*               LISTEN      3566</code><code>/dnsmasq</code>        

<code>tcp6       0      0 fe80::f816:3eff:fe95:53 :::*                    LISTEN      3566</code><code>/dnsmasq</code>

鏡像中擷取這個key的方式實質上是執行了下面的指令:

<code>$ curl </code>

<code> </code> 

<code>ssh</code><code>-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD0Js4RtI3MbxZ3axkcQbG4GUmG9xsZihX07icFT7</code>

<code>lySbX8</code><code>/RYPSSYpaIOAdv2Tsd45FXCvszF5CmbDINI6kyf0sxq04ZU0ACgllvxKv96i</code><code>+GBdhizIG1F3</code>

<code>Hte1OeBcftnGbAoavpseSU</code><code>/uhRmT/jl9</code><code>+JGyz78Xl8trx1dOuzvhMYzdAbFcVa2zWEKKJtWLhhZmSA</code>

<code>FkpsLShHCR8WXNrXO91PG7Ly4CGpR6JoyzEzr36CPHJsaS6zef4jGaHmx8MQJeVseYfIKc6aNao5kg</code>

<code>+9pWR1YKnkxtS78x6OCT5E+1NMaeuyltnNRFbReB5y5U0GJipQ0EmIYFTE20s0UGHJ+1 root@node1</code>

同理,使用相同的方式擷取主機名:

<code>$ curl http:</code><code>//169</code><code>.254.169.254</code><code>/2009-04-04/meta-data/hostname</code>

<code>demo1.novalocal</code>

在自定義的鏡像中,是無法自動擷取sshkey的,官方提供的cirros鏡像是通過自帶的cloud-init實作的,是以當我們自己上傳鏡像時,可以在啟動虛拟機前自定義腳本,擷取key和其它初始化資訊,完成相同的功能。

控制節點服務

使用 openstack endpoint list指令可以檢視目前的服務注冊資訊,此處所說的控制節點,一般指安裝消息隊列RabbitMQ的節點。

MySQL:為各個服務提供資料存儲

需要直接配置資料庫的服務:nova, nova-api, glance, keystone, neutron, cinder

RabbitMQ:為各個服務之間通信提供交通樞紐

監聽端口5672,其中15672 和5672 端口分别為rabbitMQ的web管理端口和服務端口

KeyStone:為各個服務之間通信提供認證和服務注冊

keystone主要通過http請求完成認證功能,keystone-public使用5000端口,keystone-admin使用35357

Glance服務提供鏡像的管理和存儲

鏡像路徑:/var/lib/glance/images/

glance有兩個元件:glance-api,監聽9292端口,glance-regestry,監聽9191端口

Nova提供虛拟機的計算資源如CPU,記憶體等

Nova-compute: 一般運作在計算節點上,通過排程不同的虛拟機管理工具來管理不同類型的虛拟機。如KVM就使用libvirt來建立KVM虛拟機等。

Nova-api:與其它服務進行資訊互動,服務端口為8774

novncproxy:作為vnc的代理,監聽6080端口,在計算節點和qeum-kvm服務銜接(5900端口)

Neutron: 為虛拟機提供網絡資源

neutron服務的監聽端口為9696.

Cinder: 為虛拟機提供存儲(雲硬碟)

cinder-api:接受API請求,并将其路由到``cinder-volume``執行,預設端口為8776。

ccinder-volume:與塊存儲服務和例如``cinder-scheduler``的程序進行直接互動。它也可以與這些程序通過一個消息隊列進行互動。

cinder-scheduler:選擇最優存儲提供節點來建立卷。其與``nova-scheduler``元件類似。

cinder-backup daemon:cinder-backup服務提供任何種類備份卷到一個備份存儲提供者。

虛拟機建立流程

1、使用者在Dashboard送出請求keystone認證,擷取登入token登入.

2、使用Dashboard,使用http協定向nova-api發出建立虛拟機的請求。

3、Nova-api接受到請求之後,會使用擷取token去keystone上進行驗證,确認請求合法。

4、Nova-api确認請求合法後,将需要讀取和同步的資料同步到資料庫中,并将建立虛拟機的請求放入消息隊列。

5、Nova-Schduler 發現消息隊列的請求之後,會從資料庫中擷取資料,并對資源進行排程和計算,确認虛拟機應該建立在哪個節點,得到這些資訊之後,會将這些資訊傳回給消息隊列。

6、Nova-compute在消息隊列中得到這些資訊之後,會通過Nova-conductor中間件與資料庫互動,擷取相關資訊,并依次請求Glance、Neutron、Cinder去擷取建立虛拟機所需要的資源。在這個過程中。Nova每次和Glance、Neutron、Cinder的互動都需要去keystone上進行确認請求是否合法.

7、當鏡像、網絡、存儲等資源都擷取到後,Nova-compute 會調用libvirt(以KVM為例)去建立虛拟機。

故障處理:

1、檢視日志報錯資訊,一般隻需檢視ERROR資訊即可。

2、時間必須同步。

3、建立虛拟機出錯,需要确認計算節點是否有足夠的資源,這個在日志中也能展現。

4、檢視服務端口和服務狀态:

<code>openstack compute service list</code>

<code>openstack network agent list</code>

高可用與負載均衡:

1、一般對控制節點使用haproxy做負載均衡。

2、如果要做高可用,可以使用keepalived。

3、對資料庫和RabbitMQ做叢集。

4、底層存儲可以采用分布式存儲,如Ceph。

 本文轉自 酥心糖 51CTO部落格,原文連結:http://blog.51cto.com/tryingstuff/1869029