В феврале 2022-го стало ясно, что надо приобретать профессию, востребованную за пределами России. На тот момент я жил в Москве и успешно практиковал как юрист. За плечами у меня была работа в крупнейшей юридической фирме и годы преподавания в университете. Но еще до того, до поступления на юрфак, большую часть своего времени я посвящал компьютерам. Я буквально фанател от всего, что с ними связано. По книгам изучал Basic и Pascal, занимался дизассемблированием программ и знакомился с Linux. И даже после того, как судьба привела меня в юриспруденцию, я не оставил этой своей страсти. Так что сфера, в которую я хотел уйти, была понятна – оставалось только выбрать специальность.
Потратив несколько дней на изучение вариантов, я решил пойти в DevOps-инженеры. Хотя за несколько лет до этого я прошел на Stepik несколько курсов по Python, системное администрирование привлекало меня больше разработки, а DevOps-практики казались чем-то вроде переднего края администрирования.
Начал я с того, что выбрал один большой курс по DevOps и несколько хороших курсов по отдельным технологиям (Gitlab CI/CD, Ansible, Kubernetes). Я понимал, как важно выбрать хорошего учителя. В каком-то смысле это даже важнее выбора предмета. Мне очень понравилось, как излагает материал Nana Janashia. Плюсом стало то, что она преподает на английском, так что на язык сразу ложится вся нужная терминология. Я потом из любопытства просмотрел учебные материалы по DevOps с некоторых российских платформ, и был поражен тем, как много там воды и как мало структуры. В общем, Nana – one love, рекомендую.
DevOps-практики, как известно, требуют освоения длинного ряда инструментов, и если с каким-нибудь git можно экспериментировать практически на любой машине, то Nexus или Jenkins надо ставить на сервер. Они требовательны к ресурсам, и бесплатным t2.micro на AWS не обойтись. Конечно, можно получить 3 month trial от Google Cloud, но он потребуется позже для игр с managed Kubernetes. Так что я решил сделать из своего десктопа homelab. Дальше о том, что я сделал, с какими проблемами столкнулся и как их решил.
Аппаратная часть
Сам я работал почти только на iMac, а PC был у меня на подхвате. Я собрал PC больше от того, что заскучал по временам, когда посвящал сборке и настройке железа дни напролет, чем потому что он мне был действительно нужен. Тем не менее, мощная получилась машина: на AMD 5950X с Nvidia RTX 3080. Изначально памяти поставил только 16gb. Для сервера с несколькими виртуалками этого маловато, поэтому первым делом я добавил еще столько же. А надо было ставить все 64. Другим небольшим усовершенствованием стала установка HDMI dummy plug, которая заставляет систему думать, что к видеокарте подключен монитор. Это важно для подключения к удаленному рабочему столу.
По железу это все, больше никаких нововведений я не производил. В тот момент я уже планировал отъезд из России, так что десктоп был перевезен к знакомым, подключен и оставлен на неотапливаемом балконе. Я нашел несколько постов о том, что ничего плохого с ним произойти не должно, однако с наступлением зимы задумываюсь о том, как удаленно отключить вентиляторы в корпусе. Не так это просто, потому что в качестве базы я поставил ESXi 7.0.
Гипервизор
Причин, почему именно ESXi, было несколько: во-первых, VMware предлагает свободную лицензию, подходящую для моих целей, во-вторых, из всех гипервизоров я чаще всего сталкивался с VMware Workstation. Последний аргумент, конечно, слаб, но ESXi как я и предполагал, оказался очень добротным продуктом. Тем не менее, с ним пришлось повозиться.
Сначала выяснилось, что ESXi не имеет драйверов для моей сетевой карты. Это логично, ведь enterprise-class гипервизор совершенно не предназначен для того, чтобы ставить его на десктоп с геймерской материнкой. Счастье, что одни умельцы написали для Intel I225-V драйвер, а другие инструкцию о том, как патчить дистрибутив ESXi.
Дальше пришлось разобраться с тем, как обеспечить прямой доступ виртуалки к жесткому диску. Для этого надо зайти на ESXi по SSH (Host – Actions – Services – Enable SSH) и посмотреть название нужного диска в /vmfs/devices/disks/
. Затем запустить с соответствующими параметрами следующую команду: vmkfstools -z /vmfs/devices/disks/t10.ATA_____Hitachi_HDT725025VLA380_______________________VFL104R6CNYSZW Hitashi250.vmdk
. Дальше можно монтировать получившийся файл как диск для виртуальной машины.
Сетевые взаимодействия
Мой первоначальный план был прост – арендовать статичный IP-адрес и пользоваться функцией port forwarding для распределения трафика между виртуалками. Практически сразу стало ясно, что домашний роутер (даже перепрошитый на openWRT) дает очень скромные возможности. К тому же меня волновала безопасность. Не помешал бы хороший файерволл и Intrusion Detection System (IDS). Все, о чем я мог мечтать, я нашел в виде pfSense, а затем OPNsense.
Я использовал pfSense несколько месяцев, и единственное, что меня удручало в нем – сильно устаревший и не очень продуманный интерфейс. Простые действия требовали слишком много кликов. В какой-то момент я решил попробовать OPNsense, и остался уже совершенно доволен. Тем более по нему есть отличная книга от человека, который постоянно использует этот фаерволл в проде.
Так что вслед за первоначальным планом возник следующий: трафик приходит на домашний роутер и перенаправляется на OPNsense (DMZ). Там он проходит через файерволл, IDS и дальше поступает на reverse-proxy (HAproxy можно установить как плагин для OPNsense). Reverse-proxy в зависимость от прописанных правил, как правило основываясь на доменном имени, направляет трафик на ту или другую виртуальную машину.
Виртуальные машины
Раньше у меня в основном были сервера на Debian. Теперь мне показалось хорошей идеей получить опыт с Enterprise Linux. К счастью, у Red Hat есть Developer program, позволяющая бесплатно использовать RHEL со всеми наворотами. Единственная проблема с RHEL возникла, когда они ушли из России и видимо запретили обновления с российских айпишников. Проблема решилась поднятием tinyproxy на зарубежном сервере и прописыванием его в конфигах yum/dnf.
Именно на RHEL было решено поставить все DevOps-инструменты. Сначала я еще развлекался тем, что разворачивал приложения прямо на ОС, но довольно быстро понял, что контейнеры все-таки удобнее. В результате сейчас Jenkins, Grafana, Nexus и Gitlab крутятся в докере. Вместе они потребляют около 10gb RAM. В целом для этой виртуалки я выделил 14gb памяти и 6 ядер процессора. Наиболее прожорлив Gitlab, и именно его в принципе было ставить необязательно. Пользоваться вполне можно gitlab.com, поставив к себе на сервер только gitlab-runner. Но поскольку во многих компаниях gitlab хостится на своих серверах, мне хотелось попробовать поработать именно в self-hosted конфигурации.
Преимущества
Хорошие курсы по DevOps дают множество упражнений, но часто они будто существуют в вакууме: вот тебе простое приложение, сделай из него docker image, загрузи в репозиторий и задеплой. Я решил попробовать что-то более реальное. На моем Debian-сервере хостились сайты с LAMP-стэком. Я решил, что отличной идеей будет перенести их в docker и развернуть в Kubernetes. Homelab открывает бесконечное пространство для бесплатных экспериментов.
Учиться когда у тебя под рукой есть собственный сервер очень удобно. Понятно, что всегда можно арендовать все необходимое в облаке. Однако облачный провайдер принимает множество забот на себя, и для тебя они остаются за кадром. Кроме того, ты всегда должен будешь помнить о том, какие ресурсы используешь и сколько за них платишь. В результате проще после выполнения упражнения уничтожать все с чем работал. Может в этом и есть свои плюсы – это стимулирует освоение Terraform и Ansible – но мне homelab больше по душе.
Статья получилась несколько сумбурной, но если кого-то из junior’ов вроде меня она вдохновит на создание своей домашней лаборатории, я буду считать свою задачу выполненной. Более опытным инженерам буду благодарен за советы и указания на ошибки.
Комментарии (22)
saboteur_kiev
15.11.2022 03:07+1На моем Debian-сервере хостились сайты с LAMP-стэком. Я решил, что отличной идеей будет перенести их в docker и развернуть в Kubernetes.
Но почему?
Это же LAMP, не микросервисы на nodejs, не java, просто веб сервер, где не понимаю смысла разворачивать его в кубере. Масштабирование php?lyova Автор
15.11.2022 03:59+1Все, что я делаю с homelab, больше для обучения, чем для практически нужд. Nodejs там у меня тоже есть, но нагрузка на него и на apache так мала, что практического смысла в балансировщике нет. С радостью бы взялся за развертывание какого-нибудь приложения с микросервисной архитектурой, но не придумал пока задачу.
stitrace
15.11.2022 04:25+1Вероятно для практики с докером/кубером?
lyova Автор
15.11.2022 04:49+1Да. Идея была в том, чтобы перенести старые сайты на новые рельсы. Там сейчас сделано так, как было принято лет 10 назад. По докеру упражнения во всех моих курсах ну очень простые. А перенести mediawiki, mysql и один микросервис на nodejs в контейнеры, написать docker-compose.yaml это какая-никакая задача. Вот про кубер зря заикнулся. Соглашусь, что в этом особого смысла нет, даже учебного.
Busla
15.11.2022 12:31пришлось разобраться с тем, как обеспечить прямой доступ виртуалки к жесткому диску
зачем? вы же таким образом отказались от многих приятных плюшек виртуализации
lyova Автор
15.11.2022 14:50Помимо RHEL у меня в гипервизоре еще 4 виртуалки. В числе прочего я решил перенести в homelab свой Synology NAS. В нем стояло два больших диска, которые и дальше предполагалось использовать только для NAS.
А какие плюшки виртуализации Вы имеете в виду?
Busla
15.11.2022 20:27снапшоты, а вместе с ними и бэкапы каким-то инструментом для виртуализации
большая гибкость в управлении дисковым пространством - временно подселить другие ВМ и т.п.
pilot2k
15.11.2022 14:07а всего-то надо было AWS Free Tier использовать вместо того чтобы огород городить))))
Boti4ello
15.11.2022 14:26Спасибо за статью. Отдельный плюсик за Nana Janashia, столкнулся с ней когда искал какой нить курс по питону и потом многое у нее смотрел.
Где вы брали задачи для обучения? Ведь самое сложное - придумать как применить, если нет реальных задач. Да можно сидеть и выворачивать виртуалки, тесты и пайплайны хоть наизнанку, но пока нет четкого понимания зачем это делаешь - трудно идет... ИМХО.
Получилось устроиться DevOpsом ?
lyova Автор
15.11.2022 14:58Есть задания от самой Наны, но они простые. Много упражнений по разным DevOps/технологиям лежит здесь. Ну а по Кубернетесу я проходил вот этот курс: Certified Kubernetes Administrator (CKA) with Practice Tests, там с упражнениями все в порядке.
Пока не устроился на работу, только начинаю рассылать резюме.
anatolykern
16.11.2022 05:43+1Красота! Когда 10 лет назад готовился к VCDX делал аналогичную лабу на ESXi, главное было взять проц с поддержкой hardware virtualization и сетевую карту с родной поддержкой в ESXi с network offload. Дальше по максимуму памяти, несколько ТБ SATA в RAID, пару SSD для кэша и критичных данных и получилась весьма бюджетная система для полноценного home cloud на VCenter. На базовой ESXi можно поднимать и любые другие системы, делать сетевой iSCSI/NFS storage для вложенных виртуалок. Много разных virtual appliances там тестировал вместо физических железяк, перенимая опыт у CCIE'шников.
SKAIT
16.11.2022 12:11Я потом из любопытства просмотрел учебные материалы по DevOps с некоторых российских платформ, и был поражен тем, как много там воды и как мало структуры.
ЭхЪ, Что правда, то правда
Worky
16.11.2022 16:56А я голосую за PVE. Тем более на простом железе (ой, нет дров под май {хардварэ}): Там и контейнеры сразу готовы к использованию (с готовым каталогом ОС и отдельных продуктов), и софтоРЕЙД линуксовый, и средство бэкапа искаропки (а если с извращениями, то готовый дистр для того есть, ставится в виртуалку). И ставить затем можно как у себя дома, так и любой конторе (не нужно платить за лицензию).
lyova Автор
16.11.2022 18:15Если бы я выбирал что-то просто для поднятия домашних сервисов, то наверное остановился бы на PVE. У меня же основная цель была в приобретении навыков работы с entreprise решениями (поэтому ESXi и RHEL) и освоении DevOps-инструментов. Я исходил из того, что чем меньше будет упрощений, тем лучше. Можно запускать контейнеры в GUI, но лучше освоить команды docker в CLI, потому что именно их будут спрашивать на собеседовании. И если бэкап из коробки, то какая мотивация разбираться с тем, как это сделать без готовых решений? То есть мой выбор в этом полностью подчинялся целям, хотя я конечно не настаиваю, что он во всем верен.
Worky
17.11.2022 20:16Так ВМВАРЕ ушло с РФ - смысл в ваших навыках?? а выбор решений бэкапа ПВЕ не поможет при выборе бэкапа в есхи, совсем. Да и вееам ушла из рф.
Плюс ПВЕ в том, что там можно всегда залезть под капот - там обычный Дебиан. А в есхи под капотом чтото свое, закрытое и знания подкапотом вам кроме есхи нигде не пригодятся.
Mirzapch
Вот это не понял. Можно расшифровать?
Всегда пользовался mstsc /console, никаких вопросов не возникало.
lyova Автор
Да, мне надо было уточнить, что для доступа к рабочему столу Windows. Я использую для этого Parsec, он отказывался работать без dummy plug. Но даже если использовать AnyDesk, донгл решает проблемы с выбором высокого разрешения. Слышал, что их можно решить софтверно, но адаптер проще.
Ava256
Вы пробрасываете видеокарту в виртуальную машину? Без пробрасывания ни каких Dummy Plug для подключения к рабочему столу обычно не требуется.
lyova Автор
Да, все так. Из финального текста я вырезал абзац про пробрасывание видеокарты. Посчитал, что это немного не в тему изучения DevOps-инструментов. Без пробрасывания видеокарты Parsec не работает, так как ему нужен аппаратный encoder. А я большой поклонник этой программы - у меня 5к монитор и когда я использую ее, иногда забываю, что это удаленный рабочий стол: очень высокое разрешение и хороший отклик, хотя пинг до сервера от меня больше 50 мс.
Busla
У nVidia же в драйверах залочена работа игровых карт в ВМ.
Было бы интересно почитать, как вы всё это подружили.
lyova Автор
Насколько я знаю, залочен на игровых картах не полный проброс ее в виртуалку, а Shared Pass-Through Graphics. Это позволяет использовать одну карту как несколько физических, что, как я понимаю, служит для облачного гейминга. Такая возможность есть только у A100 и других серверных моделей.
Проблемы, с которыми я столкнулся были вызваны самим гипервизором. Когда я щелкал в ESXi по переключателю passthrough рядом с названием видеокарты появлялась надпись Enabled / Needs reboot, однако даже после перезагрузки ничего не менялось и карта оставалась невидимой для ОС.
Забыл, после чего конкретно карта заработала. Помню, что устанавливал vCenter и экспериментировал с настройками виртуальной машины.