表演乐团

说最好的人几乎是不对的
通过痛苦获得快乐。
路德维希·范·贝多芬



我是Sergey,我在绩效研究团队的Yandex.Money工作。 我想告诉您有关使用编排的道路的故事的开始-我们如何选择乐器以及考虑了什么。 这篇文章中的所有事件都是实时发生的,因此,亲爱的读者,您几乎可以实时了解情况的发展。


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


谁是指挥? 从fr。 在音乐世界中,指挥者-管理,指挥,领导-这是一个人,是合奏音乐学习和表演的领导者。 在我们的案例中,这个地方被业务流程和自动化系统占据。


他们的角色与指挥在音乐中的角色无异-需要他们帮助团队,指挥和组织其演奏。


通常,团队具有一定的能力集-我们称其为在其上实现项目的服务器。


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


  • 团队向操作组发出请求,例如向他们提供具有某些参数的资源。
  • 操作小组向他们提供所需的量-云或裸金属(“裸金属”),并根据SLA保证将它们保持在良好的状态。 调整也由运营团队执行。
  • 该团队仅从操作组接收云或裸机资源;它执行自己的设置。
  • 团队本身“购买”资源并完全独立地支持/配置它们。

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


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


  • 坦克组
  • 服务组。

坦克小组由Yandex.Tank主持人组成。


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


一方面,手动管理所有这些变得很不方便,我们考虑了自动化整个过程,从“加载”服务器开始,到内部服务的开发,布局和启动结束。


即使乐团本身也可以演奏,为什么还需要指挥?


首先,我们掌握了Ansible,并开始“倾倒”我们的裸机服务器,以减少对系统管理员的依赖-每个人都在这里赢得胜利,我们获得了新的技能,并使管理员摆脱了他们在没有我们的情况下通常无法完成的工作。 我们努力在我们的专业和自治范围之外尽可能地发展我们的团队。


该公司已经与Ansible建立了很长时间的合作并受到监管,因此我们很容易将解决方案集成到此过程中。


托管现在由三个Ansible角色组成:


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

让我们继续研究团队内部使用的服务。


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


关于Docker中ipv6的一句话


我们与之交互的某些服务仅可通过ipv6获得,因此我不得不弄清楚如何为容器制作ipv6。


根据Docker官方网站上ipv6的文档,通过向daemon.json添加参数来启用ipv6:


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

在这种情况下,提供商应发布ipv6子网,您将在fixed-cidr-v6.该子网fixed-cidr-v6.
但是,我们选择了另一个选项-ipv6 NAT,这是为什么:


  • 现在,docker 不能仅与ipv6 一起使用
  • 每个容器中都有一个可全局路由的地址,这意味着如果不执行附加过滤,所有端口(甚至是未发布的端口)将对所有人可用。
  • 用于发布端口的userland代理, 仅用于ipv4的iptables

ipv6 NAT是一个docker容器 ,它本身管理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' 

顺便说一句,在Haber上有一篇不错的文章 ,其中简要而清晰地描述了在docker中使用ipv6的特定方法的优缺点。


但是回到开始时我们提出的问题:
即使乐团本身也可以演奏,为什么还需要指挥?


现在每个人都知道如何参加我们的团队:


  • 创建“填充”服务器的过程,
  • 服务的开发和部署是统一的。

出现一个合理的问题-如何在Docker容器中高效且尽可能自动化地部署,更新,控制我们的服务?


尽管乐团的每个成员都知道自己的角色,但他还是会误入歧途,脱离最初的想法。 在这里,我们得出这样一个事实:没有指挥,我们的管弦乐队将无法有效地排练和演奏。 指挥负责所有性能参数,以确保所有内容都统一在一个步调和心情下。


如何以最少的投资获得好的指挥?


编排主题在市场上已经得到很好的发展。 但是首先,让我们谈谈可以帮助指挥的支持工具。


Consul是一个提供两个主要功能的系统:


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

在我们的乐团中,领事将负责注册服务并存储其配置。 有两个注册选项:


  • 活动-这是服务本身使用HTTP API进行注册的时间;
  • 被动-服务必须手动注册。

保管箱是用于标准化和统一安全存储并使用机密(密码,证书)的存储库。
这是我们使用此工具可获得的好处:


  • 一个用于创建和保存机密信息,通过HTTP API管理其生命周期的中心。
  • Transit Secrets Engine-对数据进行加密-解密而不保存它。 通过不安全的通信通道以加密形式传输数据的能力。
  • 方便配置的访问策略。
  • 审核对机密的访问。
  • 能够创建自己的CA(证书颁发机构)以管理基础架构中的自签名证书。

考虑到我们的所有要求,Kubernetes和Nomad是两个适合指挥角色的选项。


Kubernetes


已经写了多少篇有关他的文章和书籍(例如,这篇文章),有报告告诉我,我将做简短介绍-这是一个通用的处理器,几乎可以完成任何事情。 在Kubernetes上建立和支持集群并不总是那么容易。


游牧民族


该工具来自HashiCorp,这是一家以上述领事和保险库而闻名的公司。


在我们看来,Nomad的安装和配置似乎比Kubernetes更简单。 一个二进制文件在服务器和客户端模式下均可工作。 同时,Nomad涵盖了我们要解决的全部任务列表:集群管理,快速调度程序,多数据中心支持。 另外,在使用领事和保管库时,我们会更紧密地集成以协调我们的服务。


现在正在做什么:


  • 准备了用于部署Consul的服务器,
  • 将在Consul中输入nomad群集配置,应自动部署nomad,
  • 同时,我们将安装保管库以保密。

礼堂中的问题是,值得为这样的任务配备指挥,还是没有它的乐团很好? 在评论中告诉我们您对此的看法。




订阅我们的博客并保持联系-我们将很快告诉您最终发生了什么以及是否按照我们的意愿配置了漫游集群。


访问我们舒适的电报聊天室 ,您可以在其中始终寻求建议,帮助同事,谈论性能研究等等。

Source: https://habr.com/ru/post/zh-CN443822/


All Articles