Всем привет! Меня зовут Лина, я backend-разработчик в KTS.
В нашей компании развита система наставничества. Каждому сотруднику строится индивидуальный план развития, включающий в себя как soft skills, так и необходимые для работы технологии. Раз в полгода мы проводим ревью, и к следующему необходимо прокачать какие-то навыки из списка. Одной из моих задач для повышения было «Изучить Kubernetes».
В статье я:
Поделюсь опытом освоения этой технологии с точки зрения джуна, или человека, который не имеет большого опыта как в программировании, так и в вопросах раскатки приложений
Расскажу о препятствиях, с которыми столкнулась
Статья может быть полезна для новичков, начавших или уже изучающих Kubernetes. Надеюсь, мой опыт поможет вам построить свой план изучения или вдохновит вернуться к этому процессу.
Для лучшего понимания привожу свой опыт разработки до изучения Kubernetes: полгода production-разработки, учебные проекты МГТУ им. Н.Э. Баумана и курсы в Технопарке.
Что будет в статье:
Kubernetes, что это? ?
Давайте представим, что есть приложение, которое нужно отправить в продакшен и обеспечить к нему подключение, регулярно обновлять и поддерживать его работоспособность. Конечно, всё это легко, если просто поднять приложение на каком-то сервере. Можно настроить мониторинги, и они будут следить, что приложение поднято, обновлять, когда нужно.
Однако это сработает для одной копии приложения. А если нужно больше? Нагрузка увеличивается, нужны еще копии приложений, чтобы успевать обрабатывать все запросы. В таком случае нам нужен еще один сервер или виртуальная машина. А чем больше нагрузка, тем больше копий приложений нужно. Следовательно, возрастает сложность управления копиями приложений. Ведь при обновлении приложения нужно будет обновить каждую ее копию, а вручную сделать это сложно, иногда даже невозможно. Это приводит нас к необходимости использования систем оркестраторов, работа которых заключается как раз в том, чтобы эффективно поддерживать множество копий приложений, распределенных по разным серверам. Kubernetes — одна из таких систем.
Kubernetes следит за рабочим состоянием приложений и автоматизирует раскладку, поддержку и обновление. Его особенностью является декларативный подход: пользователь не говорит системе, что надо делать, а описывает, как она должна выглядеть. После этого Kubernetes приводит систему в нужный вид.
Зачем джуну-бэкендеру Kubernetes? ?
Нужно ли джуну этим заморачиваться — вопрос спорный.
С одной стороны, начинающему разработчику Куб может вообще не понадобиться. Особенно если инфраструктура уже настроена: разработчик запушил коммит, замёрджил, всё само разложилось. Логи посмотрел в отдельной вкладке, а ошибки раскладки починит админ, который и настроил всю систему.
Но вот вам несколько пунктов «зачем».
Для понимания работы инфраструктуры компании и проектов. Это одна из основных причин. Я считаю, что для видения общей картины бэкенд-разработчик должен знать, как работает среда, в которой запустят проект. В перспективе такое понимание поможет не только проектировать, но и в целом лучше писать код.
Для большей независимости от старших коллег. Конечно, джун вряд ли получит доступ к проду… Но разобравшись, вполне сможет взаимодействовать с dev-кластером. Можно самому заглянуть внутрь подов, запустить какую-то команду из консоли контейнера или перезапустить джобу.
Для перспективы и общее расширение кругозора. Если в будущем вам захочется перерасти в DevOps-инженера, понимание работы Кубера точно пригодится.
Под изучением Kubernetes я не имею ввиду изучить досконально и научиться поднимать кластер. Даже знание базовых вещей может помочь в понимании его работы.
Подготовка ?
Первое, что я сделала — подтянула знания в смежных областях. Как оказалось, на тот момент я еще не до конца понимала некоторые вопросы, и их незнание определённо мешало мне продвинуться.
1. Контейнеризация и Docker ?
Пожалуй, это основная тема, которую нужно знать перед обучением. И Kubernetes, и Docker используют технологию контейнеризации. На тот момент я уже активно использовала Docker для запуска каких-то сервисов, но не понимала, как строится эта технология: как собрать свой Docker-образ, как его доставить на сервер, слои и многое другое. Поэтому пришлось уделить некоторое время, чтобы разобраться.
Для этого я в основном читала статьи, например:
Изучаем Docker, часть 1 — серия статей про работу с Докером, которая когда-то помогла мне погрузиться в контейнеризацию.
2. Сети ?
Если проблему непонимания работы Docker можно обнаружить сразу, то недостаток в понимании сетей я осознала несколько позже. Возможно, сюда бы я отнесла не только сами сети, но и сети в linux, DNS, iptables. Когда я поймала себя на том, что не очень хорошо понимаю, как это работает, то поняла, как сильно это тормозит обучение.
Изучение Kubernetes ?
Бесплатные курсы ?
Когда мне поставили задачу начать изучать Куб, руководитель подготовил карту сокровищ список ресурсов для изучения. Там было много всего, но для начала я решила обратиться к курсам.
На тот момент было несколько бесплатных курсов на Coursera и на Stepik.
Честно, я потратила много времени на просмотр этих курсов, и это не дало мне ничего. Там долгие введения, много организационных роликов, и только через некоторое время начинается неспешное объяснение.
Сложно было еще потому, что курсы на английском, и не везде есть субтитры или помогающий текст — поэтому какие-то термины сложно уловить. Ещё там давались какие-то общие сведения без проверки заданий — ни автоматической, ни от преподавателей — что в конечном итоге лишало такую учёбу смысла.
Документация ?
Поняв, что бесплатные курсы никак не помогают, я решила обратиться к первоисточнику: официальной документации.
В целом, документация — ключ к изучению любой технологии. Так ты точно узнаешь про основные компоненты. Здесь даже есть свой минитренажёр.
Однако, читая документацию, я не могла сложить картину воедино. Читала статью за статьей, понимала, что такое поды, деплойменты, сервисы, но не могла сопоставить их вместе. А иногда натыкалась на какой-нибудь термин — и тратила 2 часа ушло на чтение того, что такое планировщик и как он устроен. При этом я ещё в сущности не понимала, что такое кластер, и как взаимодействуют компоненты.
Статьи в Интернете ?
Возможно, это первое, к чему следует обратиться. Наверное, наиболее дружелюбный для новичков подход — прочитать статью.
Изучать Куб по статьям оказалось намного приятнее. В отличие от документации, в них обычно выстроена структура «от простого к сложному» и «от общего к частному», что значительно облегчает понимание. Конечно, все зависит от статей. Примеры были довольно реалистичные, и статьи построены в виде руководства по раскладке какого-то приложения, что можно воспроизвести.
Минус — часто эти руководства заточены под частный случай и не разбирают общие вещи.
Вот несколько статей, к которым я обращалась
K8S для начинающих. Первая часть. В ней на примере Nginx показывают, как быстро можно поднять приложение и запустить его в локальном кластере. Доходчиво и понятным языком
Руководство по Kubernetes, часть 1: приложения, микросервисы и контейнеры. Чуть более сложное и подробное руководство. Рассказывается, как запустить в кластере приложение из нескольких сервисов, от начала до конца
Книга ?
Последнее, что я сделала — обратилась к книгам. Сначала большинство мне показались либо сложными, либо совсем не подходящими для новичков. Но потом я случайно наткнулась на «Kubernetes в действии» Марко Лукши.
В этой книге нет долгих введений и ненужных терминов. Если появляется понятие, прилагается ссылка на место в книге, где можно прочитать о нём. Есть связная структура. Всё это в совокупности помогает построить общую картину. Мне книга помогла узнать некоторые детали и в целом закрепить уже полученные знания.
Главная проблема ?
Теоретически я уже понимала, как всё работает, но на практике всё ещё почти ничего не могла. Конечно, я запускала учебные примеры из книги и из статей, но по большей части это было просто копирование и наблюдение за тем, как оно работает.
Тогда руководитель предложил идею: «Вот ты сейчас пишешь проект, разложи его в Kubernetes сама с нуля».
Я начала пробовать. Локально подняла minikube и пыталась в нём разложить проект. Minikube — это кластер-Kubernetes из одной ноды, который можно поднять на своем компьютере и попытаться что-то разложить.
Именно в этот момент я действительно начала закреплять знания. Когда решаешь задачу сам, то сталкиваешься с проблемами изучения. Например, если что-то не понял или не нашёл нужного решения в руководствах.
Самая большая сложность для меня была с настройкой ingress. Как раз тут я поняла, что плохо знаю работу сетей, и вернулась подтягивать это. Ещё была проблема с шаблонизатором Kustomize. Все примеры, которые я до этого пробовала, совсем не использовали шаблонизацию.
Я провела несколько часов в попытках разложить бота. Очень много экспериментировала, меняла манифесты, пробовала прокидывать некоторые параметры, изучала как сделать, чтобы конфиги пробрасывались как переменные окружения. И вот, наконец, бот разложился и правильно работал.
Тогда я уже чётко понимала структуру, могла решать какие-то проблемы, которые у меня происходили при раскладке в работе, а также в целом моё понимание многих процессов стало гораздо лучше. Хотя мне предстояло ещё многое изучить.
Советы от других DevOps-инженеров?
В статье мне хотелось рассказать свой путь изучения. Я пробовала совсем разные методы и ресурсы. Некоторые из них мне подошли, некоторые нет. До сих пор изучаю некоторые фичи, которые не освоила в начале. Знания применяю в работе и личных проектах.
В изучении мне помогали несколько наших девопсов. Вот пара наблюдений и советов от них:
Для меня самым трудным в понимании почему-то было осознание того, как работает expose приложений в Kubernetes вовне. Может быть, это было из-за недостатка обучающих ресурсов в то время, а может, из-за того, что не удавалось схватить какие-то ключевые моменты. Большинство туториалов были завязаны на облачные managed-решения, а мне хотелось в то время понять, как то же самое сделать самостоятельно. И только путем постоянных экспериментов с различными конфигурациями, технологиями, сопровождающиеся постоянным дебагом и бессонными ночами, удалось погрузиться в то, как всё работает внутри, и что на самом деле в себе скрывают те или иные абстракции в Kubernetes.
Игорь Латкин, cистемный архитектор KTS
Поможет практика, практика и еще раз практика. Познакомиться с документацией и уметь с ней работать, понять архитектуру Куба и его компоненты, а не просто как делать "kubectl apply". Углубиться в понимание tls/ssl — корневые/промежуточные/клиентские сертификаты, рантайм контейнеров. И всё-таки, конечно, просто больше практиковаться — со временем понимание всего вокруг придет.
Леонид Гвоздков, devops-инженер
Советы из комментариев к этой статье
Лекции на Youtube:
Если вы всё ещё не решили, как начать изучение, рекомендую пройти курс в нашей школе:
«Деплой приложений в Kubernetes». На курсе мы рассмотрим самые важные концепции, необходимые для управления кластерами любой сложности и научим применять эти знания на практике.
? Почитать про курс подробнее можно здесь: https://vk.cc/cn0ty6
С Наступающим! ?
Другие статьи про DevOps для начинающих:
Другие статьи про DevOps для продолжающих: