如何在 Ubuntu 14.04 上配置生产就绪的 Mesosphere 集群
介绍
Mesosphere 是一个结合了许多组件的系统,可以在现有操作系统层之上有效地管理服务器集群和高可用性部署。与 CoreOS 等系统不同,Mesosphere 不是专门的操作系统,而是一组软件包。
在本指南中,我们将介绍如何在 Mesosphere 中配置高可用性集群。此配置将为我们设置故障转移,以防万一我们的任何主节点出现故障,以及一个从属服务器池来处理计划的任务。
我们将在本指南中使用 Ubuntu 14.04 服务器。
先决条件和目标
在您完成本指南之前,强烈建议您查看我们对 Mesosphere 的介绍。这是熟悉系统组成部分并帮助您确定每个单元负责的内容的好方法。
在本教程中,我们将使用六台 Ubuntu 服务器。这满足了 Apache Mesos 的建议,即在生产环境中至少拥有三个主节点。它还提供了一个包含三个工作服务器或从属服务器的池,当任务被发送到集群时,它们将被分配工作。
我们将使用的六台服务器将使用 zookeeper
来跟踪主服务器的当前领导者。在此之上构建的 Mesos 层将提供分布式同步和资源处理。它负责管理集群。集群的分布式初始化系统 Marathon 用于调度任务并将工作交给从属服务器。
为了本指南,我们假设我们的机器具有以下配置:
Hostname | Function | IP Address |
---|---|---|
master1 | Mesos master | 192.0.2.1 |
master2 | Mesos master | 192.0.2.2 |
master3 | Mesos master | 192.0.2.3 |
slave1 | Mesos slave | 192.0.2.51 |
slave2 | Mesos slave | 192.0.2.52 |
slave3 | Mesos slave | 192.0.2.53 |
这些机器中的每一个都应该安装 Ubuntu 14.04。您需要完成我们的 Ubuntu 14.04 初始服务器设置指南中列出的基本配置项。
完成上述步骤后,请继续阅读本指南。
在服务器上安装 Mesosphere
启动和运行集群的第一步是安装软件。幸运的是,Mesosphere 项目维护着一个 Ubuntu 存储库,其中包含易于安装的最新软件包。
将 Mesosphere 存储库添加到您的主机
在所有主机(主机和从机)上,完成以下步骤。
首先,将 Mesosphere 存储库添加到您的源列表中。此过程涉及从 Ubuntu 密钥服务器下载 Mesosphere 项目的密钥,然后为我们的 Ubuntu 版本制作正确的 URL。该项目提供了一种方便的方法来做到这一点:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF
DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
CODENAME=$(lsb_release -cs)
echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | sudo tee /etc/apt/sources.list.d/mesosphere.list
安装必要的组件
将 Mesosphere 存储库添加到系统后,必须更新本地包缓存才能访问新组件:
sudo apt-get -y update
接下来,您需要安装必要的软件包。您需要的组件将取决于主机的角色。
对于您的主控主机,您需要 mesosphere
元包。这包括 zookeeper
、mesos
、marathon
和 chronos
应用程序:
sudo apt-get install mesosphere
对于您的从属主机,您只需要 mesos
包,它也将 zookeeper
作为依赖引入:
sudo apt-get install mesos
为 Mesos 设置 Zookeeper 连接信息
我们要做的第一件事是配置我们的 zookeeper
连接信息。这是允许我们所有主机连接到正确主服务器的底层,因此从这里开始是有意义的。
我们的主服务器将是我们 zookeeper
集群的唯一成员,但我们所有的服务器都需要一些配置才能使用该协议进行通信。定义它的文件是 /etc/mesos/zk
。
在所有主机上,完成以下步骤。以root权限打开文件:
sudo nano /etc/mesos/zk
在里面,您会发现连接 URL 默认设置为访问本地实例。它看起来像这样:
zk://localhost:2181/mesos
我们需要修改它以指向我们的三个主服务器。这是通过将 localhost
替换为我们第一个 Mesos 主服务器的 IP 地址来完成的。然后我们可以在端口规范后添加一个逗号并复制格式以将我们的第二个和第三个主控器添加到列表中。
对于我们的指南,我们的主人的 IP 地址为 192.0.2.1
、192.168.2.2
和 192.168.2.3
。使用这些值,我们的文件将如下所示:
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/mesos
该行必须以 zk://
开头并以 /mesos
结尾。在这两者之间,指定了主服务器的 IP 地址和 zookeeper
端口(默认为 2181
)。
完成后保存并关闭文件。
在你的每个主人和奴隶中使用这个相同的条目。这将帮助每个单独的服务器连接到正确的主服务器以与集群通信。
配置主服务器的 Zookeeper 配置
在您的主服务器上,我们需要做一些额外的 zookeeper
配置。
第一步是为每个主服务器定义一个唯一的 ID 号,从 1 到 255。这保存在 /etc/zookeeper/conf/myid
文件中。现在打开它:
sudo nano /etc/zookeeper/conf/myid
删除此文件中的所有信息并将其替换为从 1 到 255 的单个数字。您的每个主服务器都必须有一个唯一的数字。为了简单起见,最简单的方法是从 1 开始,然后逐步提高。我们将使用 1、2 和 3 作为指南。
我们的第一台服务器将在文件中包含以下内容:
1
完成后保存并关闭文件。在每个主服务器上执行此操作。
接下来,我们需要修改我们的 zookeeper
配置文件以将我们的 zookeeper
ID 映射到实际主机。这将确保该服务可以从它使用的 ID 系统中正确解析每个主机。
现在打开 zookeeper
配置文件:
sudo nano /etc/zookeeper/conf/zoo.cfg
在此文件中,您需要将每个 ID 映射到主机。主机规范将包括两个端口,第一个用于与领导者通信,第二个用于在需要新领导者时处理选举。 zookeeper
服务器由 \server 后跟一个点和它们的 ID 号标识。
对于我们的指南,我们将为每个功能使用默认端口,我们的 ID 为 1-3。我们的文件将如下所示:
server.1=192.168.2.1:2888:3888
server.2=192.168.2.2:2888:3888
server.3=192.168.2.3:2888:3888
在每个主服务器的配置文件中添加这些相同的映射。完成后保存并关闭每个文件。
这样,我们的 zookeeper
配置就完成了。我们可以开始关注 Mesos 和 Marathon。
在主服务器上配置 Mesos
接下来,我们将在三台主服务器上配置 Mesos。应在每个主服务器上执行这些步骤。
修改 Quorum 以反映您的集群大小
首先,我们需要调整做出决定所需的法定人数。这将确定集群处于正常运行状态所需的主机数量。
法定人数应设置为必须有超过 50% 的主要成员出席才能做出决定。然而,我们也想建立一些容错能力,这样如果我们所有的主节点都不存在,集群仍然可以运行。
我们有三个主人,所以满足这两个要求的唯一设置是两个法定人数。由于初始配置假定单个服务器设置,因此仲裁当前设置为一个。
打开仲裁配置文件:
sudo nano /etc/mesos-master/quorum
将值更改为“2”:
2
保存并关闭文件。在每个主服务器上重复此操作。
配置主机名和 IP 地址
接下来,我们将为每个主服务器指定主机名和 IP 地址。我们将使用 IP 地址作为主机名,这样我们的实例就不会在正确解析时遇到问题。
对于我们的主服务器,IP 地址需要放在这些文件中:
- /etc/mesos-master/ip
- /etc/mesos-master/主机名
首先,在 /etc/mesos-master/ip
文件中添加每个主节点的独立 IP 地址。请记住为每个服务器更改此设置以匹配适当的值:
echo 192.168.2.1 | sudo tee /etc/mesos-master/ip
现在,我们可以将这个值复制到主机名文件中:
sudo cp /etc/mesos-master/ip /etc/mesos-master/hostname
在每个主服务器上执行此操作。
在主服务器上配置 Marathon
现在 Mesos 已经配置好了,我们可以配置 Marathon,Mesosphere 的集群初始化系统实现。
Marathon 将在我们的每个主控主机上运行,但只有领先的主控服务器才能真正安排作业。其他 Marathon 实例将透明地将请求代理到主服务器。
首先,我们需要为每个服务器的 Marathon 实例再次设置主机名。同样,我们将使用文件中已有的 IP 地址。我们可以将其复制到我们需要的文件位置。
然而,我们需要的 Marathon 配置目录结构并不是自动创建的。我们必须创建目录,然后我们可以将文件复制过来:
sudo mkdir -p /etc/marathon/conf
sudo cp /etc/mesos-master/hostname /etc/marathon/conf
接下来,我们需要定义 Marathon 将连接到的 zookeeper
masters 列表以获取信息和调度。这与我们一直用于 Mesos 的 zookeeper
连接字符串相同,因此我们只需复制该文件即可。我们需要将它放在一个名为 master
的文件中:
sudo cp /etc/mesos/zk /etc/marathon/conf/master
这将允许我们的 Marathon 服务连接到 Mesos 集群。但是,我们还希望 Marathon 将自己的状态信息存储在 zookeeper
中。为此,我们将使用另一个 zookeeper
连接文件作为基础,并且只修改端点。
首先,将文件复制到 Marathon zookeeper 位置:
sudo cp /etc/marathon/conf/master /etc/marathon/conf/zk
接下来,在编辑器中打开文件:
sudo nano /etc/marathon/conf/zk
我们需要在此文件中修改的唯一部分是端点。我们将把它从 /mesos
更改为 /marathon
:
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/marathon
这就是我们需要为 Marathon 配置做的所有事情。
配置服务初始化规则并重启服务
接下来,我们将重新启动主服务器的服务以使用我们一直在配置的设置。
首先,我们需要确保我们的主服务器只运行 Mesos 主进程,而不运行从进程。我们可以停止任何当前正在运行的从属进程(这可能会失败,但没关系,因为这只是为了确保进程停止)。我们还可以通过创建覆盖文件来确保服务器不会在启动时启动从属进程:
sudo stop mesos-slave
echo manual | sudo tee /etc/init/mesos-slave.override
现在,我们需要做的就是重新启动 zookeeper
,这将设置我们的 master 选举。然后我们可以启动我们的 Mesos master 和 Marathon 进程:
sudo restart zookeeper
sudo start mesos-master
sudo start marathon
要了解您刚刚设置的内容,请在您的 Web 浏览器中访问您的主服务器之一的端口 5050
:
http://192.168.2.1:5050
您应该会看到 Mesos 主界面。 You may be told you are being redirected to the active master depending on whether you connected to the elected leader or not.无论哪种方式,屏幕看起来都类似于:

这是当前集群的视图。没什么可看的,因为没有可用的从节点,也没有启动任务。
我们还配置了 Mesosphere 的长期运行任务控制器 Marathon。这将在您的任何 master 上的 8080
端口可用:

一旦我们设置了我们的奴隶,我们将简要介绍如何使用这些接口。
配置从属服务器
现在我们已经配置了主服务器,我们可以开始配置从服务器了。
我们已经使用主服务器的 zookeeper
连接信息配置了从服务器。从站本身不运行自己的 zookeeper
实例。
我们可以停止当前在我们的从属节点上运行的任何 zookeeper
进程并创建一个覆盖文件,这样它就不会在服务器重新启动时自动启动:
sudo stop zookeeper
echo manual | sudo tee /etc/init/zookeeper.override
接下来,我们要创建另一个覆盖文件以确保 Mesos 主进程不会在我们的从属服务器上启动。我们还将确保它当前已停止(如果进程已经停止,此命令可能会失败。这不是问题):
echo manual | sudo tee /etc/init/mesos-master.override
sudo stop mesos-master
接下来,我们需要设置 IP 地址和主机名,就像我们对主服务器所做的那样。这涉及将每个节点的 IP 地址放入一个文件中,这次是在 /etc/mesos-slave
目录下。我们也将使用它作为主机名,以便通过 Web 界面轻松访问服务:
echo 192.168.2.51 | sudo tee /etc/mesos-slave/ip
sudo cp /etc/mesos-slave/ip /etc/mesos-slave/hostname
同样,在第一个命令中使用每个从属服务器的单独 IP 地址。这将确保它被绑定到正确的接口。
现在,我们已经准备好启动 Mesos 从节点的所有部分。我们只需要开启服务:
sudo start mesos-slave
在您的每台从机上执行此操作。
要查看您的从属服务器是否成功地在您的集群中注册了自己,请返回您位于端口 5050
的主服务器之一:
http://192.168.2.1:5050
您现在应该在界面中看到“3”处的活动从站数量:

