使用 Juju 部署 Ceph
注意:本指南已过时。请参阅 charmstore 中有关较新 charm 的随附文档。
过去几周对 Inktank 和 Ceph 来说非常激动人心。社区中出现了许多关于人们如何在实际中使用或部署 Ceph 的示例。从ComodIT 编排示例,到 Synnefo 使用 Ceph 交付统一存储的独特方法,以及许多尚未在博客上发布的其他示例。现在是用 Ceph 做事情的好时机!
我们 Inktank 的人与社区中的任何人一样兴奋,一直在试用许多部署和编排工具。今天,我想与社区分享我自己的一个实验,即使用 Canonical 相对较新的部署工具“Juju”部署 Ceph,该工具正在云部署领域掀起一场风暴。如果您按照本指南操作到底,您应该会得到类似这样的结果
Juju 是一个“下一代服务部署和编排框架”。Juju 的酷炫之处在于,您可以使用几乎任何东西来构建您的 Juju“charms”(配方),从 bash 和您最喜欢的脚本语言,一直到 Chef 和 Puppet。Clint Byrum 和 James Page 开发的 Ceph charms 的大部分知识实际上来自于 Chef cookbooks 和 ceph-deploy 的工作,我们将在后续部分介绍。
出于本次实验的目的,我决定使用亚马逊的 EC2 构建环境,但您也可以使用 OpenStack 部署或结合 Canonical 的 MAAS 产品在您自己的裸机上使用。用于启动引导环境,然后启动所有其他服务器的客户端机器将是 Ubuntu Quantal (12.10) LTS 镜像,但可以是任何 Ubuntu 机器,包括您的笔记本电脑。其余的工作机器也将使用 Quantal 启动。
Juju 在启动新机器方面非常慷慨(通常每个服务一台),所以我选择让我的所有机器都使用“t1.micro”机器大小启动,这样玩这个指南的任何人就不会产生巨额 EC2 费用。现在,进入正题!
入门 ¶
如前所述,通过启动 Ubuntu 12.10 LTS 镜像作为您的客户端来开始该过程,这样您就不必在本地机器上转储一堆软件/配置。这将是您用于启动所有其他内容的客户端。安装好 Ubuntu 基础版后,我们来添加 PPA 并安装 Juju。
> sudo apt-add-repository ppa:juju/pkgs
sudo apt-get update && sudo apt-get install juju
现在我们已经安装了 Juju,我们需要告诉它生成一个配置文件。
> juju bootstrap
这会抛出一个错误,但会为您创建 ~/.juju/environments.yaml 文件以供编辑。由于我们使用的是 EC2,我们需要告诉 Juju 我们的凭据,以便它可以启动新机器并部署新服务。您会注意到我为所有节点机器使用了“quantal”作为 default-series。这很重要,因为它告诉 juju 在哪里以及如何获取每个 charm 的重要部分。
> vi ~/.juju/environments.yaml
default: cephtest environments: cephtest: type: ec2 access-key: YOUR-ACCESS-KEY-GOES-HERE secret-key: YOUR-SECRET-KEY-GOES-HERE control-bucket: (generated by juju) admin-secret: (generated by juju) default-series: quantal juju-origin: ppa ssl-hostname-verification: true
设置引导环境 ¶
现在 Juju 可以直接与 EC2 交互了,我们需要设置一个引导环境,用于保存我们的配置并部署我们的服务。由于我还不能设置全局配置,我需要手动告诉它这台机器需要是一个“t1.micro”实例。
> juju bootstrap --constraints “instance-type=t1.micro”
这将需要几分钟来启动机器并设置环境。完成后,您应该能够通过“juju status”命令查看机器。
> juju status
2012-11-07 13:06:30,645 INFO Connecting to environment... 2012-11-07 13:06:42,313 INFO Connected to environment. machines: 0: agent-state: running dns-name: ec2-23-20-70-201.compute-1.amazonaws.com instance-id: i-d79492ab instance-state: running services: {} 2012-11-07 13:06:42,408 INFO 'status' command finished successfully
现在我们有了一个引导环境,我们可以告诉它所有机器都应默认为“t1.micro”,除非另有说明。您可以修改许多设置,请查看约束文档了解更多详细信息。
> juju set-constraints instance-type=t1.micro
让它变漂亮! ¶
对于喜欢查看正在发生的事情的视觉表示,或者只是想让别人观看正在发生的事情的人来说,Juju 现在有一个您可以使用的 GUI。虽然我不建议使用 GUI 替换命令行来部署下面的 charms,但您当然可以使用它来观看正在发生的事情。对于更成熟的 charms(以及未来),这个 GUI 应该能够管理您的资源。无论如何,当您在 CLI 上进行操作时,拥有漂亮的图片是很棒的。
如果您想安装 GUI,请随时获取我的“juju-gui”charm 版本(在本文撰写时,主 charm 尚未在 quantal 上发布)
> juju deploy cs:~pmcgarry/quantal/juju-gui
完成后(下载和安装所有内容可能需要一段时间),您需要“暴露”它才能访问它
> juju expose juju-gui
这将使您能够通过网络浏览器在“juju status”中显示的 ec2 地址公开访问该机器。默认用户名和密码是“admin”和您 ~/.juju/environments.yaml 文件中的“admin-secret”值。在您完成其余工作时,请随时保持打开状态以观看神奇的发生。
为 Ceph 部署做准备 ¶
我们的 Juju 环境现在已准备好开始启动我们的 Ceph 集群,我们只需要做一些准备工作,以便 Juju 预先获得所有重要细节。首先我们需要获取一些 Ceph 工具
> sudo apt-get install ceph-common && sudo apt-get install uuid
我们需要生成一个 uuid 和 auth key 供 Ceph 使用。
> uuid
将其插入到下面的 $fsid 中
> ceph-authtool /dev/stdout --name=$NAME --gen-key
将其插入到下面的 $monitor-secret 中。
现在我们需要将这些值(和另外一些值)放入我们的 yaml 文件中
> vi ceph.yaml
ceph: source: https://ceph.net.cn/debian-bobtail/ quantal main fsid: d78ae656-7476-11e2-a532-1231390a9d4b monitor-secret: AQDcNRlR6MMZNRAAWw3iAobsJ1MLoFBLJYo4yg==
ceph-osd: source: https://ceph.net.cn/debian-bobtail/ quantal main osd-devices: /dev/xvdf
ceph-radosgw: source: https://ceph.net.cn/debian-bobtail/ quantal main
您会注意到我们还向 Juju 传递了一个“source”项,这告诉 charm 在哪里获取 Ceph 的相应代码,在本例中是来自 Ceph.com 的最新版本(撰写本文时为 Bobtail 0.56.3)。
跟踪日志! ¶
由于设置的大部分内容都是实验性的,因此最好跟踪日志。值得庆幸的是,Juju 让您可以非常轻松地做到这一点。只需打开第二个终端窗口,ssh 到您的客户端机器,然后输入
>juju debug-log
这将把集群中的所有日志聚合到一个输出中,以便在出现问题时轻松浏览。
部署 Ceph Monitor ¶
是时候开始部署我们的 Ceph 集群了!在这种情况下,我们将部署前三台机器,其中包含 ceph-mon(Ceph monitor),因为我们通常建议至少三台以达到仲裁。您需要等到所有三台机器都启动后再继续。
> juju deploy -n 3 --config ceph.yaml cs:~pmcgarry/quantal/ceph
您会注意到,虽然这些 charms 位于 charm store (cs:) 中,但它们位于我自己的用户空间中。这是因为我不得不对这些 charms 进行一些调整,以便它们能够在 ec2 上顺利部署并使用 bobtail 和 quantal。这些 charms 仍然有些新,所以如果您有调整或更改,请随时与我联系,或者在 jujucharms.com 上使用主要的 Ceph charms。将来您将能够使用“ceph”而不是任何人的用户空间进行部署。
示例:> juju deploy -n 3 --config ceph.yaml ceph
这可能需要一段时间,所以请继续检查“juju status”,直到机器运行并且代理设置为“started”。您还应该看到 debug-log 在接近结束时出现一阵活动。
一旦 monitors 启动并运行,您就可以查看部署的样子。如果您愿意,您甚至可以使用 Juju 内置的 ssh 工具 ssh 到其中一台机器。
> juju status
machines: 0: agent-state: running dns-name: ec2-50-16-15-64.compute-1.amazonaws.com instance-id: i-2b45f657 instance-state: running 1: agent-state: running dns-name: ec2-50-19-23-167.compute-1.amazonaws.com instance-id: i-3b368547 instance-state: running 2: agent-state: running dns-name: ec2-107-22-128-107.compute-1.amazonaws.com instance-id: i-1f368563 instance-state: running 3: agent-state: running dns-name: ec2-174-129-51-96.compute-1.amazonaws.com instance-id: i-15368569 instance-state: running services: ceph: charm: cs:~pmcgarry/quantal/ceph-0 relations: mon: - ceph units: ceph/0: agent-state: started machine: 1 public-address: ec2-50-19-23-167.compute-1.amazonaws.com ceph/1: agent-state: started machine: 2 public-address: ec2-107-22-128-107.compute-1.amazonaws.com ceph/2: agent-state: started machine: 3 public-address: ec2-174-129-51-96.compute-1.amazonaws.com
> juju ssh ceph/0 sudo ceph -s
health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds monmap e2: 3 mons at {ceph232118103=10.243.121.227:6789/0,ceph501969115=10.245.210.114:6789/0,ceph5423414494=10.245.89.32:6789/0}, election epoch 6, quorum 0,1,2 ceph232118103,ceph501969115,ceph5423414494 osdmap e1: 0 osds: 0 up, 0 in pgmap v2: 192 pgs: 192 creating; 0 bytes data, 0 KB used, 0 KB / 0 KB avail mdsmap e1: 0/0/1 up
从这个状态我们可以看到有三个 monitors 启动了(“monmap e2: 3 mons at {...}”),但没有 OSDs(“osdmap e1: 0 osds: 0 up, 0 in”)。是时候为这些位启动一些家了!
部署 OSDs ¶
一旦我们的 monitors 看起来健康,就该启动一些 OSDs 了。随意添加任意数量,为了这个实验的目的,我选择启动三个。
> juju deploy -n 3 --config ceph.yaml cs:~pmcgarry/quantal/ceph-osd
这需要一点时间才能完成,所以您可能想在这时去喝杯咖啡。需要记住的一件事是,在我们前面的 ceph.yaml 中,我们将 OSDs 的物理设备定义为 /dev/xvdf。如果您熟悉 EC2,您就会知道该设备尚不存在,因此我们的 OSD 部署命令将启动并配置机器,但我们尚未完全完成。
当您回来时,如果您使用 juju status 查看,您现在应该会看到一堆新机器和一个名为 ceph-osd 的新部分
> juju status
... ceph-osd: charm: cs:~pmcgarry/quantal/ceph-osd-0 relations: {} units: ceph-osd/0: agent-state: started machine: 4 public-address: ec2-174-129-82-169.compute-1.amazonaws.com ceph-osd/1: agent-state: started machine: 5 public-address: ec2-50-16-0-95.compute-1.amazonaws.com ceph-osd/2: agent-state: started machine: 6 public-address: ec2-75-101-175-213.compute-1.amazonaws.com
现在我们需要实际提供它所需的磁盘。通过您的 EC2 控制台(或使用 ec2 命令行工具),您需要启动 3 个 EBS 卷并将每个卷附加到您的 OSD 机器之一。如果您需要帮助,这里有一个相当不错的简明教程:
http://www.webmastersessions.com/how-to-attach-ebs-volume-to-amazon-ec2-instance
附加卷后,我们需要告诉 Juju 返回并使用它们
> juju set ceph-osd "osd-devices=/dev/xvdf"
这将触发重新扫描并使您的 OSDs 正常工作。现在剩下的就是将我们的 monitor 集群与新的 OSDs 池连接起来。
> juju add-relation ceph-osd ceph
我们可以 ssh 到其中一个 Ceph 机器并查看我们的集群
>juju ssh ceph/0
sudo ceph -s
health HEALTH_OK monmap e2: 3 mons at {ceph232118103=10.243.121.227:6789/0,ceph501969115=10.245.210.114:6789/0,ceph5423414494=10.245.89.32:6789/0}, election epoch 6, quorum 0,1,2 ceph232118103,ceph501969115,ceph5423414494 osdmap e10: 3 osds: 3 up, 3 in pgmap v115: 208 pgs: 208 active+clean; 0 bytes data, 3102 MB used, 27584 MB / 30686 MB avail mdsmap e1: 0/0/1 up
恭喜,您现在有了一个 Ceph 集群!随意针对它编写一些应用程序,向您的所有朋友展示,或者只是将其删除并开始为生产部署磨练您的技能。
额外奖励 ¶
由于那个 Juju GUI 屏幕看起来很空,我决定再玩一下我可用的工具。如果您想将这个练习更进一步,我们还可以添加一些 RADOS Gateway 机器,并将它们负载均衡在 haproxy 机器后面。使用 Juju 只需几个额外的命令即可完成此操作
> juju deploy -n 3 --config ceph.yaml cs:~pmcgarry/quantal/ceph-radosgw
juju expose ceph-radosgw
juju deploy cs:~pmcgarry/quantal/haproxy juju expose haproxy
juju add-relation ceph-radosgw haproxy
就是这样!您会注意到我有自己的 haproxy 副本,这仅仅是因为它尚未在 quantal 上正式发布,但我的(未修改的)版本似乎运行良好。
故障排除 ¶
Juju 实际上使故障排除和迭代开发变得非常容易(这是我最喜欢它的一点)。如果您想深入了解 Juju,我强烈建议您阅读他们的文档,这些文档非常好。然而,最有用(除了我前面提到的 debug-log)的工具之一是能够逐步执行 Juju 尝试运行的 hooks。例如,假设我们尝试部署 Ceph,而“juju status”告诉我们存在“install-error”。我们可以使用第二个终端窗口执行以下命令
> juju debug-hooks ceph/0
这使我们能够调试特定机器(在本例中为 ceph/0)上的 hooks 执行。现在在我们的主窗口中,我们可以输入
> juju resolved --retry ceph/0
我们的“debug-hooks”窗口中会出现一个预格式化的设置,底部指示我们正在“install”hook 上。从这里我们可以更改到 hooks 目录并重新运行 install hook
> cd hooks
./install
从这里我们可以在返回并向 Launchpad.net 推送补丁之前解决此机器上的错误。我不会尝试重新创建 jujucharms 网站上的大量文档,但摆弄 Juju 的挫败感远低于我最近接触过的一些其他编排框架。祝您好运,并愉快地使用 charms!
清理 ¶
如果您想关闭商店,您可以只销毁服务(如果您想保留机器运行以部署其他 Juju 测试)
> juju destroy-service ceph
juju destroy-service ceph-osd juju destroy-service ceph-radosgw juju destroy-service haproxy
...或者干脆炸毁整个东西(这将杀死除客户端机器之外的所有东西,包括您的引导环境)
> juju destroy-environment
总结 ¶
您现在是一位经验丰富的 Ceph 部署老手了,您还想要什么呢?如果您有任何问题、评论或任何有助于事业的事情,我们很乐意听取您的意见。目前获得帮助或提供反馈的最佳方式是在我们的 #Ceph irc 频道中,但我们的邮件列表也非常活跃。对于 Juju 特定的反馈,您也可以访问 #Juju irc 频道。如果您在此撰写中发现任何严重的错误或想了解更多有关 Ceph 社区计划的信息,请随时发送电子邮件至 patrick at inktank dot com。
scuttlemonkey 结束

