使用 Juju 部署 Ceph

scuttlemonkey

注意:本指南已过时。请参阅 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 结束