您还可以看到界面中的可用资源已更新,以反映您的从机的池化资源:

要获得有关每台从机的更多信息,您可以单击界面顶部的“从机”链接。这将为您提供每台机器资源贡献的概览,以及指向每个从机的页面的链接:

在 Mesos 和 Marathon 上启动服务
Marathon 是 Mesosphere 用于安排长时间运行任务的实用程序。很容易将 Marathon 视为 Mesosphere 集群的初始化系统,因为它处理启动和停止服务、调度任务以及确保应用程序在出现故障时恢复运行。
您可以通过几种不同的方式将服务和任务添加到 Marathon。我们只会涵盖基本服务。 Docker 容器将在以后的指南中处理。
通过 Web 界面启动服务
在集群上快速运行服务的最直接方法是通过 Marathon Web 界面添加应用程序。
首先,访问您的其中一台主服务器上的 Marathon Web 界面。请记住,Marathon 接口位于端口 8080
上:
http://192.168.2.1:8080
从这里,您可以单击右上角的“新应用程序”按钮。这将弹出一个叠加层,您可以在其中添加有关新应用程序的信息:

根据您的应用程序的要求填写字段。唯一必填的字段是:
- ID:用户选择的唯一 ID,用于标识进程。这可以是您想要的任何内容,但必须是唯一的。
- 命令:这是将由 Marathon 运行的实际命令。这是将被监视并在失败时重新启动的进程。
使用此信息,您可以设置一个简单的服务,它只打印“hello”并休眠 10 秒。我们将其称为“hello”:

