怎么样分分钟玩转诛仙星漫版联盟?

10大微信大咖经验分享:如何分分钟炒热你的公众号
稿源:插坐学院
做微信内容运营没有思路,怎么破?
买几本书来看?
那就是吃XX都赶不上XX了。
微信的发展太快,几个月前还算成功的案例放在今天,很可能已经过时或者违规。最快捷的方式就是看一下顶尖的微信运营者在做什么,大招聚合,一键速成。
所以,小编整理了如下选题,摘录了10位一线微信大咖的经验分享。(内容皆是干货,建议保存下来慢慢嚼~~~)
李叫兽:360营销顾问,运营公众号李叫兽
如何写一篇至少及格的微信文章?
根据公众号和知乎的特点,最关键的是:
1,创造缺口,让他们产生对答案的渴望;
具体方法:
(1)&找到违背直觉的部分&。
(2)指出别人的错误
(3)讲&起点&和&结果&引发读者对过程的疑问。
(4)讲一个成功案例,引发读者好奇&&他为什么会成功?
2,顺应读者的疑问,让人一直读下去;
写完每一句话都要想一想:
这时候读者看完这句话,内心产生的疑问是什么?期待下面出现的内容是什么?我将要写的下面那句话是否能解答这个疑问呢?
如果不能,你的文章就会变的逻辑混乱、晦涩难懂&&
3,制造&启发感&&&在熟悉的事物中,看到新的解释。
魏武挥:知名博客ItTalks运营人
把媒体当目的做的,都活得苦哈哈的,把媒体当手段做的,都还活得不错。
我一向认为,内容生产和内容运营是两码子事。前者类似一个产品制造过程,而后者,是产品推销。
相对来说,我更擅长内容生产。我不是不会内容运营&&怎么说当年也是做过BBS运营,做过首席运营官的,而是我一来没这个时间和精力,二来也放不下身段来。
所以我的个人品牌打造之路&&除了我自己在内容生产,还需要别人帮我进行内容运营。我的方法就是给媒体写稿子&&从这个角度讲,稿费相对来说不是最重要的,所以我从来不查媒体有没有给我稿费这件事。
机构媒体都有专门的运营人员,大多数情况下,他们付费获取我的内容,既然付了费,就会希望最大化挖掘这篇文章的传播价值。其实公号这个领域中,我绝对算是个小号。我可以很坦诚地告诉各位,我弄到现在不过三万粉。但我的文章,真的有那么点小小的铺天盖地之势。
小马宋:暴风魔镜创意合伙人,前奥美互动助理创意总监,运营公众号中国文联
该怎样正确地运用&用自己说话的方式写作&这个方法指导自己的写作方式,并且能够在帮助自己克服消除不自信心理的同时,能够确保写出来的文章不会像是个笨蛋在夸夸其谈而已呢?
下面就和大家分享个人的黄金法则&&&七步速成法&。
1.设想自己正与一个很知心的好朋友聊天。
2.把自己在陈述问题时所说的话录下来。
3. 深深吸一口气,放松,再放松,给自己几秒完全属于自己的时间,用自己说话的方式写作,你会不自觉地在写作中带入你的个人观点。
4. 多使用日常生活用语写作。
5. 丢掉所有条条框框的规则包袱吧!写作不需要搞得那么复杂!
6.找个熟悉的好朋友看一下文章。
7. 把文章大声地读出来。
阑夕:虎嗅2014年度作者
如何写一篇有传播力的文章?
我自己总结有3类:
一、这个文章说出了我的心里话
大家知道每个人都有自己的表达欲,但不是每个人都有自己的话语权。如果恰好有这么一篇文章,把他想要说的话说出来,那么他就会把它转到朋友圈来证明自己。
生活没有一个统一的标准,不同的人看问题的角度是不一样的,你能不能代表一个足够大的群体发声、代表他们说出心里话,这决定了你文章传播的广度。
二、说出他不知道的事
有一个购物社区叫小红书,它的用户就很明显,就是居家的女性,她们时间很充裕,每天对信息获取的渴望非常大,对什么事都好奇。所以小红书做文章就设计的很精巧,比如去日本旅行,哪10个东西最值得买?又或者7个最好的美妆用品,一些技巧性的东西。
这类N个事物的标题很容易吸引用户阅读,同时很容易开启他们的脑洞,原来有这么一个事儿我不知道。在传统门户时代,招编辑的一个要求就是要会写10大系列的文章。比如10大最帅的动漫男主角之类的。
为什么大家刻意把这个点出来,就是因为它很能够吸引人,同时能够让你知道,原来有这么多事儿我不知道。非常精确的量,这类容易被转发到朋友圈。
三、代表一种品位
可能一个人本身品位不高,但如果一篇文章能够代表一种格调,或者能够帮助他提升品位,他很容易去转。你朋友圈肯定有这样的朋友,说白了就是很装,没事转什么葡萄酒的几种饮用方法,这代表了他向往的一种生活。
有好的文章希望站长之家帮助分享推广,猛戳这里
本网页浏览已超过3分钟,点击关闭或灰色背景,即可回到网页玩赚联盟是真的吗_百度知道
玩赚联盟是真的吗
我有更好的答案
是真的,一个可以让你家庭赚钱两不耽误的平台
电视广播蜕喝蜻蜓睦圆
骗钱,有风险,交会费后各种理由踢出群,就算成功做单了,要么回款超慢,要么不回款,一群骗子互相演戏,希望更多被骗的人,站出来揭发他们,不要让更多的人受骗,也希望有机关,电视台,共安揭发爆光,天下没有免费的午餐,切记,乱上传身份证,钱行卡,视频认证,都要承担风险的,希望不要再有人受骗,谢谢了
是真的,那些说骗子的我也是醉了!我一直在做,也是朋友带来的。再好的平台看来也不能让所有人说好啊,就跟哪个明星都有黑粉一样,哎!
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
联盟的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。《星漫联盟》奇遇玩法攻略-游戏手游-E都市
369387篇文章
《星漫联盟》奇遇玩法攻略
&&&&解锁等级&&&&无等级限制;&&&&玩法解析:&&&&进入奇遇玩法界面中,点击中间探索键即可。默认有32次探索机会,没消耗一次,需要6分钟恢复时间。提升等级的话也可以恢复一定的次数;&&&&玩法奖励:&&&&奖励很多,主要有金币、经验、经验卡、装备、英雄等。如果触发了活动副本,玩家可以进入活动副本挑战,获得大量丰富的奖励!&&&&商店:&&&&在里面有两个商店,分别是浦沅商店和静灵庭。&&&&浦沅商店可以用金币兑换各种装备,其中不乏极品的哦!&&&&静灵庭可以用声望兑换各种英雄,也是有不少好的英雄!每个商店每隔一段时间便会刷新一次,玩家们也可以使用刷新令或者是钻石快速刷新!&&&&这个玩法还是非常给力的,建议玩家们前期可以多去探索。可以快速的升级!金币和声望较多的玩家可以多去商店里面转悠转悠,兑换到好的装备英雄就赚了!&&&&PS:VIP3玩家可以使用一键探索,果然还是花钱好使!
日本是一个地势多变、水力资源丰富的国家,由此构成了优美壮丽的景色,那里有山中积雪的湖泊、怪石嶙峋的峡谷、湍急的河流、峻峭的山峰、雄伟的瀑布以及大大小小的温泉,这些引人入胜的旅游景点常年吸引着大量游客来到日本观光。下面就跟着小编来了解下,在出发去日本前必须掌握的干货。
《龙之谷手游》由同名端游改编的3D动作手游。在经历数轮测试之后,终于宣布将于日开启终极测试。龙之谷手游哪个职业好?在龙之谷手游中,目前共有四大职业分别是战士、牧师、魔法师和弓箭手,以及马上将要上线的新职业学者,每个职业都有自己独特的技能与玩法。那什么职业比较好玩呢?什么职业PK厉害呢?相信小伙伴们都比较想了解吧!下面就由小编给大家带来龙之谷手游职业排行选择推荐吧!
QQ飞车手游剃刀是目前性能极佳的B车,我们可以通过改装来提升赛车的性能,那么QQ飞车手游剃刀怎么改装呢?......
奇迹暖暖黑暗边陲攻略, 帕米尔森林/墨尔多萨/罗塞城搭配推荐。......
奇迹暖暖信鸽森林的精灵高分搭配 破晓之战黑暗边陲攻略,看看奇迹暖暖信鸽森林的精灵高分搭配 破晓之战黑暗边陲攻略。......
网友评论仅供其表达个人看法,并不表明E都市立场。因为面向初学者,首先会有虚拟化和云计算的&预备知识&,会介绍 KVM,IaaS 等技术。
OpenStack核心
这是主要内容,包含OpenStack的架构和和各个核心组件。将会通过大量的案例、操作步骤、截图、日志来帮助大家理解 OpenStack 各组件是如何工作的。
其目标是让各位可以根据客户的需求进行配置和调整。
怎样的编写方式?
在当下这个共享经济时代,CloudMan觉得应该用互联网的方式来分享知识和心得。这个教程会通过CloudMan的微信公众号(cloudman6)每周1、3、5 定期发布。
用公众号我觉得有两个好处:
可以随时随地查看和浏览已推送的内容
可以通过公众号跟CloudMan互动,提出问题和建议
为啥叫《每天5分钟玩转 OpenStack》?
为了降低学习的难度并且考虑到移动端碎片化阅读的特点,每次推送的内容大家只需要花5分钟就能看完(注意这里说的是看完,有时候要完全理解可能需要更多时间哈),每次的内容只包含1-3个知识点,这也是我把教程命名为《每天5分钟玩转 OpenStack》的原因。虽然是碎片化推送,但整个教程是系统、连贯和完整的,只是化整为零了。
好了,今天这5分钟算是开了个头,下次我们正式开始玩转 OpenStack。
310001SPJJ
11,689 次访问
KVM 是 OpenStack 使用最广泛的 Hypervisor,本节介绍如何搭建 KVM 实验环境
上一节说了,KVM 是 2 型虚拟化,是运行在操作系统之上的,所以我们先要装一个 Linux。Ubuntu、Redhat、CentOS 都可以,这里我们以 Ubuntu14.04 为例。
基本的 Ubuntu 操作系统装好之后,安装 KVM 需要的包&
$ sudo apt-get install qemu-kvm qemu-system libvirt-bin virt-manager bridge-utils vlan
&通过这些安装包我们顺便复习一下上一节介绍的 KVM 的相关知识。
qemu-kvm 和 qemu-system 是 KVM 和 QEMU 的核心包,提供 CPU、内存和 IO 虚拟化功能
libvirt-bin 就是 libvirt,用于管理 KVM 等 Hypervisor
virt-manager 是 KVM 图形化管理工具
bridge-utils 和 vlan,主要是网络虚拟化需要,KVM 网络虚拟化的实现是基于 linux-bridge 和 VLAN,后面我们会讨论。
Ubuntu 默认不安装图形界面,手工安装一下&
sudo apt-get install xinit
sudo apt-get install gdm
sudo apt-get install kubuntu-desktop
&apt 默认会到官网上去下载安装包,速度很慢,我们可以使用国内的镜像站点。
配置/etc/apt/sources.list&
deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
&然后执行下面命令更新安装包 index
# apt update
Redhat 和 CentOS 安装相对简单,安装过程中选择虚拟化和图形组件就可以了。
小窍门:Ubuntu 默认是不允许 root 通过 ssh 直接登录的,可以修改 /etc/ssh/sshd_config,设置&
PermitRootLogin yes
&然后重启 ssh 服务即可
# service ssh restart
ssh stop/waiting
ssh start/running, process 27639
在虚拟机上做实验
作为 2型虚拟化的 KVM,是支持虚拟化嵌套,这使得我们可以在虚拟机中实验 KVM。 比如我在 VMWare Workstation 中安装了一个 Ubuntu14.04 的虚拟机,为了能让 KVM 能创建 嵌套的虚机,要把 CPU 的虚拟化功能打开。如下图在 VMWare 中设置以下 CPU 的模式
Ubuntu 启动后,用以下命令确认 CPU 支持虚拟化
# egrep -o '(vmx|svm)' /proc/cpuinfo
&确认 Libvirtd 服务已经启动
# service libvirt-bin status
libvirt-bin start/running, process 1478
310001SPJJ
10,107 次访问
前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要。不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助。
CPU 虚拟化
KVM 的虚拟化是需要 CPU 硬件支持的。还记得我们在前面的章节讲过用命令来查看 CPU 是否支持KVM虚拟化吗?
root@ubuntu:~# egrep -o '(vmx|svm)' /proc/cpuinfo
如果有输出 vmx 或者 svm,就说明当前的 CPU 支持 KVM。CPU 厂商 Intel 和 AMD 都支持虚拟化了,除非是非常老的 CPU。
一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度。 比如在我的实验机上运行的虚机 kvm1 在宿主机中 ps 能看到相应的进程。
虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程。看下图
在这个例子中,宿主机有两个物理 CPU,上面起了两个虚机 VM1 和 VM2。 VM1 有两个 vCPU,VM2 有 4 个 vCPU。可以看到 VM1 和 VM2 分别有两个和 4 个线程在两个物理 CPU 上调度。
这里也演示了另一个知识点,即虚机的 vCPU 总数可以超过物理 CPU 数量,这个叫 CPU overcommit(超配)。 KVM 允许 overcommit,这个特性使得虚机能够充分利用宿主机的 CPU 资源,但前提是在同一时刻,不是所有的虚机都满负荷运行。 当然,如果每个虚机都很忙,反而会影响整体性能,所以在使用 overcommit 的时候,需要对虚机的负载情况有所了解,需要测试。
内存虚拟化
KVM 通过内存虚拟化共享物理系统内存,动态分配给虚拟机。看下图
为了在一台机器上运行多个虚拟机,KVM 需要实现 VA(虚拟内存) -& PA(物理内存) -& MA(机器内存)直接的地址转换。虚机 OS 控制虚拟地址到客户内存物理地址的映射 (VA -& PA),但是虚机 OS 不能直接访问实际机器内存,因此 KVM 需要负责映射客户物理内存到实际机器内存 (PA -& MA)。具体的实现就不做过多介绍了,大家有兴趣可以查查资料。
还有一点提醒大家,内存也是可以 overcommit 的,即所有虚机的内存之和可以超过宿主机的物理内存。但使用时也需要充分测试,否则性能会受影响。
下一节我们讨论 KVM 如何实现存储虚拟化。
310001SPJJ
10,057 次访问
在学习 OpenStack 各服务之前,让我们先搭建起一个实验环境。
毋庸置疑,一个看得到摸得着而且允许我们随便折腾的 OpenStack 能够提高我们的学习效率。
因为是我们自己学习用的实验环境,CloudMan 推荐使用 DevStack
DevStack 丰富的选项让我们能够灵活地选取和部署想要的 OpenStack 服务,非常适合学习和研究。
首先我们来设计 OpenStack 的部署拓扑。
OpenStack 是一个分布式系统,由若干不同功能的节点(Node)组成:
控制节点(Controller Node) 管理 OpenStack,其上运行的服务有 Keystone、Glance、Horizon 以及 Nova 和 Neutron 中管理相关的组件。 控制节点也运行支持 OpenStack 的服务,例如 SQL 数据库(通常是 MySQL)、消息队列(通常是 RabbitMQ)和网络时间服务 NTP。
网络节点(Network Node) 其上运行的服务为 Neutron。 为 OpenStack 提供 L2 和 L3 网络。 包括虚拟机网络、DHCP、路由、NAT 等。
存储节点(Storage Node) 提供块存储(Cinder)或对象存储(Swift)服务。
计算节点(Compute Node) 其上运行 Hypervisor(默认使用 KVM)。 同时运行 Neutron 服务的 agent,为虚拟机提供网络支持。
这几类节点是从功能上进行的逻辑划分,在实际部署时可以根据需求灵活配置,比如:
在大规模OpenStack生产环境中,每类节点都分别部署在若干台物理服务器上,各司其职并互相协作。
这样的环境具备很好的性能、伸缩性和高可用性。
在最小的实验环境中,可以将 4 类节点部署到一个物理的甚至是虚拟服务器上。
麻雀虽小五脏俱全,通常也称为 All-in-One 部署。
在我们的实验环境中,为了使得拓扑简洁同时功能完备,我们用两个虚拟机:
devstack-controller:控制节点 + 网络节点 + 块存储节点 + 计算节点
devstack-compute:计算节点
物理资源需求
CPU 和内存供参考。
如果是在自己的 PC 机上创建虚机部署,资源可能达不到,可以适当调整。
网络上规划了三个网络:
Management Network:用于 OpenStack 内部管理用,比如各服务之间通信。 这里使用 eth0
VM(Tenant)Network:OpenStack 部署的虚拟机所使用的网络。 OpenStack 支持多租户(Tenant),虚机是放在 Tenant 下的,所以叫 Tenant Network。 这里使用 eth1
External Network:一般来说,Tenant Network 是内部私有网络,只用于 VM 之间通信,与其他非 VM 网络是隔离的。 这里我们规划了一个外部网络(External Network),通过 devstak-controller 的 eth2 连接。 Neutron 通过 L3 服务让 VM 能够访问到 External Network。 对于公有云,External Network 一般指的是 Internet。 对于企业私有云,External Network 则可以是 Intranet 中的某个网络。
下一节开始部署控制节点和计算节点。
310001SPJJ
9,933 次访问
本节按照以下步骤部署 DevStack 实验环境,包括控制节点和计算节点
创建虚拟机
按照物理资源需求创建 devstack-controller 和 devstak-compute 虚拟机
安装操作系统
安装 Ubuntu 14.04,并配置 eth0 的 IP devstack-controller &192.168.104.10 devstak-compute & &192.168.104.11
下载 devstack 代码,并切换到 stable/liberty 分支
apt-get install git -y
git clone https://git.openstack.org/openstack-dev/devstack -b stable/liberty
配置 stack 用户
创建 stack 用户
devstack/tools/create-stack-user.sh
为方便起见,将devstack目录放到/opt/stack下,并设置权限
mv devstack /opt/stack
chown -R stack:stack /opt/stack/devstack
切换到 stack 用户
su & stack
cd devstack
编写运行配置文件
在 /opt/stack/devstack 目录下,创建 local.conf。
devstack-controller
[[local|localrc]]
MULTI_HOST=true
HOST_IP=192.168.104.10 # management & api network
LOGFILE=/opt/stack/logs/stack.sh.log
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# enable neutron-ml2-vlan
disable_service n-net
enable_service q-svc,q-agt,q-dhcp,q-l3,q-meta,neutron,q-lbaas,q-fwaas,q-vpn
Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=
PHYSICAL_NETWORK=default
LOG_COLOR=False
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
devstack-compute
[[local|localrc]]
MULTI_HOST=true
HOST_IP=192.168.104.11 # management & api network
# Credentials
ADMIN_PASSWORD=admin
MYSQL_PASSWORD=secret
RABBIT_PASSWORD=secret
SERVICE_PASSWORD=secret
SERVICE_TOKEN=abcdefghijklmnopqrstuvwxyz
# Service information
SERVICE_HOST=192.168.104.10
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST
GLANCE_HOSTPORT=$SERVICE_HOST:9292
Q_HOST=$SERVICE_HOST
KEYSTONE_AUTH_HOST=$SERVICE_HOST
KEYSTONE_SERVICE_HOST=$SERVICE_HOST
CEILOMETER_BACKEND=mongodb
DATABASE_TYPE=mysql
ENABLED_SERVICES=n-cpu,q-agt,neutron
Q_AGENT=linuxbridge
ENABLE_TENANT_VLANS=True
TENANT_VLAN_RANGE=
PHYSICAL_NETWORK=default
# vnc config
NOVA_VNC_ENABLED=True
NOVNCPROXY_URL=&http://$SERVICE_HOST:6080/vnc_auto.html&
VNCSERVER_LISTEN=$HOST_IP
VNCSERVER_PROXYCLIENT_ADDRESS=$VNCSERVER_LISTEN
LOG_COLOR=False
LOGDIR=$DEST/logs
SCREEN_LOGDIR=$LOGDIR/screen
另外,为了加快安装速度,还可以加上下面的配置使用国内的 devstack 镜像站点
# use TryStack git mirror
GIT_BASE=http://git.trystack.cn
NOVNC_REPO=http://git.trystack.cn/kanaka/noVNC.git
SPICE_REPO=http://git.trystack.cn/git/spice/spice-html5.git
分别在 devstack-controller 和 devstak-compute 上执行命令
./stack.sh
会输出各项操作的结果。 日志会写到 stack.sh.log 文件。
整个过程需要连接Internet,网速慢可能会花较长时间,成功后最后会打印出相关信息。
devstack-controlle 上的输出
devstack-compute 上的输出
验证 OpenStack
下面验证 OpenStack 已经正常运行 浏览器访问 http://192.168.104.10/(devstack-controller 的 IP) admin/admin 登录
点击 System-&System Information,确保各个服务的状态正常
这里 cinder-volume 的状态是 &Down&,这是因为我们还没有配置 cinder,后面会让它 Up 起来。
启动 OpenStack
如果重启了系统,OpenStack 不会自动启动,可以运行下面命令
cd devstack ./rejoin-stack.sh
运行成功后,OpenStack 的每个服务都在一个 screen 中以进程方式运行。 使用 screen 有几个好处:
可以方便的在不同服务之间切换和查看日志。 因为OpenStack的服务很多,每个服务都有自己的日志文件。 查找日志是一件非常麻烦的事情,screen可以帮我们提高效率。
当我们修改了某个服务的配置文件需要重启服务时,只需在该服务的 screen 窗口 Ctrl+C,然后在命令行中找到上一个命令(Up键)执行就行,这个命令就是启动服务的命令。
下面是 screen 常用命令
在 screen 中执行
Ctrl+a+n 切换到下一个窗口
Ctrl+a+p 切换到前一个窗口(与 Ctrl+a+n 相对)
Ctrl+a+0..9 切换到窗口 0..9
Ctrl+a+d 暂时断开(detach)当前 screen 会话,但不中断 screen 窗口中程序的运行
在 shell 中执行
screen -ls &列出当前所有的 session
screen -r stack &回到 devstack 这个 session
删除自动创建的网络
Devstack 在部署时可能会创建几个测试网络,为了得到一个干净的环境需将其删除
删除 Router Admin-&System-&Routers
删除 Network Admin-&System-&Networks
至此,我们得到了一个干净的 OpenStack 环境。 后面会在这个环境中实践各个模块。
310001SPJJ
9,606 次访问
终于正式进入 OpenStack 部分了。 今天开始,CloudMan 将带着大家一步一步揭开 OpenStack 的神秘面纱。
OpenStack 已经走过了 6 个年头。 每半年会发布一个版本,版本以字母顺序命名。现在已经到第 12 个版本 Liberty(字母 L)。 OpenStack最初只有两个模块(服务),现在已经有 20+(见下图),每个模块作为独立的子项目开发。
面对如此庞大的阵容,作为初学者我们如何起步呢? 这也是 CloudMan 写这个系列教程的初衷: 通过实际操作帮助初学者由浅入深地学习和实践 OpenStack,并最终具备实施 OpenStack 的能力。
我们会把学习的重点放在 OpenStack 最核心的地方。 那什么是核心呢?请看下图
作为 IaaS 层的云操作系统,OpenStack 为虚拟机提供并管理三大类资源:计算、网络和存储。
这三个就是核心,所以我们的学习重点就是: 搞清楚 OpenStack 是如何对计算、网络和存储资源进行管理的。 在 20+ 模块中,管理这三类资源的核心模块其实不多,这几个模块就是我们的重点了。
要达到这个目的,我们自然需要研究 OpenStack 的整体架构。 架构里哪些核心模块负责管理计算资源、网络资源和存储资源?模块之间如何协调工作? 同时我们会构建一个实验环境,进到各个模块的内部,通过实际操作真正理解和掌握 OpenStack。
好,下面我们就从架构开始吧。
OpenStack 架构
架构是个好东西,它能帮助我们站在高处看清楚事物的整体结构,避免过早地进入细节而迷失方向。
下图是 OpenStack 的 Conceptual Architecture
中间菱形是虚拟机,围绕 VM 的那些长方形代表 OpenStack 不同的模块(OpenStack 叫服务,后面都用服务这个术语),下面来分别介绍。
Nova:管理 VM 的生命周期,是 OpenStack 中最核心的服务。
Neutron:为 OpenStack 提供网络连接服务,负责创建和管理L2、L3 网络,为 VM 提供虚拟网络和物理网络连接。
Glance:管理 VM 的启动镜像,Nova 创建 VM 时将使用 Glance 提供的镜像。
Cinder:为 VM 提供块存储服务。Cinder 提供的每一个 Volume 在 VM 看来就是一块虚拟硬盘,一般用作数据盘。
Swift:提供对象存储服务。VM 可以通过 RESTful API 存放对象数据。作为可选的方案,Glance 可以将镜像存放在 Swift 中;Cinder 也可以将 Volume 备份到 Swift 中。
Keystone:为 OpenStack 的各种服务提供认证和权限管理服务。简单的说,OpenStack 上的每一个操作都必须通过 Keystone 的审核。
Ceilometer:提供 OpenStac k监控和计量服务,为报警、统计或计费提供数据。
Horizon:为 OpenStack 用户提供一个 Web 的自服务 Portal。
在上面的这些服务中,哪些是 OpenStack 的核心服务呢? 核心服务就是如果没有它,OpenStack 就跑不起来。 很显然
Nova 管理计算资源,是核心服务。
Neutron 管理网络资源,是核心服务。
Glance 为 VM 提供 OS 镜像,属于存储范畴,是核心服务。
Cinder 提供块存储,VM怎么也得需要数据盘吧,是核心服务。
Swift 提供对象存储,不是必须的,是可选服务。
Keystone 认证服务,没它 OpenStack 转不起来,是核心服务。
Ceilometer 监控服务,不是必须的,可选服务。
Horizon 大家都需要一个操作界面吧。
现在核心服务有了,接下来我们将镜头拉近点,看看核心服务内部的组成结构。 Logical Architecture
在 Logical Architecture 中,可以看到每个服务又由若干组件组成。 以 Neutron 为例,包含
Neutron Server、Neutron plugins 和 Neutron agents
Network provider
消息队列 Queue
数据库 Neutron Database
在后面 Neutron 章节我们会展开学习这些组件。
这里想要强调一点: 上面是 Logical Architecture,描述的是 Neutron 服务各个组成部分以及各组件之间的逻辑关系。 而在实际的部署方案上,各个组件可以部署到不同的物理节点上。
OpenStack 本身是一个分布式系统,不但各个服务可以分布部署,服务中的组件也可以分布部署。 这种分布式特性让 OpenStack 具备极大的灵活性、伸缩性和高可用性。 当然从另一个角度讲,这也使得 OpenStack 比一般系统复杂,学习难度也更大。
后面章节我们会深入学习 Keystone、Glance、Nova、Neutron 和 Cinder 这几个 OpenStack 最重要最核心的服务。
310001SPJJ
8,934 次访问
virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。
virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。
下面我们演示如何使用 virbr0。
在 virt-manager 打开 VM1 的配置界面,网卡 Source device 选择 &default&,将 VM1 的网卡挂在 virbr0 上。
启动 VM1,brctl show 可以查看到 vnet0 已经挂在了 virbr0 上。
# brctl show
bridge name & & bridge id & & & & & & & STP enabled & & interfaces
br0 & & & & & & decbe & & & no & & & & & & & & & &eth0
virbr0 & & & & &8000.fea & & & yes & & & & & & & & & vnet0
用 virsh 命令确认 vnet 就是 VM1 的虚拟网卡。
# virsh domiflist VM1
Interface &Type & & & Source & & Model & & & MAC
-------------------------------------------------------
vnet0 & & &network & &default & &rtl8139 & & 52:54:00:75:dd:1a
virbr0 使用 dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息
# ps -elf|grep dnsmasq
5 S libvirt+ &2422 & & 1 &0 &80 & 0 - &7054 poll_s 11:26 ? & & & &00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf
在 /var/lib/libvirt/dnsmasq/ 目录下有一个 default.leases 文件,当 VM1 成功获得 DHCP 的 IP 后,可以在该文件中查看到相应的信息
# cat /var/lib/libvirt/dnsmasq/default.leases
52:54:00:75:dd:1a 192.168.122.6 ubuntu *
上面显示 192.168.122.6 已经分配给 MAC 地址为 52:54:00:75:dd:1a 的网卡,这正是 vnet0 的 MAC。之后就可以使用该 IP 访问 VM1 了。
# ssh 192.168.122.6
root@192.168.122.6's password:
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-30-generic x86_64)
Last login: Sun Sep &6 01:30:23 2015
root@VM1:~# ifconfig
eth0 & & &Link encap:Ethernet &HWaddr 52:54:00:75:dd:1a
& & & & &inet addr:192.168.122.6 &Bcast:192.168.122.255 &Mask:255.255.255.0
& & & & &inet6 addr: fe80::5054:ff:fe75:dd1a/64 Scope:Link
& & & & &UP BROADCAST RUNNING MULTICAST &MTU:1500 &Metric:1
& & & & &RX packets:61 errors:0 dropped:0 overruns:0 frame:0
& & & & &TX packets:66 errors:0 dropped:0 overruns:0 carrier:0
& & & & &collisions:0 txqueuelen:1000
& & & & &RX bytes: KB) &TX bytes: KB)
Ping一下外网。
root@VM1:~# ping www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.
64 bytes from 180.97.33.107: icmp_seq=1 ttl=52 time=36.9 ms
64 bytes from 180.97.33.107: icmp_seq=2 ttl=52 time=119 ms
64 bytes from 180.97.33.107: icmp_seq=3 ttl=52 time=88.5 ms
64 bytes from 180.97.33.107: icmp_seq=4 ttl=52 time=38.0 ms
64 bytes from 180.97.33.107: icmp_seq=5 ttl=52 time=122 ms
没有问题,可以访问外网,说明 NAT 起作用了。
需要说明的是,使用 NAT 的虚机 VM1 可以访问外网,但外网无法直接访问 VM1。 因为 VM1 发出的网络包源地址并不是 192.168.122.6,而是被 NAT 替换为宿主机的 IP 地址了。
这个与使用 br0 不一样,在 br0 的情况下,VM1 通过自己的 IP 直接与外网通信,不会经过 NAT 地址转换。
下节我们讨论 vlan 在 linux bridge 中的实现
310001SPJJ
8,708 次访问
本节讨论 nova-compute,并详细分析 instance 部署的全过程。
先给大家道个歉:今天这篇文章的篇幅比以往要多一些,本来想分两次发,但考虑到文章的完整和系统性,还是一次发了出来,这次可能要超出 5 分钟了,大家见谅。
nova-compute 在计算节点上运行,负责管理节点上的 instance。 OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。 nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。
通过 Driver 架构支持多种 Hypervisor
接着的问题是:现在市面上有这么多 Hypervisor,nova-compute 如何与它们配合呢? 这就是我们之前讨论过的 Driver 架构。
nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。 下面是Nova Driver的架构示意图
我们可以在 /opt/stack/nova/nova/virt/ 目录下查看到 OpenStack 源代码中已经自带了上面这几个 Hypervisor 的 Driver
某个特定的计算节点上只会运行一种 Hypervisor,只需在该节点 nova-compute 的配置文件 /etc/nova/nova.conf 中配置所对应的 compute_driver 就可以了。
在我们的环境中因为是 KVM,所以配置的是 Libvirt 的 driver。
nova-compute 的功能可以分为两类:
定时向 OpenStack 报告计算节点的状态
实现 instance 生命周期的管理
下面我们依次介绍。
定期向 OpenStack 报告计算节点的状态
前面我们看到 nova-scheduler 的很多 Filter 是根据算节点的资源使用情况进行过滤的。 比如 RamFilter 要检查计算节点当前可以的内存量;CoreFilter 检查可用的 vCPU 数量;DiskFilter 则会检查可用的磁盘空间。
那这里有个问题:OpenStack 是如何得知每个计算节点的这些信息呢? 答案就是:nova-compute 会定期向 OpenStack 报告。
从 nova-compute 的日志 /opt/stack/logs/n-cpu.log 可以发现: 每隔一段时间,nova-compute 就会报告当前计算节点的资源使用情况和 nova-compute 服务状态。
如果我们再深入问一个问题:nova-compute 是如何获得当前计算节点的资源使用信息的? 给大家一分钟自己先思考一下?
好,揭晓答案。
要得到计算节点的资源使用详细情况,需要知道当前节点上所有 instance 的资源占用信息。 这些信息谁最清楚? 当然是 Hypervisor。
大家还记得之前我们讨论的 Nova Driver 架构吧,nova-compute 可以通过 Hypervisor 的 driver 拿到这些信息。
举例来说,在我们的实验环境下 Hypervisor 是 KVM,用的 Driver 是 LibvirtDriver。 LibvirtDriver 可以调用相关的 API 获得资源信息,这些 API 的作用相当于我们在 CLI 里执行 virsh nodeinfo、virsh dominfo 等命令。
实现 instance 生命周期的管理
OpenStack 对 instance 最主要的操作都是通过 nova-compute 实现的,包括 instance 的 launch、shutdown、reboot、suspend、resume、terminate、resize、migration、snapshot 等。
本小节重点学习 nova-compute 如何实现 instance launch(部署)操作,其它操作将会在后面的章节讨论。
当 nova-scheduler 选定了部署 instance 的计算节点后,会通过消息中间件 rabbitMQ 向选定的计算节点发出 launch instance 的命令。 该计算节点上运行的 nova-compute 收到消息后会执行 instance 创建操作。 日志 /opt/stack/logs/n-cpu.log 记录了整个操作过程。
nova-compute 创建 instance 的过程可以分为 4 步:
为 instance 准备资源
创建 instance 的镜像文件
创建 instance 的 XML 定义文件
创建虚拟网络并启动虚拟机
下面我们依次讨论每个步骤。
为 instance 准备资源
nova-compute 首先会根据指定的 flavor 依次为 instance 分配内存、磁盘空间和 vCPU。 可以在日志中看到这些细节
网络资源也会提前分配。
创建 instance 的镜像文件
资源准备好之后,nova-compute 会为 instance 创建镜像文件。 OpenStack 启动一个 instance 时,会选择一个 image,这个 image 由 Glance 管理。 nova-compute会:
首先将该 image 下载到计算节点
然后将其作为 backing file 创建 instance 的镜像文件。
从 Glance 下载 image
nova-compute 首先会检查 image 是否已经下载(比如之前已经创建过基于相同 image 的 instance)。如果没有,就从 Glance 下载 image 到本地。
由此可知,如果计算节点上要运行多个相同 image 的 instance,只会在启动第一个 instance 的时候从 Glance 下载 image,后面的 instance 启动速度就大大加快了。 日志如下:
image(ID为 917d60ef-f663-4e2d-b85b-e)是 qcow2 格式,nova-compute 将其下载,然后通过 qemu-img 转换成 raw 格式。 转换的原因是下一步需要将其作为 instance 的镜像文件的 backing file,而 backing file不能是 qcow2 格式。
image 的存放目录是 /opt/stack/data/nova/instances/_base,这是由 /etc/nova/nova.conf 的下面两个配置选项决定的。
instances_path = /opt/stack/data/nova/instances base_dir_name = _base
下载的 image 文件被命名为 60bbaed2ef7d111dd35f,这是 image id 的 SHA1 哈希值。
为 instance 创建镜像文件
有了 image 之后,instance 的镜像文件直接通过 qemu-img 命令创建,backing file 就是下载的 image。
这里 instance 的镜像文件位于 /opt/stack/data/nova/instances/f1e-4d7a-84a3-e41e6d7618ef/disk,格式为 qcow2,其中 f1e-4d7a-84a3-e41e6d7618ef 就是 instance 的 id。
可以通过 qume-info 查看 disk 文件的属性
这里有两个容易搞混淆的术语,在此特别说明一下:
image,指的是 Glance 上保存的镜像,作为 instance 运行的模板。 计算节点将下载的 image 存放在 /opt/stack/data/nova/instances/_base 目录下。
镜像文件,指的是 instance 启动盘所对应的文件
二者的关系是:image 是镜像文件 的 backing file。image 不会变,而镜像文件会发生变化。比如安装新的软件后,镜像文件会变大。
因为英文中两者都叫 &image&,为避免混淆,我们用 &image& 和 &镜像文件& 作区分。
创建 instance 的 XML 定义文件
创建的 XML 文件会保存到该 instance 目录 /opt/stack/data/nova/instances/f1e-4d7a-84a3-e41e6d7618ef,命名为 libvirt.xml
创建虚拟网络并启动 instance
接下来便是为 instance 创建虚拟网络设备
本环境用的是 linux-bridge 实现的虚拟网络,在 Neutron 章节我们会详细讨论 OpenStack 虚拟网络的不同实现方式。
一切就绪,接下来可以启动 instance 了。
至此,instance 已经成功启动。 OpenStack 图形界面和 KVM CLI 都可以查看到 instance 的运行状态。
在计算节点上,instance 并不是以 OpenStack上 的名字命名,而是用 instance-xxxxx 的格式。
哇,居然坚持看完了!
在下面给自己点个赞吧 :-)
310001SPJJ
8,430 次访问
作为 OpenStack 的基础支持服务,Keystone 做下面这几件事情:
管理用户及其权限
维护 OpenStack Services 的 Endpoint
Authentication(认证)和 Authorization(鉴权)
学习 Keystone,得理解下面这些概念:
User 指代任何使用 OpenStack 的实体,可以是真正的用户,其他系统或者服务。
当 User 请求访问 OpenStack 时,Keystone 会对其进行验证。
Horizon 在 Identity-&Users 管理 User
除了 admin 和 demo,OpenStack 也为 nova、cinder、glance、neutron 服务创建了相应的 User。 admin 也可以管理这些 User。
Credentials
Credentials 是 User 用来证明自己身份的信息,可以是: 1. 用户名/密码 2. Token 3. API Key 4. 其他高级方式
Authentication
Authentication 是 Keystone 验证 User 身份的过程。
User 访问 OpenStack 时向 Keystone 提交用户名和密码形式的 Credentials,Keystone 验证通过后会给 User 签发一个 Token 作为后续访问的 Credential。
Token 是由数字和字母组成的字符串,User 成功 Authentication 后由 Keystone 分配给 User。
Token 用做访问 Service 的 Credential
Service 会通过 Keystone 验证 Token 的有效性
Token 的有效期默认是 24 小时
Project 用于将 OpenStack 的资源(计算、存储和网络)进行分组和隔离。 根据 OpenStack 服务的对象不同,Project 可以是一个客户(公有云,也叫租户)、部门或者项目组(私有云)。
这里请注意:
资源的所有权是属于 Project 的,而不是 User。
在 OpenStack 的界面和文档中,Tenant / Project / Account 这几个术语是通用的,但长期看会倾向使用 Project
每个 User(包括 admin)必须挂在 Project 里才能访问该 Project 的资源。 一个User可以属于多个 Project。
admin 相当于 root 用户,具有最高权限
Horizon 在 Identity-&Projects 中管理 Project
通过 Manage Members 将 User 添加到 Project 中
OpenStack 的 Service 包括 Compute (Nova)、Block Storage (Cinder)、Object Storage (Swift)、Image Service (Glance) 、Networking Service (Neutron) 等。
每个 Service 都会提供若干个 Endpoint,User 通过 Endpoint 访问资源和执行操作。
Endpoint 是一个网络上可访问的地址,通常是一个 URL。 Service 通过 Endpoint 暴露自己的 API。 Keystone 负责管理和维护每个 Service 的 Endpoint。
可以使用下面的命令来查看 Endpoint。
root@devstack-controller:~# source devstack/openrc admin admin
root@devstack-controller:~# openstack catalog list
安全包含两部分:Authentication(认证)和 Authorization(鉴权) Authentication 解决的是&你是谁?&的问题 Authorization 解决的是&你能干什么?&的问题
Keystone 是借助 Role 来实现 Authorization 的:
Keystone定义Role
可以为 User 分配一个或多个 Role Horizon 的菜单为 Identity-&Project-&Manage Members
Service 决定每个 Role 能做什么事情 Service 通过各自的 policy.json 文件对 Role 进行访问控制。 下面是 Nova 服务 /etc/nova/policy.json 中的示例
上面配置的含义是:对于 create、attach_network 和 attach_volume 操作,任何Role的 User 都可以执行; 但只有 admin 这个 Role 的 User 才能执行 forced_host 操作。
OpenStack 默认配置只区分 admin 和非 admin Role。 如果需要对特定的 Role 进行授权,可以修改 policy.json。
下一节我们将通过例子加深对这些概念的理解。
310001SPJJ
8,331 次访问
OpenStack是云操作系统,要学习OpenStack,首先需要掌握一些虚拟化和云计算的相关知识。
虚拟化是云计算的基础。简单的说,虚拟化使得在一台物理的服务器上可以跑多台虚拟机,虚拟机共享物理机的 CPU、内存、IO 硬件资源,但逻辑上虚拟机之间是相互隔离的。
物理机我们一般称为宿主机(Host),宿主机上面的虚拟机称为客户机(Guest)。
那么 Host 是如何将自己的硬件资源虚拟化,并提供给 Guest 使用的呢?
这个主要是通过一个叫做 Hypervisor 的程序实现的。
根据 Hypervisor 的实现方式和所处的位置,虚拟化又分为两种:
1型虚拟化和2型虚拟化
Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型。
物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。Hypervisor 作为 OS 上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型。
理论上讲:
1型虚拟化一般对硬件虚拟化功能进行了特别优化,性能上比2型要高;
2型虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM。
下面重点介绍KVM这种2型虚拟化技术。
在 x86 平台上最热门运用最广泛的虚拟化方案莫过于 KVM 了。OpenStack 对 KVM 支持得也最好,我们的教程也理所当然选择 KVM 作为 实验环境的 Hypervisor。
KVM 全称是 Kernel-Based Virtual Machine。也就是说 KVM 是基于 Linux 内核实现的。
KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存。
那 IO 的虚拟化,比如存储和网络设备由谁实现呢?
这个就交给 Linux 内核和Qemu来实现。
说白了,作为一个 Hypervisor,KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu。
大家在网上看 KVM 相关文章的时候肯定经常会看到 Libvirt 这个东西。
Libvirt 是啥?
简单说就是&KVM 的管理工具。
其实,Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等。
OpenStack 底层也使用 Libvirt,所以很有必要学习一下。
Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
libvirtd是服务程序,接收和处理 API 请求;
API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具,后面我们也会介绍;
virsh 是我们经常要用的 KVM 命令行工具,后面会有使用的示例。
作为 KVM 和 OpenStack 的实施人员,virsh 和 virt-manager 是一定要会用的。
今天5分钟差不多了,下一次我们来玩 KVM
310001SPJJ
8,316 次访问
RUN、CMD 和 ENTRYPOINT 这三个 Dockerfile 指令看上去很类似,很容易混淆。本节将通过实践详细讨论它们的区别。
简单的说:
RUN 执行命令并创建新的镜像层,RUN 经常用于安装软件包。
CMD 设置容器启动后默认执行的命令及其参数,但 CMD 能够被&docker run&后面跟的命令行参数替换。
ENTRYPOINT 配置容器启动时运行的命令。
下面我们详细分析。
Shell 和 Exec 格式
我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式,二者在使用上有细微的区别。
Shell 格式
&instruction& &command&
RUN apt-get install python3 &
CMD echo &Hello world& &
ENTRYPOINT echo &Hello world&&
当指令执行时,shell 格式底层会调用 /bin/sh -c &command&&。
例如下面的 Dockerfile 片段:
ENV name Cloud Man &
ENTRYPOINT echo &Hello, $name&&
执行 docker run &image& 将输出:
Hello, Cloud Man
注意环境变量&name&已经被值&Cloud Man&替换。
下面来看 Exec 格式。
&instruction& [&executable&, &param1&, &param2&, ...]
RUN [&apt-get&, &install&, &python3&] &
CMD [&/bin/echo&, &Hello world&] &
ENTRYPOINT [&/bin/echo&, &Hello world&]
当指令执行时,会直接调用 &command&,不会被 shell 解析。
例如下面的 Dockerfile 片段:
ENV name Cloud Man &
ENTRYPOINT [&/bin/echo&, &Hello, $name&]
运行容器将输出:
Hello, $name
注意环境变量&name&没有被替换。
如果希望使用环境变量,照如下修改
ENV name Cloud Man &
ENTRYPOINT [&/bin/sh&, &-c&, &echo Hello, $name&]
运行容器将输出:
Hello, Cloud Man
CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。
RUN 指令通常用于安装应用和软件包。
RUN 在当前镜像的顶部执行命令,并通过创建新的镜像层。Dockerfile 中常常包含多个 RUN 指令。
RUN 有两种格式:
Shell 格式:RUN
Exec 格式:RUN [&executable&, &param1&, &param2&]
下面是使用 RUN 安装多个包的例子:
RUN apt-get update && apt-get install -y \ &
&mercurial \
&subversion
注意:apt-get update 和 apt-get install 被放在一个 RUN 指令中执行,这样能够保证每次安装的是最新的包。如果 apt-get install 在单独的 RUN 中执行,则会使用 apt-get update 创建的镜像层,而这一层可能是很久以前缓存的。
CMD 指令允许用户指定容器的默认执行的命令。
此命令会在容器启动且 docker run 没有指定其他命令时运行。
如果 docker run 指定了其他命令,CMD 指定的默认命令将被忽略。
如果 Dockerfile 中有多个 CMD 指令,只有最后一个 CMD 有效。
CMD 有三种格式:
Exec 格式:CMD [&executable&,&param1&,&param2&]
这是 CMD 的推荐格式。
CMD [&param1&,&param2&] 为 ENTRYPOINT 提供额外的参数,此时 ENTRYPOINT 必须使用 Exec 格式。
Shell 格式:CMD command param1 param2
Exec 和 Shell 格式前面已经介绍过了。
第二种格式 CMD [&param1&,&param2&] 要与 Exec 格式 的 ENTRYPOINT 指令配合使用,其用途是为 ENTRYPOINT 设置默认的参数。我们将在后面讨论 ENTRYPOINT 时举例说明。
下面看看 CMD 是如何工作的。Dockerfile 片段如下:
CMD echo &Hello world&
运行容器 docker run -it [image] 将输出:
Hello world
但当后面加上一个命令,比如 docker run -it [image] /bin/bash,CMD 会被忽略掉,命令 bash 将被执行:
root@10a32dc7d3d3:/#
ENTRYPOINT
ENTRYPOINT 指令可让容器以应用程序或者服务的形式运行。
ENTRYPOINT 看上去与 CMD 很像,它们都可以指定要执行的命令及其参数。不同的地方在于 ENTRYPOINT 不会被忽略,一定会被执行,即使运行 docker run 时指定了其他命令。
ENTRYPOINT 有两种格式:
Exec 格式:ENTRYPOINT [&executable&, &param1&, &param2&] 这是 ENTRYPOINT 的推荐格式。
Shell 格式:ENTRYPOINT command param1 param2
在为 ENTRYPOINT 选择格式时必须小心,因为这两种格式的效果差别很大。
ENTRYPOINT 的 Exec 格式用于设置要执行的命令及其参数,同时可通过 CMD 提供额外的参数。
ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
比如下面的 Dockerfile 片段:
ENTRYPOINT [&/bin/echo&, &Hello&] &
CMD [&world&]
当容器通过 docker run -it [image] 启动时,输出为:
Hello world
而如果通过 docker run -it [image] CloudMan 启动,则输出为:
Hello CloudMan
Shell 格式
ENTRYPOINT 的 Shell 格式会忽略任何 CMD 或 docker run 提供的参数。
使用 RUN 指令安装应用和软件包,构建镜像。
如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。
如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。
到这里,我们已经具备编写 Dockerfile 的能力了。如果大家还觉得没把握,推荐一个快速掌握 Dockerfile 的方法:去 Docker Hub 上参考那些官方镜像的 Dockerfile。
好了,我们已经学习完如何创建自己的 image,下一节讨论如何分发 image。
310001SPJJ
8,099 次访问
Compute Service Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。
OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。
在上图中可以看到,Nova 处于 Openstak 架构的中心,其他组件都为 Nova 提供支持:
Glance 为 VM 提供 image
Cinder 和 Swift 分别为 VM 提供块存储和对象存储
Neutron 为 VM 提供网络连接
Nova 架构如下
Nova 的架构比较复杂,包含很多组件。
这些组件以子服务(后台 deamon 进程)的形式运行,可以分为以下几类:
接收和响应客户的 API 调用。 除了提供 OpenStack 自己的API,nova-api 还支持 Amazon EC2 API。 也就是说,如果客户以前使用 Amazon EC2,并且用 EC2 的 API 开发了些工具来管理虚机,那么如果现在要换成 OpenStack,这些工具可以无缝迁移到 OpenStack,因为 nova-api 兼容 EC2 API,无需做任何修改。
Compute Core
nova-scheduler
虚机调度服务,负责决定在哪个计算节点上运行虚机
nova-compute
管理虚机的核心服务,通过调用 Hypervisor API 实现虚机生命周期管理
Hypervisor
计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。 不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等
nova-conductor
nova-compute 经常需要更新数据库,比如更新虚机的状态。 出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor,这个我们在后面会详细讨论。
Console Interface
nova-console
用户可以通过多种方式访问虚机的控制台: nova-novncproxy,基于 Web 浏览器的 VNC 访问 nova-spicehtml5proxy,基于 HTML5 浏览器的 SPICE 访问 nova-xvpnvncproxy,基于 Java 客户端的 VNC 访问
nova-consoleauth
负责对访问虚机控制台请亲提供 Token 认证
提供 x509 证书支持
Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。 数据库安装在控制节点上。 Nova 使用命名为 &nova& 的数据库。
Message Queue
在前面我们了解到 Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。 为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。 所以在架构图上我们看到了子服务之间没有直接的连线,它们都通过 Message Queue 联系。
OpenStack 默认是用 RabbitMQ 作为 Message Queue。 MQ 是 OpenStack 的核心基础组件,我们后面也会详细介绍。
下一节我们讨论这些 Nova 组件如何协调工作。
310001SPJJ
7,786 次访问
本节重点介绍 nova-scheduler 的调度机制和实现方法:即解决如何选择在哪个计算节点上启动 instance 的问题。
创建 Instance 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。
OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了。
可用的 flavor 在 System-&Flavors 中管理。
Flavor 主要定义了 VCPU,RAM,DISK 和 Metadata 这四类。 nova-scheduler 会按照 flavor 去选择合适的计算节点。 VCPU,RAM,DISK 比较好理解,而 Metatdata 比较有意思,我们后面会具体讨论。
下面介绍 nova-scheduler 是如何实现调度的。
在 /etc/nova/nova.conf 中,nova 通过 scheduler_driver,scheduler_available_filters 和 scheduler_default_filters 这三个参数来配置 nova-scheduler。
Filter scheduler
Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:
通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)
通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。
scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler
Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。 这又一次体现了OpenStack的开放性。
Scheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。
上图是调度过程的一个示例:
最开始有 6 个计算节点 Host1-Host6
通过多个 filter 层层过滤,Host2 和 Host4 没有通过,被刷掉了
Host1,Host3,Host5,Host6 计算权重,结果 Host5 得分最高,最终入选
当 Filter scheduler 需要执行调度操作时,会让 filter 对计算节点进行判断,filter 返回 True 或 False。
Nova.conf 中的 scheduler_available_filters 选项用于配置 scheduler 可用的 filter,默认是所有 nova 自带的 filter 都可以用于滤操作。
scheduler_available_filters = nova.scheduler.filters.all_filters
另外还有一个选项 scheduler_default_filters,用于指定 scheduler 真正使用的 filter,默认值如下
scheduler_default_filters = RetryFilter, AvailabilityZoneFilter, RamFilter, DiskFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter
Filter scheduler 将按照列表中的顺序依次过滤。 下面依次介绍每个 filter。
RetryFilter
RetryFilter 的作用是刷掉之前已经调度过的节点。
举个例子方便大家理解: 假设 A,B,C 三个节点都通过了过滤,最终 A 因为权重值最大被选中执行操作。 但由于某个原因,操作在 A 上失败了。 默认情况下,nova-scheduler 会重新执行过滤操作(重复次数由 scheduler_max_attempts 选项指定,默认是 3)。 那么这时候 RetryFilter 就会将 A 直接刷掉,避免操作再次失败。 RetryFilter 通常作为第一个 filter。
AvailabilityZoneFilter
为提高容灾性和提供隔离服务,可以将计算节点划分到不同的Availability Zone中。
例如把一个机架上的机器划分在一个 Availability Zone 中。 OpenStack 默认有一个命名为 &Nova& 的 Availability Zone,所有的计算节点初始都是放在 &Nova& 中。 用户可以根据需要创建自己的 Availability Zone。
创建 Instance 时,需要指定将 Instance 部署到在哪个 Availability Zone中。
nova-scheduler 在做 filtering 时,会使用 AvailabilityZoneFilter 将不属于指定 Availability Zone 的计算节点过滤掉。
RamFilter 将不能满足 flavor 内存需求的计算节点过滤掉。
对于内存有一点需要注意: 为了提高系统的资源使用率,OpenStack 在计算节点可用内存时允许 overcommit,也就是可以超过实际内存大小。 超过的程度是通过 nova.conf 中 ram_allocation_ratio 这个参数来控制的,默认值为 1.5
ram_allocation_ratio = 1.5
其含义是:如果计算节点的内存有 10GB,OpenStack 则会认为它有 15GB(10*1.5)的内存。
DiskFilter
DiskFilter 将不能满足 flavor 磁盘需求的计算节点过滤掉。
Disk 同样允许 overcommit,通过 nova.conf 中 disk_allocation_ratio 控制,默认值为 1
disk_allocation_ratio = 1.0
CoreFilter
CoreFilter 将不能满足 flavor vCPU 需求的计算节点过滤掉。
vCPU 同样允许 overcommit,通过 nova.conf 中 cpu_allocation_ratio 控制,默认值为 16
cpu_allocation_ratio = 16.0
这意味着一个 8 vCPU 的计算节点,nova-scheduler 在调度时认为它有 128 个 vCPU。 需要提醒的是: nova-scheduler 默认使用的 filter 并没有包含 CoreFilter。 如果要用,可以将 CoreFilter 添加到 nova.conf 的 scheduler_default_filters 配置选项中。
ComputeFilter
ComputeFilter 保证只有 nova-compute 服务正常工作的计算节点才能够被 nova-scheduler调度。
ComputeFilter 显然是必选的 filter。
ComputeCapabilitiesFilter
ComputeCapabilitiesFilter 根据计算节点的特性来筛选。
这个比较高级,我们举例说明。 例如我们的节点有 x86_64 和 ARM 架构的,如果想将 Instance 指定部署到 x86_64 架构的节点上,就可以利用到 ComputeCapabilitiesFilter。
还记得 flavor 中有个 Metadata 吗,Compute 的 Capabilitie s就在 Metadata中 指定。
&Compute Host Capabilities& 列出了所有可设置 Capabilities。
点击 &Architecture& 后面的 &+&,就可以在右边的列表中指定具体的架构。
配置好后,ComputeCapabilitiesFilter 在调度时只会筛选出 x86_64 的节点。 如果没有设置 Metadata,ComputeCapabilitiesFilter 不会起作用,所有节点都会通过筛选。
ImagePropertiesFilter
ImagePropertiesFilter 根据所选 image 的属性来筛选匹配的计算节点。 跟 flavor 类似,image 也有 metadata,用于指定其属性。
例如希望某个 image 只能运行在 kvm 的 hypervisor 上,可以通过 &Hypervisor Type& 属性来指定。
点击 &+&,然后在右边的列表中选择 &kvm&。
配置好后,ImagePropertiesFilter 在调度时只会筛选出 kvm 的节点。 如果没有设置 Image 的Metadata,ImagePropertiesFilter 不会起作用,所有节点都会通过筛选。
ServerGroupAntiAffinityFilter
ServerGroupAntiAffinityFilter 可以尽量将 Instance 分散部署到不同的节点上。
例如有 inst1,inst2 和 inst3 三个 instance,计算节点有 A,B 和 C。 为保证分散部署,进行如下操作:
创建一个 anti-affinity 策略的 server group &group-1&
nova server-group-create --policy anti-affinity group-1
请注意,这里的 server group 其实是 instance group,并不是计算节点的 group。
依次创建 Instance,将inst1, inst2和inst3放到group-1中
nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst1 nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst2 nova boot --image IMAGE_ID --flavor 1 --hint group=group-1 inst3
因为 group-1 的策略是 AntiAffinity,调度时 ServerGroupAntiAffinityFilter 会将 inst1, inst2 和 inst3 部署到不同计算节点 A, B 和 C。
目前只能在 CLI 中指定 server group 来创建 instance。
创建 instance 时如果没有指定 server group,ServerGroupAntiAffinityFilter 会直接通过,不做任何过滤。
ServerGroupAffinityFilter
与 ServerGroupAntiAffinityFilter 的作用相反,ServerGroupAffinityFilter 会尽量将 instance 部署到同一个计算节点上。 方法类似
创建一个 affinity 策略的 server group &group-2&
nova server-group-create --policy affinity group-2
依次创建 instance,将 inst1, inst2 和 inst3 放到 group-2 中
nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst1 nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst2 nova boot --image IMAGE_ID --flavor 1 --hint group=group-2 inst3
因为 group-2 的策略是 Affinity,调度时 ServerGroupAffinityFilter 会将 inst1, inst2 和 inst3 部署到同一个计算节点。
创建 instance 时如果没有指定 server group,ServerGroupAffinityFilter 会直接通过,不做任何过滤。
经过前面一堆 filter 的过滤,nova-scheduler 选出了能够部署 instance 的计算节点。 如果有多个计算节点通过了过滤,那么最终选择哪个节点呢?
Scheduler 会对每个计算节点打分,得分最高的获胜。 打分的过程就是 weight,翻译过来就是计算权重值,那么 scheduler 是根据什么来计算权重值呢?
目前 nova-scheduler 的默认实现是根据计算节点空闲的内存量计算权重值: 空闲内存越多,权重越大,instance 将被部署到当前空闲内存最多的计算节点上。
是时候完整的回顾一下 nova-scheduler 的工作过程了。 整个过程都被记录到 nova-scheduler 的日志中。 比如当我们部署一个 instance 时
打开 nova-scheduler 的日志 /opt/stack/logs/n-sch.log(非 devstack 安装其日志在 /var/log/nova/scheduler.log)
日志显示初始有两个 host(在我们的实验环境中就是 devstack-controller 和 devstack-compute1),依次经过 9 个 filter 的过滤(RetryFilter, AvailabilityZoneFilter, RamFilter, DiskFilter, ComputeFilter, ComputeCapabilitiesFilter, ImagePropertiesFilter, ServerGroupAntiAffinityFilter, ServerGroupAffinityFilter),两个计算节点都通过了。
那么接下来就该 weight 了:
可以看到因为 devstack-controller 的空闲内存比 devstack-compute1 多(7466 & 3434),权重值更大(1.0 & 0.4599),最终选择 devstack-controller。
注:要显示 DEBUG 日志,需要在 /etc/nova/nova.conf 中打开 debug 选项
[DEFAULT] debug = True
nova-scheduler 就是这些内容了,稍微有些复杂哈(因为灵活嘛),大家这两天可以好好消化一下。
下节我们讨论 nova-compute。
310001SPJJ
7,518 次访问
本节演示如何使用 virt-manager 启动 KVM 虚机。
首先通过命令 virt-manager 启动图形界面
# virt-manager
点上面的图标创建虚机
给虚机命名为 kvm1,这里选择从哪里启动虚机。如果是安装新的 OS,可以选择第一项。如果已经有安装好的镜像文件,
选最后一项(如上图)
接下来需要告诉 virt-manager 镜像的位置。
点击 &Browser&
在我的系统中存放了一个 cirros-0.3.3-x86_64-disk.img 镜像文件 。cirros 是一个很小的 linux 镜像,非常适合测试用。大家可以到
下载,然后放到 /var/lib/libvirt/images/ 目录下,这是 KVM 默认查找镜像文件的地方。
为虚拟机分配 CPU 和内存
点击 &Forward&, 再确认一下信息,就可以启动虚机了。
virt-manager 会打开虚机 kvm1 的控制台窗口,可以看到启动情况
virt-manager 可以对虚机进行各种管理操作,界面直观友好,很容易上手。 同时我们也可以用命令 virsh 管理虚机,比如查看宿主机上的虚机&
root@ubuntu:~# virsh list
--------------------------------
&至此,第一个虚机已经跑起来了,采用的都是默认设置,后面我们会逐步讨论有关虚机更细节的内容,比如存储和网卡的设置。
310001SPJJ
7,504 次访问
前面 CloudMan 通过日志详细分析了 nova 的 launch, shut off 和 start 操作。
不知道大家现在是否已经掌握了日志分析的技能?
今天咱们就来检验一下。
本节讨论的是 nova 相对较简单的操作: reboot 和 lock/unlock。
我首先会讲解这几个操作的理论知识,然后将日志分析留给大家来完成。
大家在分析过程中如有任何疑问,可以给我留言。
Soft/Hard Reboot
soft reboot 与 hard reboot 的区别在于: 1. soft reboot 只是重启操作系统,整个过程中,instance 依然处于运行状态。相当于在 linux 中执行 reboot 命令 2. hard reboot 是重启 instance,相当于关机之后再开机
soft/hard reboot 的日志分析留给大家作为练习。
1. soft/hard reboot 在 nova-api 的日志里找不到,这是因为 /opt/stack/nova/nova/compute/api.py 的 reboot 方法中没有输出 log。 可以通过关键字 &nova.api.openstack.wsgi& 或者 &reboot& 搜索。
2. 在 nova-compute 的日志中可以看到 &soft reboot& 和 &hard reboot& 二者有明显的区别。
Lock/Unlock
为了避免误操作,比如意外重启或删除 instance,可以将 instance &加锁。 对被加锁(Lock)的 instance 执行重启等改变状态的操作会提示操作不允许。 执行解锁(Unlock)操作后恢复正常。
Lock/Unlock 操作都是在 nova-api 中进行的。 操作成功后 nova-api 会更新 instance 加锁的状态。 执行其他操作时,nova-api 根据加锁状态来判断是否允许。
Lock/Unlock 不需要 nova-compute 的参与。 Lock/Unlock 的日志比较简单,留给大家练习。
1. admin 角色的用户不受 lock 的影响,及无论加锁与否都可以正常执行操作。
2. 根据默认 policy 的配置,任何用户都可以 unlock。也就是说如果发现 instance 被加锁了,可以通过 unlock 解锁,然后在执行操作。
310001SPJJ
7,443 次访问
Migrate 操作会先将 instance 停掉,也就是所谓的&冷迁移&。而 Live Migrate 是&热迁移&,也叫&在线迁移&,instance不会停机。
Live Migrate 分两种:
源和目标节点没有共享存储,instance 在迁移的时候需要将其镜像文件从源节点传到目标节点,这叫做 Block Migration(块迁移)
源和目标节点共享存储,instance 的镜像文件不需要迁移,只需要将 instance 的状态迁移到目标节点。
源和目标节点需要满足一些条件才能支持 Live Migration:
源和目标节点的 CPU 类型要一致。
源和目标节点的 Libvirt 版本要一致。
源和目标节点能相互识别对方的主机名称,比如可以在 /etc/hosts 中加入对方的条目。
在源和目标节点的 /etc/nova/nova.conf 中指明在线迁移时使用 TCP 协议。
Instance 使用 config driver 保存其 metadata。在 Block Migration 过程中,该 config driver 也需要迁移到目标节点。由于目前 libvirt 只支持迁移 vfat 类型的 config driver,所以必须在 /etc/nova/nova.conf 中明确指明 launch instance 时创建 vfat 类型的 config driver。
源和目标节点的 Libvirt TCP 远程监听服务得打开,需要在下面两个配置文件中做一点配置。
/etc/default/libvirt-bin
start_libvirtd=&yes& libvirtd_opts=&-d -l&
/etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
unix_sock_group = &libvirtd&
unix_sock_ro_perms = &0777&
unix_sock_rw_perms = &0770&
auth_unix_ro = &none&
auth_unix_rw = &none&
auth_tcp = &none&
然后重启 Libvirtd 服务
service libvirt-bin restart
非共享存储 Block Migration
我们先讨论非共享存储的 Block Migration。流程图如下:
向 nova-api 发送请求
nova-api 发送消息
nova-compute 执行操作
下面我们详细讨论每一个步骤。
向nova-api发送请求
客户(可以是 OpenStack 最终用户,也可以是其他程序)向API(nova-api)发送请求:&帮我将这个 Instance 从节点 A Live Migrate 到节点 B&
这里源节点是 devstack-compute1,目标节点是 devstack-controller,因为是非共享存储,记得将&Block Migration&勾选上。
这里还有一个&Disk Over Commit&选项,如果勾选了此选项,nova 在检查目标节点的磁盘空间是否足够时,是以 instance 磁盘镜像文件定义的最大容量为准;否则,以磁盘镜像文件当前的实际大小为准。
查看日志 /opt/stack/logs/n-api.log
nova-api 发送消息
nova-api 向 Messaging(RabbitMQ)发送了一条消息:&Live Migrate 这个 Instance& 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 live_migrate。
nova-compute 执行操作
源和目标节点执行 Live Migrate 的操作过程如下:
目标节点执行迁移前的准备工作,首先将 instance 的数据迁移过来,主要包括镜像文件、虚拟网络等资源,日志在 devstack-controller:/opt/stack/logs/n-cpu.log
源节点启动迁移操作,暂停 instance
在目标节点上 Resume instance
在源节点上执行迁移的后处理工作,删除 instance
在目标节点上执行迁移的后处理工作,创建 XML,在 Hypervisor 中定义 instance,使之下次能够正常启动。
Instance 在 Live Migrate 的整个过程中不会停机,我们通过 Ping 操作来观察
可见在迁移过程中,Ping 进程没有中断,只是有一个 ping 包的延迟增加了。
下面我们再来看源和目标节点共享存储下的 Live Migrate。
共享存储 Live Migration
有多种方式可以实现共享存储,比如可以将 instance 的镜像文件放在 NFS 服务器上,或者使用 NAS 服务器,或者分布式文件系统。
作为学习和实验,这里我们采用 NFS 方案。其他共享存储方案对于 Live Migration 本质上是一样的,只是在性能和高可用性上更好。
搭建 NFS 环境
将 devstack-controller 作为 NFS 服务器,共享其目录 /opt/stack/data/nova/instances。 devstack-compute1 作为 NFS 客户端将此目录 mount 到本机,如下所示:
这样,OpenStack 的 instance 在 devstack-controller 和 devstack-compute1 上就实现共享存储了。
共享存储的迁移过程与 Block Migrate 基本上一样,只是几个环节有点区别:
向 nova-api 提交请求的时候,不能勾选&Block Migrate&
因为源和目标节点都能直接访问 instance 的镜像,所以目标节点在准备阶段不需要传输镜像文件,源节点在迁移后处理阶段也无需删除 instance 的目录。
只有 instance 的状态需要从源节点传输到的目标节点,整个迁移速递比 Block Migration 快很多。
具体的日志分析留个大家练习。
以上是 Live Migrate 操作的详细分析,下一节我们讨论 Evacuate。
310001SPJJ
7,342 次访问
本节我们通过日志详细讨论 instance 的 snapshot 操作。
有时候操作系统损坏得很严重,通过 Rescue 操作无法修复,那么我们就得考虑通过备份恢复了。当然前提是我们之前对instance做过备份。
Nova 备份的操作叫 Snapshot,其工作原理是对 instance 的镜像文件(系统盘)进行全量备份,生成一个类型为 snapshot 的 image,然后将其保存到 Glance 上。
从备份恢复的操作叫 Rebuild,将在下一节重点讨论。
下面是 snapshot instance 的流程图
向 nova-api 发送请求
nova-api 发送消息
nova-compute 执行操作
下面我们详细讨论每一个步骤。
向nova-api发送请求
客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:&对这个 Instance 做个快照&
查看日志 /opt/stack/logs/n-api.log
nova-api 发送消息
nova-api 向 Messaging(RabbitMQ)发送了一条消息:&对这个 Instance 做快照& 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 snapshot。
nova-compute 执行操作
查看日志 /opt/stack/logs/n-cpu.log
暂停 instance
对 instance 的镜像文件做快照
恢复 instance
将快照上传到 Glance
Snapshot 成功保存在 Glance 中
instance 备份成功,下节我们讨论如何通过 snapshot 恢复。
310001SPJJ
7,290 次访问
上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份。
如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuild。
Rebuild 会用 snapshot 替换 instance 当前的镜像文件,同时保持 instance 的其他诸如网络,资源分配属性不变。
下面是 rebuild instance 的流程图
向 nova-api 发送请求
nova-api 发送消息
nova-compute 执行操作
下面我们详细讨论每一个步骤。
向 nova-api 发送请求
客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:&Rebuild 这个 Instance&
选择用于恢复的 image
查看日志/opt/stack/logs/n-api.log
nova-api 发送消息
nova-api 向 Messaging(RabbitMQ)发送了一条消息:&Rebuild 这个 Instance& 源代码在 /opt/stack/nova/nova/compute/api.py,方法是 rebuild。
nova-compute 执行操作
查看日志 /opt/stack/logs/n-cpu.log
关闭 instance
下载新的 image,并准备 instance 的镜像文件
启动 instance
Rebuild 后,GUI 显示 instance 已经使用新的 image
以上就是 Rebuild 操作的分析,下一节我们讨论 Shelve 操作。
310001SPJJ
7,111 次访问
instance 从创建到删除的整个生命周期都是由 Nova 管理的。 后面各小节我们以 instance 生命周期中的不同操作场景为例,详细分析 Nova 不同组件如何协调工作,并通过日志分析加深大家对 Nova 的理解。
在研究 Nova 各个操作之前,我们先来学习一个重要的内容:OpenStack 日志。
OpenStack 的日志记录了非常详细的细节信息,是我们学习和 troubleshoting 的利器。
日志的格式
OpenStack 的日志格式都是统一的,如下
&时间戳&&日志等级&&代码模块&&Request ID&&日志内容&&源代码位置&
简单说明一下
时间戳 日志记录的时间,包括 年 月 日 时 分 秒 毫秒
日志等级 有INFO WARNING ERROR DEBUG等
代码模块 当前运行的模块Request ID 日志会记录连续不同的操作,为了便于区分和增加可读性,每个操作都被分配唯一的Request ID,便于查找
日志内容 这是日志的主体,记录当前正在执行的操作和结果等重要信息
源代码位置 日志代码的位置,包括方法名称,源代码文件的目录位置和行号。这一项不是所有日志都有
下面举例说明
20:46:49.566 DEBUG nova.virt.libvirt.config [req-5c973fff-e9ba-4317-bfd9-7 None None] Generated XML ('&cpu&\n &&arch&x86_64&/arch&\n &&model&Westmere&/model&\n &&vendor&Intel&/vendor&\n &&topology sockets=&2& cores=&3& threads=&1&/&\n &&feature name=&avx&/&\n &&feature name=&ds&/&\n &&feature name=&ht&/&\n &&feature name=&hypervisor&/&\n &&feature name=&osxsave&/&\n &&feature name=&pclmuldq&/&\n &&feature name=&rdtscp&/&\n &&feature name=&ss&/&\n &&feature name=&vme&/&\n &&feature name=&xsave&/&\n&/cpu&\n',)
to_xml /opt/stack/nova/nova/virt/libvirt/config.py:82
这条日志我们可以得知:
代码模块是 nova.virt.libvirt.config,由此可知应该是 Hypervisor Libvirt 相关的操作
日志内容是生成 XML
如果要跟踪源代码,可以到 /opt/stack/nova/nova/virt/libvirt/config.py 的 82 行,方法是 to_xml
又例如下面这条日志:
20:46:49.671 ERROR nova.compute.manager [req-5c973fff-e9ba-4317-bfd9-7 None None] No compute node record for host devstack-controller
这条日志我们可以得知:
这是一个 ERROR 日志
具体内容是 &No compute node record for host devstack-controller&
该日志没有指明源代码位置
日志的位置
我们实验环境使用的是 devstack,日志都统一放在 /opt/stack/logs 目录下,每个服务有自己的日志文件,从命名上很容易区分。
比如 nova-* 各个子服务的日志都以 &n-& 开头: n-api.log 是 nova-api 的日志 n-cpu.log 是 nova-compute 的日志。
Glance 的日志文件都是 &g-& 开头: g-api.log 是 glance-api 的日志 g-reg.log 是 glance-registry 的日志。
Cinder、Neutron 的日志分别以 &c-& 和 &q-& 开头。
对于非 devstack 安装的 OpenStack,日志一般放在 /var/log/xxx/ 目录下。 比如 Nova 放在 /var/log/nova/ 下,Glance 放在/var/log/glance下&&
各个子服务的日志文件也是单独保存,命名也很规范,容易区分。 比如 nova-api 的日志一般就命名为 /var/log/nova/api.log,其他日志类似。
关于日志的几点说明
学习 OpenStack 需要看日志吗?这个问题的答案取决于你是谁。 如果你只是 OpenStack 的最终用户,那么日志对你不重要。你只需要在 GUI上 操作,如果出问题直接找管理员就可以了。 但如果你是 OpenStack 的运维和管理人员,日志对你就非常重要了。因为 OpenStack 操作如果出错,GUI 上给出的错误信息是非常笼统和简要的,日志则提供了大量的线索,特别是当 debug 选项打开之后。 如果你正处于 OpenStack 的学习阶段,正如我们现在的状态,那么也强烈建议你多看日志。日志能够帮助你更加深入理解 OpenStack 的运行机制。
日志能够帮助我们深入学习 OpenStack 和排查问题。但要想高效的使用日志还得有个前提: 必须先掌握 OpenStack 的运行机制,然后针对性的查看日志。 就拿 Instance Launch 操作来说,如果之前不了解 nova-* 各子服务在操作中的协作关系,如果没有理解流程图,面对如此多和分散的日志文件,我们也很难下手不是。
对于 OpenStack 的运维和管理员来说,在大部分情况下,我们都不需要看源代码。 因为 OpenStack 的日志记录得很详细了,足以帮助我们分析和定位问题。 但还是有一些细节日志没有记录,必要时可以通过查看源代码理解得更清楚。 即便如此,日志也会为我们提供源代码查看的线索,不需要我们大海捞针。 这一点我们会在后面的操作分析中看到。
310001SPJJ
7,072 次访问
KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的。
Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种类型,后面会详细讨论。Volume 是在 Storage Pool 中划分出的一块空间,宿主机将 Volume 分配给虚拟机,Volume 在虚拟机中看到的就是一块硬盘。
下面我们学习不同类型的 Storage Pool
目录类型的 Storage Pool
文件目录是最常用的 Storage Pool 类型。
KVM 将宿主机目录 /var/lib/libvirt/images/ 作为默认的 Storage Pool。
那么 Volume 是什么呢?
答案就是该目录下面的文件了,一个文件就是一个 Volume。
大家是否还记得我们之前创建第一个虚机 kvm1 的时候,就是将镜像文件 cirros-0.3.3-x8664-disk.img 放到了这个目录下。文件 cirros-0.3.3-x8664-disk.img 也就是Volume,对于 kvm1 来说,就是它的启动磁盘了。
那 KVM 是怎么知道要把 /var/lib/libvirt/images 这个目录当做默认 Storage Pool 的呢? 实际上 KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个 Pool 一个 xml 文件,默认有一个 default.xml,其内容如下:
注意:Storage Pool 的类型是 &dir&,目录的路径就是 /var/lib/libvirt/images
下面我们为虚机 kvm1 添加一个新的磁盘,看看有什么变化。 在 virt-manager 中打开 kvm1 的配置页面,右键添加新硬件
在默认 Pool 中创建一个 8G 的卷。
点击 &Finish&,可以看到新磁盘的信息。
在 /var/lib/libvirt/images/ 下多了一个 8G 的文件 kvm1.img
root@ubuntu:~# ls -l /var/lib/libvirt/images/ & & & &
total 14044
-rw-r--r-- 1 root root &
Sep &4 11:24 cirros-0.3.3-x86_64-disk.img
-rw------- 1 root root
Sep &4 21:39 kvm1.img
使用文件做 Volume 有很多优点:存储方便、移植性好、可复制、可远程访问。 前面几个优点都很好理解,这里对&可远程访问&多解释一下。
远程访问的意思是镜像文件不一定都放置到宿主机本地文件系统中,也可以存储在通过网络连接的远程文件系统,比如 NFS,或者是分布式文件系统中,比如 GlusterFS。
这样镜像文件就可以在多个宿主机之间共享,便于虚机在不同宿主机之间做 Live Migration;如果是分布式文件系统,多副本的特性还可以保证镜像文件的高可用。
KVM 支持多种 Volume 文件格式,在添加 Volume 时可以选择
raw 是默认格式,即原始磁盘镜像格式,移植性好,性能好,但大小固定,不能节省磁盘空间。
qcow2 是推荐使用的格式,cow 表示 copy on write,能够节省磁盘空间,支持 AES 加密,支持 zlib 压缩,支持多快照,功能很多。
vmdk 是 VMWare 的虚拟磁盘格式,也就是说 VMWare 虚机可以直接在 KVM上 运行。
下一节介绍 LVM 类型的 Storage Pool。
310001SPJJ
6,980 次访问
本节开始,我们将详细讲解 Nova 的各个子服务。
前面架构概览一节知道 Nova 有若干 nova-* 的子服务,下面我们将依次学习最重要的几个。
今天先讨论 nova-api 和 nova-conductor。
Nova-api 是整个 Nova 组件的门户,所有对 Nova 的请求都首先由 nova-api 处理。 Nova-api 向外界暴露若干 HTTP REST API 接口。 在 keystone 中我们可以查询 nova-api 的 endponits。
客户端就可以将请求发送到 endponits 指定的地址,向 nova-api 请求操作。 当然,作为最终用户的我们不会直接发送 Rest AP I请求。 OpenStack CLI,Dashboard 和其他需要跟 Nova 交换的组件会使用这些 API。
Nova-api 对接收到的 HTTP API 请求会做如下处理: 1. 检查客户端传人的参数是否合法有效 2. 调用 Nova 其他子服务的处理客户端 HTTP 请求 3. 格式化 Nova 其他子服务返回的结果并返回给客户端
nova-api 接收哪些请求? 简单的说,只要是跟虚拟机生命周期相关的操作,nova-api 都可以响应。 大部分操作都可以在 Dashboard 上找到。
打开Instance管理界面
点击下拉箭头,列表中就是 nova-api 可执行的操作。
OpenStack 用术语 &Instacne& 来表示虚拟机,后面我们将统一使用这个术语。
nova-conductor
nova-compute 需要获取和更新数据库中 instance 的信息。 但 nova-compute 并不会直接访问数据库,而是通过 nova-conductor 实现数据的访问。
这样做有两个显著好处:
更高的系统安全性
更好的系统伸缩性
更高的安全性
在 OpenStack 的早期版本中,nova-compute 可以直接访问数据库,但这样存在非常大的安全隐患。 因为 nova-compute 这个服务是部署在计算节点上的,为了能够访问控制节点上的数据库,就必须在计算节点的 /etc/nova/nova.conf 中配置访问数据库的连接信息,比如
[database]
connection = mysql+pymysql://root:secret@controller/nova?charset=utf8
试想任意一个计算节点被黑客入侵,都会导致部署在控制节点上的数据库面临极大风险。
为了解决这个问题,从 G 版本开始,Nova 引入了一个新服务 nova-conductor,将 nova-compute 访问数据库的全部操作都放到 nova-conductor 中,而且 nova-conductor 是部署在控制节点上的。 这样就避免了 nova-compute 直接访问数据库,增加了系统的安全性。
更好的伸缩性
nova-conductor 将 nova-compute 与数据库解耦之后还带来另一个好处:提高了 nova 的伸缩性。
nova-compute 与 conductor 是通过消息中间件交互的。 这种松散的架构允许配置多个 nova-conductor 实例。 在一个大规模的 OpenStack 部署环境里,管理员可以通过增加 nova-conductor 的数量来应对日益增长的计算节点对数据库的访问。
下一节我们讨论计算节点调度服务 nova-scheduler.
310001SPJJ
6,947 次访问
本节首先讨论 image 删除操作,然后介绍 OpenStack CLI 的使用方法,最后讨如何 Troubleshoot。
Web UI&删除 image
admin 登录后,Project -& Compute -& Images
在列表中选择格式为 ARI 和 AKI 的 image,点击
点击确认删除
CLI&删除 image
设置环境变量
查询现有image
如何使用 OpenStack CLI
OpenStack 服务都有自己的 CLI。 命令很好记,就是服务的名字,比如 Glance 就是 glance,Nova 就是 nova。
但 Keystone 比较特殊,现在是用 openstack 来代替老版的 keystone 命令。 比如查询用户列表,如果用 keystone user-list
会提示 keystone 已经 deprecated 了。 用 openstack 命令代替
不同}

我要回帖

更多关于 诛仙漫画星漫 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信