在 Debian 上安装 Xen 虚拟机集群管理工具 Ganeti
2010年11月10日 | 标签: cloud, ganeti, lvm, xen
随着 Xen 服务器的增多,管理起来会越来越麻烦,如果有一些集成化的辅助工具来统一管理所有的服务器、虚拟机以及集中分配计算资源将会很方便。不过 VPSee 一般都避免使用一些太智能的工具,智能化自动工具有时候太智能,而且很难理解,特别是遇到问题的时候很难排错,因为自动和智能掩盖了工具背后的原理和过程,不知道是工具错了还是自己用错了。市面上有一些结合虚拟技术面向云计算的 Xen/KVM 管理工具,比如 Eucalyptus, OpenNebula, OpenQRM 等用来统一部署和管理虚拟环境,Ganeti 虽然没有前面几个强大,也勉强算一员。Ganeti 最初是由 Google 瑞士苏黎世 office 的一小撮人开发的 Xen/KVM 虚拟机集群管理工具,用来管理内部一些由廉价计算机组成的虚拟服务器集群,廉价计算机集群是 Google 的特色之一。
详细一点说,Ganeti 是一个基于 Xen 或 KVM 虚拟技术的虚拟集群环境管理工具,用来管理一堆运行 Xen 服务器的统一管理界面,这样创建、删除、启动、关闭、重装、查看、移植虚拟机就用不着逐个去某台 Xen 服务器上操作,整合了整个虚拟操作环境,统一管理所有硬盘、操作系统、内存等资源,简化了操作,显然 Ganeti 需要运行在 Xen/KVM 平台上。把 Ganeti, Xen/KVM, LVM, DRBD, RAID10 等几个技术整合起来可以架设一个云计算基础环境,配上一个基于 Web 的控制面板和计费系统就可以当作 “云 VPS” 拿来忽悠。
安装和配置基本系统
首先在每个 node(node1, node2, …)上都安装上最基本的 Debian 系统(Ganeti 官方推荐1个集群里的 node 数目不要超过40个),VPSee 建议在所有 node 上一致采用最小化安装并使用最简单的分区方式:使用 sda1 做 /(10GB),使用 sda2 做 swap(2GB),剩余的空间将会在下面的步骤用到。安装完后开始对每个 node 都做如下类似配置,以 node1 为例,每个 node 上都需要配置 /etc/hosts,Ganeti 就是靠这里的 hostname 来识别 node 的,所以这一步很重要,设置好 hostname 后用 hostname -f 测试一下是否正确:
# vi /etc/hosts 127.0.0.1 localhost.localdomain localhost 172.16.39.10 cluster1.vpsee.com cluster1 172.16.39.11 node1.vpsee.com node1 172.16.39.12 node2.vpsee.com node2 172.16.39.101 inst1.vpsee.com inst1 # hostname -f node1.vpsee.com
如果 node1 上的 hostname 不正确可以修正:
# vi /etc/hostname node1.vpsee.com # /etc/init.d/hostname.sh start
接下来需要给每个 node 配置一个静态 IP,需要注意的是 Ganeti 在默认 bridge 模式下会是用 xen-br0 这个名字,所以我们需要在每个 node 上建立这个 bridge:
# vi /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 172.16.39.11 netmask 255.255.254.0 network 172.16.38.0 broadcast 172.16.39.255 gateway 172.16.38.1 auto xen-br0 iface xen-br0 inet static address 172.16.39.11 netmask 255.255.254.0 network 172.16.38.0 broadcast 172.16.39.255 gateway 172.16.38.1 bridge_ports eth0 bridge_stp off bridge_fd 0
需要注意的是,要对每个想加入 Ganeti 的 node 做相应的配置和调整,比如 IP,hostname 等。在 node2, node3, …, nodeN 上重复上面的步骤。
安装和配置 LVM
这一步骤也需要在每个 node 上重复。先检查分区,在 sda3 上分区,分区格式是 LVM,每个 node 上的这个区将被拿来做 Ganeti 的存储池(storage pool)用来存储 Xen 虚拟机镜像(要注意的是记得在安装 debian 的是后就留出大部分空间来做 sda3):
$ sudo fdisk -l ... Device Boot Start End Blocks Id System /dev/sda1 * 1 1216 9764864 83 Linux /dev/sda2 1216 1703 3906560 82 Linux swap / Solaris $ sudo fdisk /dev/sda n p 3 enter enter t 3 L 8e w $ sudo fdisk -l ... Device Boot Start End Blocks Id System /dev/sda1 * 1 1216 9764864 83 Linux /dev/sda2 1216 1703 3906560 82 Linux swap / Solaris /dev/sda3 1703 60801 474711584+ 8e Linux LVM
安装 LVM 工具包,并用 LVM 工具创建物理卷和 LVM 卷组:
# apt-get install lvm2 $ sudo pvcreate /dev/sda3 Physical volume "/dev/sda3" successfully created $ sudo vgcreate xenvg /dev/sda3 Volume group "xenvg" successfully created
重启系统以便刚创建的 LVM 生效:
# shutdown -r now
安装和配置 Xen 系统
按照 “在 Debian 上安装 Xen” 的步骤安装 Xen:
# apt-get install xen-hypervisor-3.2-1-amd64 \ xen-linux-system-2.6.26-2-xen-amd64 xen-utils-3.2-1 \ xenstore-utils xenwatch xen-shell xen-tools
安装和配置 Ganeti
可以从 Ganeti 官方网站下载源代码编译安装,为了少给自己添麻烦避免一些未知的编译、安装错误,建议新手直接从 debian 源安装:
# apt-get install ganeti
开始使用 Ganeti
在给集群(cluster)增加结点(node)之前需要先初始化这个集群,指定谁是老大(master node)。所以首先用 gnt-cluster 初始化一个 node (node1),这个 node1 将成为 master node,登陆到 node1 上,在 node1 上执行以下操作:
# gnt-cluster init node1 # gnt-node list Node DTotal DFree MTotal MNode MFree Pinst Sinst node1.vpsee.com 454044 454044 3893 3686 128 0 0
有了 master node (node1) 后,这个 master node 就是老大,用来管理其他的 slave nodes (node2, node3, …, nodeN) ,所有操作都要在 master node 上执行。现在我们可以在这个集群中加入 node2:
# gnt-node add node2.vpsee.com # gnt-node list Node DTotal DFree MTotal MNode MFree Pinst Sinst node1.vpsee.com 454044 454044 3893 3686 128 0 0 node2.vpsee.com 37440 37440 2035 1024 969 0 0
可以看到这个集群已经统一管理 node1, node2 以及 node1 和 node2 上的资源,比如内存、硬盘等。现在我们终于可以开始创建虚拟机了,我们只需要在 master node (node1) 上执行安装虚拟机的命令就可以自动部署到集群中:
# gnt-instance add -t plain -n node2.vpsee.com -o debootstrap -s 5g \ --swap-size 256 -m 256 --kernel /boot/vmlinuz-`uname -r` \ --ip 172.16.39.101 inst1.vpsee.com * creating instance disks... adding instance inst1.vpsee.com to cluster config - INFO: Waiting for instance inst1.vpsee.com to sync disks. - INFO: Instance inst1.vpsee.com's disks are in sync. creating os for instance inst1.vpsee.com on node node2.vpsee.com * running the instance OS create scripts... ...
要重装虚拟机的话,执行 reinstall:
# gnt-instance reinstall inst1.vpsee.com This will reinstall the instance inst1.vpsee.com and remove all data. Continue? y/[n]/?: y Running the instance OS create scripts...
查看正在运行的虚拟机(instance):
# gnt-instance list Instance OS Primary_node Status Memory inst1.vpsee.com debootstrap node1.vpsee.com running 256
Ganeti 结合 DRBD 后还可以实现冗余、备份、在不同 node 之间自由迁移等功能,比如一个 node 挂了另一个 node 自动接替,某个 node 负载太高把上面的一个或几个 instance(虚拟机)暂时或永久迁移到另一个 node 降低单一 node 的负载等,非常酷。更多参考资料、帮助文档和命令行参数解释请看 Ganeti 的官方文档。