回到界面,服务会从“Deploying”转为“Running”:

每 10 秒左右,“任务/实例”读数将从“1/1”变为“0/1”,因为睡眠量已过且服务停止。Marathon 然后会再次自动重新启动任务。我们可以在 5050
端口的 Mesos web 界面中更清楚地看到这个过程:
http://192.168.2.1:5050
在这里,您可以看到进程完成并重新启动:

如果在任何任务上单击“Sandbox”,然后单击“stdout”,您可以看到生成的“hello”输出:

通过 API 启动服务
我们也可以通过 Marathon 的 API 提交服务。这涉及传入一个 JSON 对象,其中包含叠加层包含的所有字段。
这是一个相对简单的过程。同样,唯一需要的字段是用于进程标识符的 id
和包含要运行的实际命令的 cmd
。
所以我们可以使用以下信息创建一个名为 hello.json
的 JSON 文件:
nano hello.json
在内部,最低规格如下所示:
{
"id": "hello2",
"cmd": "echo hello; sleep 10"
}
这项服务会工作得很好。但是,如果我们真的想模拟我们在 Web UI 中创建的服务,我们必须添加一些额外的字段。这些在 Web UI 中是默认的,我们可以在这里复制它们:
{
"id": "hello2",
"cmd": "echo hello; sleep 10",
"mem": 16,
"cpus": 0.1,
"instances": 1,
"disk": 0.0,
"ports": [0]
}
完成后保存并关闭 JSON 文件。
接下来,我们可以使用 Marathon API 提交它。目标是端口 8080
上我们 master 的 Marathon 服务之一,端点是 /v2/apps
。数据负载是我们的 JSON 文件,我们可以通过使用 -d
标志和 @
标志来指示文件,将其读入 curl
。
提交的命令将如下所示:
curl -i -H 'Content-Type: application/json' -d@hello2.json 192.168.2.1:8080/v2/apps
如果我们查看 Marathon 界面,我们可以看到它已成功添加。它似乎与我们的第一个服务具有完全相同的属性:

可以用与第一个服务完全相同的方式监视和访问新服务。
结论
此时,您应该已经启动并运行了一个生产就绪的 Mesosphere 集群。我们此时只介绍了基本配置,但您应该能够看到利用 Mesosphere 系统的可能性。
在以后的指南中,我们将介绍如何在集群上部署 Docker 容器以及如何更深入地使用一些工具。