說明:因為個人興趣,對openstack有濃厚的興趣。在網上無意間看到了docker是以突發奇想做了這個實驗。現拿出來給大家分享。此文隻适合參考,不可直接使用到生産環境。因為裡面有很多的系統漏洞,可能會被黑客利用。本文隻用于大家學習研究,為大家降低docker與openstack結合的門檻,也降低了硬體門檻,提供一些廣闊的思路。
此文在兩個QQ群和百度文庫中有過分享。文中也有借鑒一些網絡的資料,在這裡一并感謝那些前輩的資料和思路。因為不知道名字隻能一起統稱了!
openstack-kilo版本基于docker的雲計算
目錄
簡介... 2
第一章、環境搭建... 2
第二章、建立openstack控制元件... 5
一、openstack鏡像制作:... 5
二、建立mysql資料庫鏡像:... 6
三、建立rabbitmq-server鏡像... 6
四、建立openstack-keystone鏡像... 7
五、建立glance元件鏡像... 8
六、nova計算節點和nova控制節點安裝... 9
七、建立網頁管理界面... 10
第三章、更改nova computer配置,使用docker啟動執行個體。... 10
nova-docker使用注意事項:... 11
報錯日志處理:... 11
第四章、排錯和使用舉例... 12
說明:本文介紹使用docker作為openstack-kilo元件的容器進行安裝。并且使用docker服務作為計算節點的虛拟機來啟動執行個體。這樣做有幾個好處:
1、kilo元件除計算節點以外的關鍵元件都被放在了docker容器中,在雲計算元件需要更新和更新檔修複的時候可以無縫的進行切換。把更新完的鏡像啟動一個容器即可,如果更新失敗隻需要把新的容器停掉。如果成功隻用把老版本的容器停掉。
2、節省資源,在本文中所有的openstack元件都啟動在一台虛拟機中。虛拟機1G記憶體,1核CPU。有了docker的幫助讓很多沒有硬體的人也可以玩上openstack的分布式部署充分了解openstack各個元件間的協作關系。
PS:因為沒有DNS伺服器,是以所有配置檔案中的主機名稱都要替換成相應的IP位址。在生産環境中如果使用這種方式強烈建議配置DNS伺服器,然後在配置檔案中使用主機名。這樣在自動故障恢複的時候更加智能化。
實體環境使用兩台實體主機,一台交換機配置設定兩個網段。分别是192.168.1.1/24和172.10.10.1/24。172.10.10.1/24作為管理網段,192.168.1.1/24作為模拟公網網段。另外執行個體之間使用10.1.1.1/24作為執行個體配置設定網段。
另外為了管理友善,會為docker容器模拟openstack元件的伺服器配置設定192.168.1.1和172.10.10.1兩個網段的位址。
首先需要在兩台實體機上安裝好docker服務,一台控制端上面使用docker模拟多台控制元件伺服器,一台作為計算節點docker模拟openstack執行個體啟動。
此處作業系統使用centos7作為基礎,安裝docker很簡單使用yum install docker就安裝好了。配置控制節點實體基礎(注意:配置docker的步驟需要在基礎鏡像包之後再配置。):注意,其中有些内容需要×××才能得到安裝源和網頁。請自備×××。
接下來是制作docker基礎鏡像:
啟動systemctl start docker程式
首先擷取一個鏡像,docker pull centos 注意這擷取方式需要×××才能取得。
這樣取得的鏡像是沒有ssh的,隻是一個很基礎的鏡像包。接下來我們慢慢把帶有ssh和一些基本工具的鏡像包制作出來。
這裡使用Dockerfile檔案來建立鏡像,編輯Dockerfile
FROM centos
[email protected] #這個可以沒有。
COPY shadow/etc/shadow #把自己基礎系統的shadow檔案複制到和Dokerfile相同的目錄,不然你根本就ssh進去不了容器。用這個檔案替換鏡像中的檔案,root密碼就和你本機系統一樣了。
ENV containerdocker
RUN yum update -y
RUN yum install -ypython-setuptools
RUN (cd/lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i ==systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f/lib/systemd/system/multi-user.target.wants/*;\
rm -f/etc/systemd/system/*.wants/*;\
rm -f/lib/systemd/system/local-fs.target.wants/*; \
rm -f/lib/systemd/system/sockets.target.wants/*udev*; \
rm -f/lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f/lib/systemd/system/basic.target.wants/*;\
rm -f/lib/systemd/system/anaconda.target.wants/*;
RUN cp/usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN yum install –yopenssh-server
RUN systemctlenable sshd
VOLUME["/sys/fs/cgroup"]
CMD["/usr/sbin/init"]
都準備好以後就可以使用 docker build -t="base:v1.2_ssh" . 指令建立鏡像了。-t參數是建立鏡像的名稱和版本号,用冒号隔開,如果不寫版本号預設名字交latest。
Step 8 : EXPOSE 22
---> Using cache
---> 126b1779d925
Step 9 : CMD /usr/bin/supervisord-c /etc/supervisord.conf
---> 8b0482f22d97
Successfully built8b0482f22d97
出現這些資訊,最後一行表示成功了。
docker p_w_picpaths可以檢視到建立的鏡像。
使用docker run –ti –name test1 base:v1.2_ssh/bin/bash可以檢視是否能建立容器。如果能進入基本表示鏡像可用。
接下來就使用腳本來建立一個可以和實體機網段相同的容器。
腳本 vi addhost.sh
#!/bin/bash
docker run --privileged=true-d --net=none --name $1 $2
sleep 5s
Cid=`docker ps -a| grep $1 |awk '{print $1}'`
pid=`dockerinspect -f '``.`State`.`Pid`' $Cid `
mkdir -p/var/run/netns
ln -s /proc/$pid/ns/net/var/run/netns/$pid
ip link add${pid}A1 type veth peer name ${pid}A2
brctl addif br0${pid}A1
ip link set${pid}A1 up
ip link set${pid}A2 netns $pid
ip netns exec $pidip link set dev ${pid}A2 name eth0
ip netns exec $pidip link set eth0 up
read -p"Please input container IP on eth0(172.0.0.1/24)" IPADDR
ip netns exec $pidip addr add $IPADDR dev eth0
echo "`echo$IPADDR | awk -F/ '{print $1}'` $1" >> /etc/hosts
read -p "Doyou have any net interface?(Y/N)" CH
if ["$CH" = "Y" ]; then
ip link add${pid}B1 type veth peer name ${pid}B2
brctl addif br1${pid}B1
ip link set${pid}B1 up
ip link set${pid}B2 netns $pid
ip netns exec $pidip link set dev ${pid}B2 name eth1
ip netns exec $pidip link set eth1 up
ip netns exec $pidip addr add $IPADDR dev eth1
echo"$IPADDR $1" >>/etc/hosts
fi
read -p"Please input container default gateway address." GATEWAY
ip netns exec $pidip route add default via $GATEWAY
有必要說一下使用方法,sh addhost.sh test1 bash_ssh:v1.1
第一個參數test1是容器的名稱,第二個參數bash_ssh:v1.1是鏡像的名稱。腳本會指引輸入網卡的IP位址和網關。預設網關隻能有一個,最好是可以通路外網的那個網段的網關。當然不需要上外網的話當然可以随便。使用docker ps –a指令檢視容器狀态後就可以使用ssh 容器名稱連結到容器了。如ssh test1
另外再給一個删除容器的腳本vi delhost.sh
docker stop $1
docker rm $1
sed -i /$1/d/etc/hosts
rm -rf/var/run/netns/$pid
這裡隻有一個參數,就是傳入容器名稱如 sh delhost.sh test1
到此基礎鏡像就算制作完成了。
為了适應docker上安裝openstack的實體環境,需要多docker進行一些配置。/etc/sysconfig/docker打開配置檔案添加橋接端口OPTIONS='-b=br0'
為了友善管理橋接網卡為docker服務,需要安裝bridge-utils包。
更改網絡配置:
橋接口實體口
這裡需要配置兩個橋接網口br0和br1配置設定橋接到兩個實體網卡上。
PS 1:如果進入建立的容器後無法通路外網,請檢查docker的配置和網卡是否開啟混雜模式。
PS 2:容器的時間問題。因為openstack對時間比較敏感,是以需要在控制節點實體機中啟用NTP服務。容器在啟動的時候會使用主機的時間,另外計算節點實體機也需要和它進行同步。
下面将以此為基礎分别建立openstack的其它元件。
Docker資料參考:http://dockerpool.com/static/books/docker_practice/index.html
說明:先說下網絡規劃,網段配置設定192.168.1.121-192.168.1.200、172.10.10.121-172.10.10.200
注意:在某些時候國外的網站可能被牆,需要使用××××××後才能通路。網絡問題請自行解決。
上面隻是制作了centos的鏡像包,下面将再制作一個openstack的鏡像。建立一個Dockerfile
FROM base:v1.2_ssh
RUN yum install -yhttp://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
RUN yum install -yhttps://repos.fedorapeople.org/repos/openstack/openstack-kilo/rdo-release-kilo-1.noarch.rpm
RUN yum upgrade -y
RUN yum install -y openstack-selinux
CMD ["/usr/sbin/init"]
運作docker build -t "openstack:base". 指令生成openstack的基本包。上面rpm包的位址和路徑可能會與openstack官方文檔中不一樣,因為官方文檔路徑已經失效。如果報錯請自行查找路徑!
建立一個給資料庫使用的資料卷容器
docker run -d -v/data --name dbdata base:v1.2_ssh /bin/bash
mkdirdockerfile/openstack-db
cddockerfile/openstack-db
建立Dockerfile
FROMopenstack:base
RUN yum install -ymariadb mariadb-server MySQL-python
COPY mariadb_openstack.cnf/etc/my.cnf.d/
RUN systemctlenable mariadb
建立配置檔案vi /etc/my.cnf.d/mariadb_openstack.cnf
[mysqld]
bind-address = 0.0.0.0
default-storage-engine= innodb
innodb_file_per_table
collation-server =utf8_general_ci
init-connect ='SET NAMES utf8'
character-set-server= utf8
運作docker build -t openstack:db . 指令制作DB鏡像。
修改./addhost.sh把docker run一行先注釋一下,複制後添加
docker run --privileged=true-d --net=none --volumes-from dbdata --name $1 $2
然後使用./addhost.sh test1 openstack:db指令建立一個容器,使用ssh連結上以後運作mysql_secure_installation ,根據提示操作。
修改vi /etc/my.cnf
datadir=/data
完成以後再次建立一個鏡像
docker commitb8b9eff9264c openstack:db_v1.0 這個b8b9eff9264c替換成上面容器的ID使用docker ps –a指令檢視。
到此資料庫鏡像建立完成,使用./addhost.sh openstack-db openstack:db_v1.0指令啟動一個容器。過1分鐘左右就能通路資料庫了。
注意:容器的網絡配置在重新開機實體伺服器後會自動失效,可以編寫一個腳本自動啟動容器并添加相應IP位址。
用addhost.sh腳本啟動一個以openstack:base的容器。
ssh 連結到容器後進行操作。
此處内容和openstack官方文檔一緻
yum installrabbitmq-server
systemctl enablerabbitmq-server
systemctl startrabbitmq-server
rabbitmqctladd_user openstack rabbit_password
rabbitmqctlset_permissions openstack ".*" ".*" ".*"
好,完成以後在實體主機上建立一個rabbit的鏡像。
docker commitc1428dcc7d7b openstack:rabbit
docker p_w_picpaths檢視鏡像是否建立成功。成功後使用./delhost.sh test1删除剛才的容器。
再使用./addhost.sh腳本建立一個rabbit容器。記得前面建立資料庫的時候修改了這個腳本,要改回來。不然每個容器都有那麼個資料庫目錄,不小心操作删除掉就完了。
使用./addhost.sh 腳本以openstack:base為鏡像建立一個容器。
ssh登入後按照openstack官方文檔進行操作。
另外因為是分開安裝的元件,是以/etc/keystone/keystone.conf中還需要修改
rabbit_host =RABBIT_IP,需要寫IP位址,
rabbit_password =xxxxxxx。RABBIT的密碼。
PS:執行openstack service create --type identity--description "OpenStack Identity" keystone 指令時報錯:
Traceback (mostrecent call last):
File "/usr/bin/openstack", line 6,in <module>
from openstackclient.shell import main
File"/usr/lib/python2.7/site-packages/openstackclient/shell.py", line 23,in <module>
from cliff import app
File"/usr/lib/python2.7/site-packages/cliff/app.py", line 14, in<module>
from .interactive import InteractiveApp
File "/usr/lib/python2.7/site-packages/cliff/interactive.py",line 10, in <module>
import cmd2
File"/usr/lib/python2.7/site-packages/cmd2.py", line 361, in<module>
class Cmd(cmd.Cmd):
File"/usr/lib/python2.7/site-packages/cmd2.py", line 424, in Cmd
if subprocess.Popen(['which', editor],stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0]:
File"/usr/lib64/python2.7/subprocess.py", line 711, in __init__
errread, errwrite)
File"/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2]No such file or directory
看了下py檔案,沒發現有錯誤。keystone.log也沒有日志輸出。網頁上找了半天,後來什麼都沒改又可以建立了。不知道是怎麼回事。
使用openstack endpoint create \
--publicurlhttp://controller:5000/v2.0 \
--internalurlhttp://controller:5000/v2.0 \
--adminurlhttp://controller:35357/v2.0 \
--region RegionOne\
identity 指令建立的時候controller需要改成IP位址,這個IP為即将建立的容器IP位址。
按照官方文檔進行測試通過以後就可以建立鏡像了
docker commit c7d4663a9d5fopenstack:keystone
然後使用./addhost腳本進行建立。
建立好以後再進行官方文檔測試。沒問題就算全部通過了。
為保證glance儲存的鏡像資料不會因為容器停止而删除,是以需要先建立一個資料卷容器。
docker run -d -v/glancedb --name glancedb base:v1.2_ssh
修改./addhost.sh 的docker行為
docker run--privileged=true -d --net=none --volumes-from glancedb --name $1 $2
vi/etc/glance/glance-api.conf中修改這項内容如下。
filesystem_store_datadir=/glancedb/p_w_picpaths/
下載下傳測試鏡像的時候,網址路徑有錯誤。使用下面的網址下載下傳。
http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-disk.img
修改路徑擁有者chown glance:nobody /glancedb/
chown glance:glance/glancedb/p_w_picpaths
注意檢視,/var/lib/glance目錄的權限和擁有者。改成一模一樣,如果修改好以後還是不行。還需要使用chcon -t unlabeled_t /glancedb/ -R 指令修改seliunx參數。
下載下傳後上傳鏡像,成功就算完成了。
因為這裡需要儲存docker的鏡像到glance是以修改一下glance的配置。
vi/etc/glance/glance-api.conf
container_formats= ami,ari,aki,bare,ovf,docker
完成以後重新開機systemctl restart openstack-glance-api然後再上傳鏡像測試。成功後就可以使用docker commit指令送出一個新鏡像了。
由于是在docker 容器中建立的glance,是以需要在控制端實體機上安裝python-glanceclient元件,和配置admin-opencrh.sh的變量檔案。
exportOS_PROJECT_DOMAIN_ID=default
exportOS_USER_DOMAIN_ID=default
exportOS_PROJECT_NAME=admin
exportOS_TENANT_NAME=admin
exportOS_USERNAME=admin
exportOS_PASSWORD=www.admin.com
exportOS_AUTH_URL=http://172.10.10.123:35357/v3
exportOS_IMAGE_API_VERSION=2
使用source指令使其生效。
然後在實體機中使用
docker savebase:v1.2_ssh | glance p_w_picpath-create --container-format docker --disk-format raw--name base:v1.2_ssh --visibility public --progress指令看是否能上傳成功。
如果不出意外的話一般會成功的。可以進入glance容器檢視/glancedb/p_w_picpaths目錄下是否有檔案多出來。
結束後就可以docker commit指令,再次送出鏡像儲存。
送出成功後就可以使用./addhost.sh腳本用新的鏡像啟動一個glance元件了。
nova計算節點是實體機,nova控制節點是docker容器。是以下面建立的鏡像都是nova控制節點,這裡稱作nova-api。
使用./addhost.sh 腳本以openstack:base鏡像啟動一個容器。配置好IP位址!剩下的按照官方文檔進行操作。
如果在配置完啟動後面程式的時候發現有無法找到的服務,請重新安裝那個包。
303-c177-4264-8396-6eb8248b03dd- - - - -] AMQP server 172.10.10.122:5672 closed the connection. Check logincredentials: Socket closed
因為rabbitMQ的賬戶密碼不正确。。重新在rabbitMQ上面運作一下
rabbitmqctladd_user openstack RABBIT_PASS
兩條指令。
跳到nova-network節點,把nova-api的vi /etc/nova/nova.conf
network_api_class= nova.network.api.API
security_group_api= nova
也打開。
把計算節點和控制節點都安裝好以後就可以對控制節點進行鏡像送出了。
然後再用新送出的鏡像建立容器,使用nova service-list再次檢視服務狀态。這時可能會出現剛才用來做模版的那個主機全部down狀态,可以不用管。如果實在不想看到這些資訊,可以在nova資料庫的services表中删除相關的記錄。
理論上nova-network也是可以單獨拿一台服務來做的,不過為了達到備援性一般都和nova計算節點放在一起。每個計算節點安裝一個nova-network,各自負責。避免了nova-network當機造成所有執行個體無法使用網絡的情況。單獨安裝也能分擔負載。
vi /etc/openstack-dashboard/local_settings
OPENSTACK_HOST =IPADDR。這個位址需要配置成keystone的IP位址。
啟動網頁後就可以試着在圖形界面建立執行個體了。
使用官方文檔中Launch an instance with legacy networking(nova-network)一節的方式建立parikey。等!然後在圖形界面的Project->instances中啟動一個執行個體。
後面還有swift、cinder等元件沒有安裝,這裡就不一一示範。建立方式和上面其它元件一樣。但隻能選擇建立控制節點,不能建立其它節點。因為其它節點需要提供磁盤等實體服務,并且需要對系統核心進行修改。容器對核心的修改權限是有限的,可能會導緻建立不成功或者無法使用等情況。
檢查docker是否正常安裝并啟動。
安裝docker使用yum install docker指令
安裝git指令,yum install git
擷取novadocker
pip install -egit+https://github.com/stackforge/nova-docker#egg=novadocker
如果沒有pip指令,使用yum install python-pip安裝。
如果提示pip版本不對,使用pip install –upgrade pip更新
pkg_resources.VersionConflict:(pbr 0.11.0 (/usr/lib/python2.7/site-packages),Requirement.parse('pbr>=1.8'))
使用pip install --upgrade pbr更新
安裝novadocker
cd src/novadocker/
python setup.pyinstall
cat ./etc/nova/rootwrap.d/docker.filters >>/etc/nova/rootwrap.conf
配置nova計算節點nova.conf修改以下内容:
compute_driver =novadocker.virt.docker.DockerDriver
system startdocker啟動Docker程式。檢視ll /var/run/docker.sock使用者群組。
srw-rw----. 1 rootroot 0 12月 31 10:53 /var/run/docker.sock
把nova加入到docker.sock檔案顯示的所在組,這裡是root。usermod -G root nova
配置完成以後重新開機openstack-nova-compute服務。然後檢視nova service-list服務狀态。up後代表配置正常無錯誤,服務正常啟動。這時可以使用上面glance中上傳的docker鏡像建立一個執行個體了。
1、無VNC可以連結,docker是一個容器别想使用遠端進入到容器内部來管理它。因為這麼做毫無意義。就算修改成功後,停止或重新開機容器修改的資料都将全部丢失。
2、如果實在想管理容器,可以通過建立預設啟動ssh服務的鏡像來遠端連結。但是不建議這麼做。使用supervisord可以同時啟動多個服務!
3、在實際應用中可以在建立docker鏡像時指定外部資料卷來擷取容器的日志等資訊。
4、在實際應用中,為友善管理每個容器隻運作一個服務。如mysql、http等其中之一。
5、容器不能作為lvs等需要使用資料包轉發服務的應用。不過理論上是可以使用nginx,haproxy這種修改配置檔案後就可以使用的服務。
6、docker容器隻能用于基礎服務的提供,比如各類資料庫,WEB伺服器等類似應用。
/var/log/messge:
1、default='nova.virt.firewall.NoopFirewallDriver')
無法啟動nova-compute
編輯nova.conf注釋下面這行。
#firewall_driver =nova.virt.libvirt.firewall.IptablesFirewallDriver
2、Dec 31 10:39:16 nova-compute nova-compute:raise ConnectionError(err, request=request)
Dec 31 10:39:16nova-compute nova-compute: ConnectionError: ('Connection aborted.', error(2,'ENOENT'))
Dec 31 10:39:16nova-compute nova-compute: 2015-12-31 10:39:16.600 31594 ERRORnova.openstack.common.threadgroup [req-b694c876-30e1-4cb5-b324-13262bc081ab - -- - -] ('Connection aborted.', error(2, 'ENOENT'))
請檢查docker是否啟動。
3、Dec 31 12:22:55 nova-compute docker:time="2015-12-31T12:22:55.347478315+08:00" level=errormsg="Handler for GET /p_w_picpaths/{name:.*}/json returned error: No such p_w_picpath:base:v1.2_ssh"
修改檔案"/usr/lib/python2.7/site-packages/novadocker/virt/docker/driver.py":
def _get_p_w_picpath_name(self, context,instance, p_w_picpath):
fmt = p_w_picpath['container_format']
if fmt != 'docker':
msg = _('Image container format notsupported ({0})')
raiseexception.InstanceDeployFailure(msg.format(fmt),
instance_id=instance['name'])
return p_w_picpath['name'].lower()
4、Dec 31 12:30:55 nova-compute nova-network:s.py", line 38, in ensure_tree\n os.makedirs(path, mode)\n', ' File "/usr/lib64/python2.7/os.py", line 157, in makedirs\n mkdir(name, mode)\n', "OSError: [Errno13] Permission denied: '/usr/lib/python2.7/site-packages/networks'\n"]
修改nova.conf檔案為
networks_path=/var/lib/nova/networks重新開機openstack-nova-network服務。
5、Dec 31 13:56:04 nova-compute nova-compute:2015-12-31 13:56:04.632 3818 TRACE nova.compute.manager [instance:565d0b8d-dae7-4846-9861-79406cf175a9] Stderr: 'sh:/usr/local/bin/nova-dhcpbridge:\xe6\xb2\xa1\xe6\x9c\x89\xe9\x82\xa3\xe4\xb8\xaa\xe6\x96\x87\xe4\xbb\xb6\xe6\x88\x96\xe7\x9b\xae\xe5\xbd\x95\n\ndnsmasq:cannot run lease-init script /usr/local/bin/nova-dhcpbridge: No such file ordirectory\n'
修改nova.conf
dhcpbridge=/usr/bin/nova-dhcpbridge然後重新開機openstack-nova-network服務。
6、Dec 31 14:06:52 nova-compute nova-compute:Stderr: u'Cannot open network namespace "785757e487b825d0386407994d12c47d96cc0a014940d5ca3efbe70646ad31df":Permission denied\n'
Dec 31 16:33:56nova-compute nova-compute: Stderr: u'"mount --make-rslave /" failed:Permission denied\n'
檢視785757e487b825d0386407994d12c47d96cc0a014940d5ca3efbe70646ad31df确實沒有這個目錄,這個是連結指向/proc/7928/ns/net目錄。而/proc/7928/ns/net目錄沒有建立。
問題始終沒找到,元旦放假後重新開機計算節點就可以建立了。
7、在日志中發現
docker.host_url = unix:///var/run/docker.sock
這個參數的意思是不是可以配置單獨的docker伺服器組,隻要把url指向docker主機就行了。
1、建立執行個體報錯:
2015-12-2917:49:53.983 17692 ERROR nova.virt.libvirt.driver[req-b15ea5e4-816e-4a45-b332-5ff57a8f3b22 bd935861e2b4487fbb39fcb006bd54270f01f0de5ef5482a98739b310454b89a - - -] Error launching a defined domain withXML: <domain type='kvm'>
<name>instance-00000001</name>
…………………………..省略……………………………………………..
2015-12-2917:49:53.984 17692 TRACE nova.compute.manager [instance:a0fe0d99-2a93-47c6-a20e-0068ac77416c] libvirtError: internal error: referencedfilter 'no-mac-spoofing' is missing
經過上網搜尋以後,發現問題與libvirt的nwfilter功能相關。
處理方式:
使用virsh nwfilter-list檢視資訊。
UUID Name
------------------------------------------------------------------
a746b2e6-317d-42db-a6d9-3004fcd2e742 nova-allow-dhcp-server
a984bd3e-4830-41d5-9d4b-8de06aa730ed nova-base
290c8d53-2989-40e0-93c5-632aaa948f6d nova-instance-instance-00000001-fa163e02d32e
6b48d414-081a-4b46-ac27-8b306cdef51b nova-no-nd-reflection
eefd31f5-1d3a-447c-8809-96d2bd923db5 nova-nodhcp
a64af4fd-5abd-4cf9-8187-ace5b36e7bca nova-vpn
發現nwfilter缺少no-mac-spoofing資訊
安裝yum install libvirt-daemon-config-nwfilter
重新開機libvirtd服務
systemctl restartlibvirtd
2、登入頁面成功後,第二天發現又報錯無法登入。錯誤資訊:
dashboard伺服器中的,http錯誤日志。
[Wed Dec 3010:58:01.593575 2015] [:error] [pid 41] ValidationError:[u"'bd935861e2b4487fbb39fcb006bd5427' value must be an integer."]
keystone服務中的日志資訊。
2015-12-3010:58:01.304 279 DEBUG keystone.middleware.core [-] Auth token not in therequest header. Will not build auth context. process_request /usr/lib/python2.7/site-packages/keystone/middleware/core.py:229
解決方法:
修改dashboard配置
vi/etc/openstack-dashboard/local_settings
添加下面兩行
SESSION_ENGINE ='django.contrib.sessions.backends.cache'
AUTH_USER_MODEL ='openstack_auth.User'
然後重新開機httpd服務再重新登入。
3、無法通過控制台連結VNC。不能從網頁console進入控制執行個體。
檢視nova-api中的nova-novncproxy.log日志。報錯
2015-12-3013:18:22.282 3932 INFO nova.console.websocketproxy[req-131fee8a-f39c-45bc-a2b3-53a1134f4db2 - - - - -] 31: connecting to: 172.10.10.15:5900
2015-12-3013:18:22.295 3932 INFO nova.console.websocketproxy[req-131fee8a-f39c-45bc-a2b3-53a1134f4db2 - - - - -] handler exception: [Errno113] EHOSTUNREACH
使用telnet指令确實無法通路到計算節點的5900端口。
使用iptables-save > iptables指令儲存後,修改iptables檔案。在INPUT最前面一行加入-A INPUT -p tcp -m tcp --dport 5900 -j ACCEPT 儲存。
使用iptables-restore < iptables指令重新導入後再連結網頁中的VNC發現可以連結了。
4、執行個體無法連結外網
執行個體建立成功并且獲得内網IP以後無法通路外網。
使用iptables –L –t nat 指令檢視結果是nova-network-float-snat all -- anywhere anywhere
SNAT all -- 10.1.1.0/24 anywhere to: 172.10.10.15
172.10.10.15是管理接口IP。經過排查發現這個IP的設定和nova.conf檔案中my_ip參數相同。改成外網網卡的ip位址并重新開機openstack服務将會正常。
5、配置設定一個公網IP
使用指令
novafloating-ip-bulk-create [--pool POOL_NAME] [--interface INTERFACE]RANGE_TO_CREATE
例:nova floating-ip-bulk-create --pool pub1 192.168.1.200/29
建立好以後可以使用nova floating-ip-bulk-list指令檢視。
然後就可以從網頁上project->Access & Security->FloatingIPs頁面擷取一個IP并配置設定給執行個體。
配置設定成功後就可以使用這個IP位址通路執行個體了。
參考内容:
Docker:http://dockerpool.com/static/books/docker_practice/introduction/README.html
running-systemd-within-a-docker-container:
https://rhatdan.wordpress.com/2014/04/30/running-systemd-within-a-docker-container/
openstack-yum:
http://docs.openstack.org/kilo/install-guide/install/yum/content/ch_preface.html
openstack-apt:
http://docs.openstack.org/kilo/install-guide/install/apt/content/ch_preface.html
nova-docker:
https://wiki.openstack.org/wiki/Docker#Configure_an_existing_OpenStack_installation_to_enable_Docker
容器與OpenStack二者如何深度整合介紹:
http://www.d1net.com/cloud/news/351191.html
聯系方式:
QQ:305543274
PS:如果有問題請通過百度或谷歌方式擷取幫助。解決問題的直接方式永遠隻有 Just think and do it!