表演乐团

可以说,最好的男人是最优秀的
通过痛苦寻找快乐。
路德维希·范·贝多芬

表演乐团

我是 Sergey,在 Yandex.Money 的性能研究团队工作。 我想告诉你故事的开头,关于我们使用编排的道路——我们如何选择乐器以及我们考虑了什么。 文章中的所有事件都是实时发生的,因此亲爱的读者,您几乎可以实时关注事态的发展。

为什么我们的团队需要一名指挥?

谁是指挥? 来自神父。 diriger - 管理、指导、领导 - 在音乐世界中 - 这是一个合奏音乐学习和表演的领导者。 在我们的例子中,这个地方被编排和自动化系统占据。

他们的角色与音乐中指挥的角色没有什么不同——他们需要帮助团队、指导和组织演奏。

通常,团队拥有一组特定的能力(我们称之为服务器),他们可以在这些能力上实施项目。

获取和操作这些服务器的方法多种多样。 举几个例子:

  • 例如,团队向运营团队提出请求,为他们提供具有某些参数的资源。
  • 运营团队为它们提供所需的数量(云或裸机),并承诺根据 SLA 将它们保持在适当的状态。 设置也由运营团队进行。
  • 团队仅从运营组接收云或裸机资源,并自行配置。
  • 团队自己“购买”资源并完全独立地维护/设置它们。

我们的团队使用需要支持的服务器 - 更新操作系统、安装新软件包等。

对于我们自己来说,我们将它们分为两种主要类型:

  • 坦克组,
  • 服务组。

Tank 组由 Yandex.Tank 主机组成。

服务组包括与维护相关的所有内容 - 这些是为发布周期提供支持、生成自动报告等的各种服务。

一度,所有这些都变得不方便手动管理,我们考虑将整个流程自动化,从“加载”服务器开始,到内部服务的开发、发布和启动。

即使管弦乐队本身可以演奏,为什么还需要指挥?

首先,我们掌握了 Ansible,并开始“倾注”我们的裸机服务器,以便减少对系统管理员的依赖 - 每个人都赢了,我们获得了新技能,并减轻了管理员的一些工作,如果没有我们,他们总是有足够的工作。 我们努力尽可能地超越我们的专业和团队自主权。

在公司中,与 Ansible 的合作已经配置和规范了相当长的时间,因此我们可以轻松地将我们的解决方案集成到此流程中。

目前,主机池由三个 Ansible 角色组成:

  • 第一个角色安装操作系统,
  • 第二个运行主机的基本设置,LDAP 授权,例如,
  • 第三个在 docker 容器中安装 Yandex.Tank 和相关依赖项。

让我们继续讨论我们在团队中使用的服务。

对于我们的任务,我们同样使用 Kotlin 和 Python,并且更多地使用 Golang。 为了统一我们服务的开发和部署,我们决定将它们打包在 Docker 容器中。 这使您可以自由选择编程语言,同时为您的应用程序规定统一的交付格式。

关于 Docker 中 ipv6 的一个小注意事项

我们交互的一些服务只能通过 ipv6 获得,因此我们必须弄清楚如何为容器提供 ipv6。

根据Docker官网的ipv6文档,ipv6是通过在daemon.json中添加参数来启用的:

{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

在这种情况下,提供商必须颁发一个 ipv6 子网,您将在其中注册 fixed-cidr-v6.
但是,我们选择了另一个选项 - ipv6 NAT,原因如下:

  • 现在码头工人 不能用 仅适用于 IPv6。
  • 每个容器中都有一个全局可路由的地址意味着所有端口(甚至未发布的端口)都会向所有人公开,除非执行额外的过滤。
  • 用于发布端口的用户态代理, iptables 仅适用于 ipv4.

ipv6 NAT 是 码头集装箱,它本身管理 ip6tables 中的规则并在添加新容器时编辑它们。

为了使该解决方案正常工作,有必要进行许多其他操作。 确保在系统上初始化 ip6table_nat。 系统上安装的模块的存在并不能保证该模块将在启动时加载到内核中。 当我们在新主机上运行带有 NAT 的容器时收到此错误时,我们遇到了这种情况:

2019/01/22 14:59:54 running [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: can't change directory to '/lib/modules': No such file or directory
ip6tables v1.6.2: can't initialize ip6tables table `filter': Table does not exist (do you need to insmod?)

使用 modprobe 模块向 Ansible 角色添加初始化并使用 lineinfile 在操作系统启动时加载它后,问题得到解决:

- name: Add ip6table_nat module
 modprobe:
   name: ip6table_nat
   state: present
- name: Add ip6table_nat to boot
 lineinfile:
   path: /etc/modules
   line: 'ip6table_nat'

顺便说一句,集线器上有一个很好的 文章,它简要而清晰地描述了在 docker 中运行 ipv6 的一种或另一种方法的优缺点。

但让我们回到一开始提出的问题:
即使管弦乐队本身可以演奏,为什么还需要指挥?

现在大家想象一下我们队要怎么打:

  • “浇注”服务器的流程已经创建,
  • 服务的开发和部署是统一的。

一个合理的问题出现了:如何高效、自动地在 Docker 容器中部署、更新和控制我们的服务?

尽管每个乐团成员都知道自己的角色,但他可能会感到困惑并偏离最初的想法。 在这里我们得出的结论是,如果没有指挥,我们的乐团就无法有效地排练和连贯地演奏。 指挥负责演出的所有参数,确保一切都以单一的节奏和情绪统一起来。

如何用最少的投入找到一个好的导体?

编排主题在市场上已经相当成熟。 但首先,我们来谈谈可以帮助指挥的辅助工具。

领事 - 提供两个主要功能的系统:

  • 服务发现,
  • 分布式键值存储。

在我们的 Orchestra 中,Consul 将负责注册服务并存储其配置。 有两种注册选项:

  • 活动是指服务使用 HTTP API 注册自身;
  • 被动 - 必须手动注册服务。

Vault 是一个标准化和统一秘密(密码、证书)的安全存储和处理的存储库。
以下是使用该工具我们将获得的好处:

  • 使用 HTTP API 创建和存储机密并管理其生命周期的单一中心。
  • Transit Secrets Engine - 加密和解密数据而不保存数据。 通过不安全的通信通道以加密形式传输数据的能力。
  • 易于配置的访问策略。
  • 审计对秘密的访问。
  • 能够创建您自己的 CA(证书颁发机构)来管理基础设施内的自签名证书。

考虑到我们的所有要求,有两种选择适合指挥角色:Kubernetes 和 Nomad。

Kubernetes

已经写了多少关于他的文章和书籍(这里 这样的,例如),有一些报告我会简要写一下 - 这是一台几乎可以做所有事情的通用收割机。 这样做的代价是在 Kubernetes 上设置和维护集群并不总是那么容易。

游牧

工具 来自 HashiCorp,一家以上述领事和金库而闻名的公司。

我们发现 Nomad 比 Kubernetes 更容易安装和配置。 一个二进制文件可以在服务器和客户端模式下工作。 同时,Nomad 涵盖了我们希望它解决的所有任务:集群管理、快速调度程序、多数据中心支持。 另外,当使用 consul 和 Vault 时,我们可以更紧密地集成来编排我们的服务。

目前正在进行的工作:

  • 为Consul部署准备好服务器,
  • nomad集群配置将被输入到Consul中,在它的帮助下nomad应该被自动部署,
  • 与此同时,我们将安装保险库来存储秘密。

向观众提出的问题是:是否值得聘请指挥来完成这样的任务,或者乐团在没有他的情况下表现得很好吗? 请在评论中告诉我们您对此有何看法。

订阅我们的博客并保持联系 - 我们很快就会告诉您最终发生了什么以及我们是否按照我们想要的方式配置了 nomad 集群。

来到我们温馨的 电报聊天,您可以随时寻求建议、帮助同事以及讨论生产力研究等。

来源: habr.com

为具有 DDoS 保护、VPS VDS 服务器的站点购买可靠的主机 🔥 购买具备 DDoS 防护的可靠网站托管服务,包括 VPS 和 VDS 服务器 | ProHoster