我们目前正在设计我们新的 Apache Mesos 云设置的架构。目标是通过将不同的堆栈移动到同一架构上来统一我们的系统。主要工作负载是使用 Apache Spark 和我们的企业基础设施(包括 Web 服务器、邮件服务器等)进行大数据分析。
这个想法是在 Docker 容器中运行我们的 Web 服务,该容器运行在 Mesos 的可用调度程序之一(Marathon/Chronos、Aurora 或 Singularity)之上。因此,这将是第一个 Mesos 框架组。在它旁边,我们会有 Apache Spark 框架和几个用于数据存储的数据库框架。这将是第二组 Mesos 框架。我们将在并行运行它们进行测试后选择细节。
然而,我们很难决定在哪个基础上运行 Mesos 本身。理想情况下,我们希望尽可能靠近金属运行它。我们还希望使用编排解决方案来确保 Mesos 和框架守护进程在失败时始终运行/重新启动。我们正在考虑的选项如下:
1) 在最小的操作系统中将 Mesos 和框架作为 docker 容器运行。在这方面,我们目前倾向于 CoreOS 和 Fleet。
2) 直接在 Ubuntu/Debian 服务器上运行 Mesos 和框架。对于这个选项,我们倾向于 Foreman 和 Puppet。
至于这个问题,我们正在寻找解决方案,按重要性排序:
我们之前没有使用过 CoreOS,但它似乎是我们正在走向的选项。我对此的一个大(主观)问题是我们在 Docker 容器上运行 Mesos,然后在 Mesos 上运行 Docker 容器。这对我来说似乎是“不洁”和错误的。这种考虑是没有道理的?
类似的想法涉及层之间的冗余。为了解释我从哪里来,我更希望 Mesos 是一个真正的操作系统,它只是在金属之上运行。似乎无论您使用什么基础,最终都会在架构的不止一层(即 CoreOS&Fleet&SystemD == Mesos&Marathon&Chronos)上获得相同的预期功能。这是不可避免的吗?
有没有其他好的选择来运行我们没有考虑的 Mesos 下的层,记住我们的标准?
我们遇到了一个有趣的争论,并陷入了两个阵营。我对我们可能遗漏的想法或陷阱的任何特定问题感兴趣。真的,任何可以帮助我们做出决定或指出我们没有考虑的事情的东西。我知道这有点接近“无意见”规则,但我希望这仍然是一个可以接受的问题。长度也很抱歉,有一些细微差别。
1)一方面(我的 - 我并非没有偏见)发现不可变服务器模型对于云系统非常有趣。为此,我们设计了将基础架构的所有组件迁移到 Docker 中的原型。我们的自定义应用程序通过 Jenkins 直接构建到部署到本地 Docker Registry 的 Docker 镜像中。然后我们创建了大量 Ansible 角色和一个剧本,它能够接触到一个空服务器,安装 Docker,然后告诉 Docker 根据需要安装所有容器。几分钟后,整个应用程序及其所有支持基础设施都已连接好并开始工作 - 日志记录、监控、数据库创建/填充等。完成的机器是一个独立的 QA 或开发环境,具有精确的副本应用。我们的扩展计划是制作新的 Playbooks 以从基本可信 AMI(可能是一个非常裸的镜像)构建新的 AWS 服务器,滚动部署生产应用程序以处理配置管理和发布,并且通常不再编辑服务器 -只是让他们重新。我并不担心在实践中得到我所描述的东西——只要它是一个合理的模型。
2) 另一个阵营想用 Puppet 来处理配置管理,Ansible 来部署我们的自定义应用程序,这些应用程序是从我们的构建过程中生成的 tarball,Foreman 来处理整个过程的触发和管理,而 Katello 来做一些基础形象管理。发布将涉及 Puppet 根据需要更改配置,以及 Ansible 通过一定数量的 Foreman 协调部署更新的组件。如果我们需要新的服务器,服务器的构建速度会相当快,但目的不是让它们成为标准流程的一部分。虽然寿命很长,但它更接近凤凰服务器模型。
所以我的问题真的归结为这个:带有我上面描述的工具的不可变服务器模型实际上和它看起来一样真实吗?我喜欢这样的想法,即我们的暂存过程实际上可以实时构建应用程序的完整克隆,让 QA 对其进行锤击,然后只需翻转数据库存储和一些 DNS 设置即可使其生效。
还是不可变服务器模型在实践中失败了?我们在 AWS 和云环境方面拥有丰富的经验,因此这并不是真正的问题 - 更重要的是如何可靠地部署合理复杂的应用程序。这是特别有趣的,因为我们经常发布。
除了实际为我们创建 EC2 服务器之外,我们让 Ansible 做大多数需要的事情,这并不难。我无法理解为什么您实际上需要在此模型中使用 Puppet/Foreman/Katello。Docker 比我能说的任何工具中的自定义部署脚本都要干净和简单得多。当您不再担心必须就地配置它们而只需使用新配置重新构建它们时,Ansible 似乎比 Puppet 更易于使用。我是 KISS 原则的粉丝——尤其是在墨菲定律猖獗的自动化领域。机器越少越好 IMO。
对这种方法的任何想法/意见或建议将不胜感激!
我刚刚第一次设置 Foreman 并且不确定如何将我的所有配置置于版本控制之下。我知道我可以将 Git 用于我安装在我的 Puppet master 上的每个模块,但更喜欢一个更全面的解决方案,它不仅包括模块,还包括与每个主机关联的类以及主机上设置的任何变量。任何建议以及相关的工作流程将不胜感激。如果相关,我确实将 GitLab 设置为现场的中央 Git 服务器,并计划很快设置一个 CI 服务器,例如 Jenkins。
首先,我知道在 serverfault 上已经有一个非常相似的问题,但它并没有完全回答我的问题。
所以,我的设置如下:我有一台服务器,运行 Ubuntu 14.04 LTS 和 puppet master 3.4.3 和 foreman 1.6。客户端是运行 puppet 代理 3.7.0 的 Windows 7 计算机。
自动运行工作正常,我只是无法让Run Puppet按钮工作。我总是收到带有此消息的红色叠加层:
failed to execute puppetrun: ERF12-4252 [ProxyAPI::ProxyException]: Unable to execute Puppet run ([RestClient::InternalServerError]: 500 Internal Server Error) for proxy https://puppetmaster:8443/puppet
Run Code Online (Sandbox Code Playgroud)
我按照wiki的说明在节点上添加了以前不存在的文件 auth.conf。我把它放在C:\ProgramData\PuppetLabs\puppet\etc\puppet.conf 文件所在的位置。我还在这个目录中添加了一个空的 namespaceauth.conf。在节点和服务器上我激活了listen=true。我在 sudoers 文件中添加了 foreman-proxy。我重新启动了节点服务和 puppetmaster 几次。这就是我发现的所有其他帖子都说“现在你有一个可以运行的运行木偶按钮”。除了我它不起作用。
我能找到的唯一日志条目是在 /var/log/foreman-proxy/proxy.log 中:
E, [2014-10-20T17:50:53.051681 #1119] ERROR -- : Failed puppet run: Check Log files
Run Code Online (Sandbox Code Playgroud)
我检查了我能找到的所有日志文件,但找不到关于此错误可能是什么的任何进一步信息。编辑:添加到 wiki 的链接第二次编辑:我还检查了工头错误代码,但不幸的是,我得到的代码没有任何链接到它的信息。(是的,我检查了代理通信错误 - 没有)
我几乎不知道 Puppet 来问这个问题。
我想我明白特定节点的配置将由一组模块组成,并带有一些特定于节点的胶水。从教程和文档来看,特定于节点的资源似乎位于 manifests/site.pp 文件中,在node /nodename/ { }资源中,“包含”用于相关类,以及用于进行特定于节点的配置更改的资源。
现在输入一个外部节点分类器 (ENC),例如 theForeman。
根据我对 ENC 文档的阅读,我可以使用node /nodename/ { }site.pp 中的资源,但我不能声明任何新资源。基本不推荐。生成的 YAML 只是包含和变量设置。
那么对于特定于给定节点或主机组的配置 - 集成所有包含的类的接线有什么作用呢?
您最终会创建一个特定于节点的类吗?您将该类放在特定于节点的模块中的什么位置?或者您是否为您的站点特定配置制作了一个包罗万象的模块,其中的类可以分配给特定节点?
我目前正在尝试将我拥有的 ESXi 集群添加到 Foreman 1.4.1,但遇到了权限问题。目前,我已授予服务帐户以下权限:
有了这个,我们仍然在为网络分配接口时遇到问题,我无法为指定的机器创建磁盘。有谁知道 foreman 在 vSphere 集群上配置所需的最低权限?
我有一个在 Debian 7 上运行的 puppet/foreman 服务器来管理我的系统。我使用的是 puppet and foreman 1.6.0 的社区版本 3.7。我使用目录环境。
目前,我对自己编写的模块使用了相当复杂的工作流程,在我的开发环境中创建它们,这是颠覆控制的,然后将它们导出到外部目录,构建它们的木偶模块(木偶模块构建...)和在生产中安装它。我考虑过使用 subversion 将它们分支/标记到生产中,但由于我不记得的原因,当时排除了这一点。
同时我学习了一点 git 并且宁愿使用 git 而不是 subversion。我的问题是现在是否有最佳实践可以这样做?我可以想象至少两种方法都有其优缺点。一种方法是将环境开发置于版本控制之下,然后将其克隆/分支到生产环境中。其次是制作每个模块的 git repo 并将它们克隆到环境中。
正如我所说,我是 git 的新手,所以我对它的优点和缺点没有真正的了解。此外,我只使用木偶和工头大约 8 个月。
干杯,克里斯托夫
我正在和工头一起玩(学习工头和码头工人),并想尝试码头工人的方法。
在任何地方都找不到它的 docker 文件。
当我从容器内启动容器时,如何找出哪个文件被执行?
我问的原因是我希望容器使用主机的两个网络接口,一个用于 Web-UI,另一个用于在单独的专用网络上分发 DHCP 和 DNS。
如果我执行附加了“bash”的容器,我可以将 dns 和 dhcp 代理网络的配置选项传递给它,但我失去了所有其他优点,即 SSL 证书、管理员凭据……
foreman ×9
puppet ×6
ansible ×2
docker ×2
git ×2
puppetmaster ×2
amazon-ec2 ×1
apache-mesos ×1
cloud ×1
coreos ×1
linux ×1
ubuntu ×1
vmware-esxi ×1
windows ×1