Малко вероятно е да се каже, че най-добрите от хората
намират радост чрез страдание.
Лудвиг ван Бетовен

Аз съм Сергей, работя в Яндекс.Такси в екипа по изследване на производителността. Искам да ви разкажа началото на историята за нашия път към използването на оркестрация - как избирахме инструментите и какво взехме предвид. Всички събития от статията се случват в реално време, така че вие, скъпи читатели, следите развитието на ситуацията почти на живо.
Защо ни е необходим диригент в екипа?
Кой всъщност е диригентът? От франц. diriger - управлявам, ръководя - в света на музиката, това е човек, ръководител на репетиции и изпълнение на ансамблова музика. В нашия случай това място се заема от системите за оркестрация и автоматизация.
Их ролята не се различава от ролята на диригента в музиката - те са необходими, за да помагат на екипа, да насочват и организират неговата игра.
Обикновено екипът разполага с определен набор от ресурси - да ги наречем сървъри, на които реализират своите проекти.
Подходът към получаването и експлоатацията на тези сървъри е разнообразен. Няколко примера:
- Екипът отправя заявка, например до групата по експлоатация, за предоставяне на ресурси с определени параметри.
- Групата по експлоатация предоставя необходимото количество - cloud или bare metal („чисто желязо“) - и се ангажира да ги поддържа в добро състояние съгласно SLA. Настройката също се извършва от групата по експлоатация.
- Екипът получава само ресурси cloud или bare metal от групата по експлоатация, настройката извършва самостоятелно.
- Екипът самостоятелно „закупува“ ресурси и ги поддържа/настройва напълно сам.
В нашия екип се използват сървъри, които трябва да се поддържат - обновяване на ОС, инсталиране на нови пакети и т.н.
За себе си ги разделихме на два основни типа:
- танкова група,
- сервизна група.
Танковата група се състои от хостове с Яндекс.Танк.
Сервизната група включва всичко, свързано с поддръжка - различни услуги за осигуряване на подкрепа на цикъла на релиза, генериране на автоматични отчети и т.н.
В един момент стана неудобно управлять всичко това ръчно, и започнахме да мислим за автоматизация на целия процес, от 'наливането' на сървъри до разработването, внедряването и стартирането на нашия вътрешен сервис.
Защо диригентът е необходим, дори когато оркестърът сам може да свири?
За начало, усвоихме Ansible и започнахме да 'наливаме' нашите bare metal сървъри, за да зависим по-малко от системните администратори — тук печелят всички, ние получаваме нови умения и освобождаваме администраторите от част от работата, която и без нас винаги им е достатъчно. Стремим се към развитие извън специалността си и автономност на екипа, доколкото е възможно.
В компанията работата с Ansible е организирана и регламентирана от доста време, затова лесно интегрирахме нашето решение в този процес.
Сега наливането на хостове се състои от три роли на Ansible:
- първата роля инсталира операционната система,
- втората извършва основни настройки за хоста, например LDAP удостоверяване,
- а третата инсталира Яндекс.Танк в docker контейнер и свързаните зависимости.
Да преминем към сервисите, които използваме вътре в екипа.
За задачите си използваме равно Kotlin и Python, а също и малко Golang. За да унифицираме разработването и внедряването на нашите сервисите, решихме да ги опаковаме в docker контейнери. Това дава свобода на избор на програмен език и едновременно регулира единен формат на доставка на собственото ни приложение.
Няколко думи за ipv6 в Docker
Част от сервисите, с които взаимодействаме, са достъпни само по ipv6, затова трябваше да разберем как да направим ipv6 за контейнерите.
Според документацията за ipv6 на официалния сайт на Docker, ipv6 се активира с добавяне на параметри в daemon.json:
{
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64"
}При това доставчикът трябва да предостави подмрежа ipv6, която ще впишете в fixed-cidr-v6.
Въпреки това, избрахме друг вариант — ipv6 NAT, и ето защо:
- Сега docker само с ipv6.
- На всеки контейнер глобално маршрутизируемият адрес означава, че всички портове (дори непубликувани) стават достъпни за всички, освен ако не се осъществява допълнителна филтрация.
- userland proxy за публикуване на портове, .
ipv6 NAT — това е , който сам управлява правилата в ip6tables и ги редактира при добавяне на нов контейнер.
За да проработи това решение, беше необходимо да се направят още няколко манипулации. Задължително е да се инициализира ip6table_nat в системата. Наличието на инсталиран модул не гарантира, че при стартиране модулът ще бъде зареден в ядрото. Столкувахме с това, когато получихме следната грешка при стартиране на контейнера с NAT на нов хост:
2019/01/22 14:59:54 изпълняване [/sbin/ip6tables -t filter -N DOCKER --wait]: exit status 3: modprobe: не може да се промени директорията на '/lib/modules': Няма такава файлова или директорийна структура
ip6tables v1.6.2: не може да инициализира ip6tables таблица `filter`: Таблицата не съществува (трябва ли да insmod?)Проблемът беше решен след добавянето в ролята на Ansible инициализация с помощта на модула modprobe и зареждането му при стартиране на ОС с помощта на lineinfile:
- name: Добавяне на модула ip6table_nat
modprobe:
name: ip6table_nat
state: present
- name: Добавяне на ip6table_nat в стартиране
lineinfile:
path: /etc/modules
line: 'ip6table_nat'Между другото, в Хабра има добра , която кратко и ясно описва предимствата и недостатъците на различните методи за работа с ipv6 в docker.
Но да се върнем на нашия въпрос, зададен в началото:
Защо диригентът е необходим, дори когато оркестърът сам може да свири?
Сега всички разбират как да играят в нашия отбор:
- процесът на „наливане“ на сървъри е създаден,
- разработката и деплойването на услуги са унифицирани.
Има основателен въпрос – как ефективно и максимално автоматизирано да деплойваме, обновяваме и контролираме нашите услуги в docker-контейнери?
Въпреки че всеки участник в оркестъра знае своята част, той може да се обърка, да се отклони от първоначалната идея. Тук ние стигаме до заключението, че без диригент нашият оркестър няма да репетира ефективно и да свири слажено. Диригентът отговаря за всички параметри на изпълнението, за да бъде всичко обединено в единен ритъм и настроение.
Как с минимални вложения да получим добър диригент?
Темата за оркестрацията е достатъчно добре развита на пазара. Но първо да поговорим за помощни инструменти, които могат да помогнат на диригента.
— система, която предлага две основни функции:
- откриване на услуги (service discovery),
- разпределено хранилище ключ-стойност.
В нашия оркестър, Consul ще отговаря за регистрацията на услуги и съхранението на техните конфигурации. Има два варианта за регистрация:
- Активна — когато услугата сама се регистрира, използвайки HTTP API;
- Пасивна — услугата трябва да бъде упомената ръчно.
Vault е хранилище, което стандартизира и унифицира безопасното съхранение и работа с тайни — пароли, сертификати.
Ето предимствата, които ще получим, използвайки този инструмент:
- Единен център за създаване и съхранение на тайни, управление на техния жизнен цикъл чрез HTTP API.
- Transit Secrets Engine — криптиране и декриптиране на данни без тяхното съхранение. Възможност за предаване на данни в криптиран вид по незашифровани комуникационни канали.
- Политики за достъп, които могат лесно да се настройват.
- Аудит на достъпа до тайни.
- Възможност за създаване на собствен CA (Certificate Authority) за управление на самоподписани сертификати в рамките на собствената инфраструктура.
Вземайки предвид всички наши изисквания, на ролята диригент бяха подходящи два варианта — Kubernetes и Nomad.
Kubernetes
Колко много статии и книги вече са написани за него (вижте , например), накарах описанията да звучат накратко — това е универсален комбайн, който може почти всичко. Цената за това е не винаги лесна настройка и поддръжка на кластера в Kubernetes.
Nomad
от HashiCorp, компанията, известна с горепосочените consul и vault.
Nomad изглеждаше достатъчно прост за инсталиране и настройка в сравнение с Kubernetes. Един бинарен файл работи както в режим на сървър, така и в режим на клиент. При това Nomad покрива целия списък задачи, които искаме да реши: управление на кластера, бърз планиращ, поддръжка на multidatacenter. Освен това, при използване на consul и vault получаваме по-тясна интеграция за оркестрация на нашите услуги.
Какво е в работа в момента:
- подготвихме сървърите за разгръщане на Consul,
- в Consul ще бъде внесена конфигурацията на кластера nomad, с помощта на която nomad трябва да бъде разгрънат автоматично,
- паралелно ще инсталираме vault за съхранение на тайни.
Въпрос в залата — струва ли си да създаваме диригент за такива задачи или оркестрацията и без него е добра? Споделете в коментарите какво мислите за това.
Следвайте нашия блог и оставайте на линия — скоро ще ви разкажем какво се случи в крайна сметка и дали настроихме кластера nomad така, както искахме.
Посетете нашия уютен , където винаги можете да поискате съвет, да помогнете на колеги и просто да обсъждате теми, свързани с изследвания на производителността и не само.
Източник: habr.com
