简介
Mesosphere 是一个系统,它结合了许多组件,可以在现有操作系统层之上有效地管理服务器集群和高可用部署。与 CoreOS 等系统不同,Mesosphere 不是一个专门的操作系统,而是一组软件包。
在本指南中,我们将介绍如何在 Mesosphere 中配置高可用集群。这个配置将使我们在任何主节点出现故障时具有故障转移功能,并且还会有一组从服务器来处理被调度的任务。
我们将在本指南中使用 Ubuntu 14.04 服务器。
先决条件和目标
在完成本指南之前,强烈建议您先阅读我们的 Mesosphere 简介。这是一个熟悉系统组件并帮助您识别每个单元责任的好方法。
在本教程中,我们将使用六台 Ubuntu 服务器。这满足了 Apache Mesos 对于生产环境至少需要三个主节点的建议。它还提供了一个包含三个工作节点或从节点的池,当任务发送到集群时,它们将被分配工作。
我们将使用 zookeeper
来跟踪主服务器的当前领导者。建立在此之上的 Mesos 层将提供分布式同步和资源处理。它负责管理集群。Marathon 是集群的分布式初始化系统,用于调度任务并将工作分配给从服务器。
出于本指南的目的,我们假设我们的机器具有以下配置:
主机名 | 功能 | IP 地址 |
---|---|---|
master1 | Mesos 主节点 | 192.0.2.1 |
master2 | Mesos 主节点 | 192.0.2.2 |
master3 | Mesos 主节点 | 192.0.2.3 |
slave1 | Mesos 从节点 | 192.0.2.51 |
slave2 | Mesos 从节点 | 192.0.2.52 |
slave3 | Mesos 从节点 | 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。这些 ID 号将保存在 /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。这些步骤应该在每台主服务器上执行。
修改仲裁以反映您的集群大小
首先,我们需要调整做出决策所需的仲裁。这将确定集群处于正常运行状态所需的主机数量。
仲裁应该设置为使超过 50% 的主节点必须出席做出决策。然而,我们还希望建立一些容错性,以便如果我们的所有主节点都不在,集群仍然可以正常运行。
我们有三个主节点,因此满足这两个要求的唯一设置是仲裁为两。由于初始配置假定为单服务器设置,仲裁目前设置为一。
打开仲裁配置文件:
sudo nano /etc/mesos-master/quorum
将值更改为 “2”:
2
保存并关闭文件。在每台主服务器上重复此操作。
配置主机名和 IP 地址
接下来,我们将为每台主服务器指定主机名和 IP 地址。我们将使用 IP 地址作为主机名,以便我们的实例不会在解析时出现问题。
对于我们的主服务器,IP 地址需要放在以下文件中:
- /etc/mesos-master/ip
- /etc/mesos-master/hostname
首先,在 /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 的集群化 init 系统实现。
Marathon 将在每个主机上运行,但只有领先的主服务器才能实际调度作业。其他 Marathon 实例将透明地代理请求到主服务器。
首先,我们需要为每个服务器的 Marathon 实例再次设置主机名。同样,我们将使用 IP 地址,我们已经在一个文件中拥有。我们可以将其复制到我们需要的文件位置。
然而,我们需要的 Marathon 配置目录结构不会自动创建。我们将不得不创建该目录,然后我们可以复制文件:
sudo mkdir -p /etc/marathon/conf
sudo cp /etc/mesos-master/hostname /etc/marathon/conf
接下来,我们需要定义 Marathon 将连接到的 zookeeper
主节点列表,以获取信息和调度。这是我们一直在为 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
,这将设置我们的主节点选举。然后我们可以启动我们的 Mesos 主进程和 Marathon 进程:
sudo restart zookeeper
sudo start mesos-master
sudo start marathon
要查看您刚刚设置的内容,请在您的浏览器中访问其中一个主服务器的 5050
端口:
http://192.168.2.1:5050
您应该会看到主要的 Mesos 界面。根据您是否连接到选举领导者,您可能会被告知正在被重定向到活动主节点或不是。无论如何,屏幕看起来会类似于这样:
!Mesos 主界面
这是您集群的当前视图。目前没有可用的从属节点和未启动的任务,所以没有太多可见的内容。
我们还配置了 Marathon,Mesosphere 的长时间运行任务控制器。这将在任何主服务器的 8080
端口上可用:
!Marathon 主界面
一旦我们设置好从属节点,我们将简要介绍如何使用这些界面。
配置从属服务器
现在我们已经配置好主服务器,我们可以开始配置从属服务器。
我们已经使用主服务器的 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 三个从属节点
您还可以看到界面中的可用资源已更新,以反映您的从属机器的汇总资源:
!Mesos 资源
要获取有关每个从属机器的其他信息,您可以点击界面顶部的 “从属节点” 链接。这将为您提供每台机器的资源贡献概述,以及指向每个从属机器页面的链接:
!Mesos 从属节点页面
在 Mesos 和 Marathon 上启动服务
Marathon 是 Mesosphere 用于调度长时间运行任务的实用程序。很容易将 Marathon 视为 Mesosphere 集群的 init 系统,因为它处理启动和停止服务、调度任务,并确保应用程序在关闭后重新启动。
您可以以几种不同的方式向 Marathon 添加服务和任务。我们只会涵盖基本服务。Docker 容器将在以后的指南中处理。
通过 Web 接口启动服务
在集群上快速启动服务的最直接方式是通过 Marathon web 接口添加应用程序。
首先,访问其中一个主服务器上的 Marathon web 接口。请记住,Marathon 接口位于 8080
端口:
http://192.168.2.1:8080
在这里,您可以点击右上角的 “New App” 按钮。这将弹出一个覆盖层,您可以在其中添加有关新应用程序的信息:
!Marathon new app
填写应用程序的要求字段。唯一强制的字段是:
- ID:用户选择的用于标识进程的唯一 ID。这可以是任何您喜欢的内容,但必须是唯一的。
- Command:这是 Marathon 将运行的实际命令。这是将被监视并在失败时重新启动的进程。
使用这些信息,您可以设置一个简单的服务,它只是打印 “hello” 并休眠 10 秒。我们将其称为 “hello”:
!Marathon simple app
当您返回到界面时,服务将从 “Deploying” 变为 “Running”:
!Marathon app running
大约每 10 秒,“Tasks/Instances” 读数将从 “1/1” 变为 “0/1”,因为休眠时间过去了,服务停止了。然后 Marathon 会自动重新启动任务。我们可以在 Mesos web 接口的 5050
端口更清楚地看到这个过程:
http://192.168.2.1:5050
在这里,您可以看到进程完成并重新启动:
!Mesos restart task
如果您点击任何任务的 “Sandbox”,然后点击 “stdout”,您可以看到产生的 “hello” 输出:
!Mesos output
通过 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 提交它。目标是我们其中一个主服务器的 Marathon 服务,端口为 8080
,端点为 /v2/apps
。数据有效负载是我们的 JSON 文件,我们可以使用 curl
的 -d
标志和 @
标志将其读入 curl
。
提交的命令如下:
curl -i -H 'Content-Type: application/json' -d@hello2.json 192.168.2.1:8080/v2/apps
如果我们查看 Marathon 界面,我们可以看到它已成功添加。它似乎具有与我们第一个服务完全相同的属性:
!Marathon two services
新服务可以以与第一个服务完全相同的方式进行监视和访问。
结论
到目前为止,您应该已经拥有一个可投入生产的 Mesosphere 集群。目前我们只涵盖了基本配置,但您应该能够看到利用 Mesosphere 系统的可能性。
在未来的指南中,我们将介绍如何在集群上部署 Docker 容器以及如何更深入地使用一些工具。