Всем привет! Меня зовут Лина, я 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 часа ушло на чтение того, что такое планировщик и как он устроен. При этом я ещё в сущности не понимала, что такое кластер, и как взаимодействуют компоненты.

Статьи в Интернете ????

Возможно, это первое, к чему следует обратиться. Наверное, наиболее дружелюбный для новичков подход — прочитать статью. 

Изучать Куб по статьям оказалось намного приятнее. В отличие от документации, в них обычно выстроена структура «от простого к сложному» и «от общего к частному», что значительно облегчает понимание. Конечно, все зависит от статей. Примеры были довольно реалистичные, и статьи построены в виде руководства по раскладке какого-то приложения, что можно воспроизвести.
Минус — часто эти руководства заточены под частный случай и не разбирают общие вещи.

Вот несколько статей, к которым я обращалась

Книга ????

Последнее, что я сделала — обратилась к книгам. Сначала большинство мне показались либо сложными, либо совсем не подходящими для новичков. Но потом я случайно наткнулась на «Kubernetes в действии» Марко Лукши. 

В этой книге нет долгих введений и ненужных терминов. Если появляется понятие, прилагается ссылка на место в книге, где можно прочитать о нём. Есть связная структура. Всё это в совокупности помогает построить общую картину. Мне книга помогла узнать некоторые детали и в целом закрепить уже полученные знания.

Главная проблема ????

Теоретически я уже понимала, как всё работает, но на практике всё ещё почти ничего не могла. Конечно, я запускала учебные примеры из книги и из статей, но по большей части это было просто копирование и наблюдение за тем, как оно работает. 

Тогда руководитель предложил идею: «Вот ты сейчас пишешь проект, разложи его в Kubernetes сама с нуля». 

Я начала пробовать. Локально подняла minikube и пыталась в нём разложить проект. Minikube — это кластер-Kubernetes из одной ноды, который можно поднять на своем компьютере и попытаться что-то разложить. 

Схема кластера MiniKube
Схема кластера MiniKube

Именно в этот момент я действительно начала закреплять знания. Когда решаешь задачу сам, то сталкиваешься с проблемами изучения. Например, если что-то не понял или не нашёл нужного решения в руководствах. 

Самая большая сложность для меня была с настройкой ingress. Как раз тут я поняла, что плохо знаю работу сетей, и вернулась подтягивать это.  Ещё была проблема с шаблонизатором Kustomize. Все примеры, которые я до этого пробовала, совсем не использовали шаблонизацию.

Я провела несколько часов в попытках разложить бота. Очень много экспериментировала, меняла манифесты, пробовала прокидывать некоторые параметры, изучала как сделать, чтобы конфиги пробрасывались как переменные окружения. И вот, наконец, бот разложился и правильно работал.

Тогда я уже чётко понимала структуру, могла решать какие-то проблемы, которые у меня происходили при раскладке в работе, а также в целом моё понимание многих процессов стало гораздо лучше. Хотя мне предстояло ещё многое изучить.

Советы от других DevOps-инженеров????

В статье мне хотелось рассказать свой путь изучения. Я пробовала совсем разные методы и ресурсы. Некоторые из них мне подошли, некоторые нет. До сих пор изучаю некоторые фичи, которые не освоила в начале. Знания применяю в работе и личных проектах.

В изучении мне помогали несколько наших девопсов. Вот пара наблюдений и советов от них: 

Для меня самым трудным в понимании почему-то было осознание того, как работает expose приложений в Kubernetes вовне. Может быть, это было из-за недостатка обучающих ресурсов в то время,  а может, из-за того, что не удавалось схватить какие-то ключевые моменты. Большинство туториалов были завязаны на облачные managed-решения, а мне хотелось в то время понять, как то же самое сделать самостоятельно. И только путем постоянных экспериментов с различными конфигурациями, технологиями, сопровождающиеся постоянным дебагом и бессонными ночами, удалось погрузиться в то, как всё работает внутри, и что на самом деле в себе скрывают те или иные абстракции в Kubernetes.

Игорь Латкин, cистемный архитектор KTS

Поможет практика, практика и еще раз практика. Познакомиться с документацией и уметь с ней работать, понять архитектуру Куба и его компоненты, а не просто как делать "kubectl apply". Углубиться в понимание tls/ssl — корневые/промежуточные/клиентские сертификаты, рантайм контейнеров. И всё-таки, конечно, просто больше практиковаться — со временем понимание всего вокруг придет.

Леонид Гвоздков, devops-инженер

Советы из комментариев к этой статье


Если вы всё ещё не решили, как начать изучение, рекомендую пройти курс в нашей школе:
https://metaclass.kts.studio/kubernetes

С Наступающим! ????

Комментарии (10)


  1. AKomarov
    29.12.2022 16:29
    +3

    на ютьюбе есть неплохие лекции по куберу:
    ADV-IT
    Артур Крюков


    1. lock87
      30.12.2022 15:16

      Круто, спасибо!

      Добавим в статью в конце


  1. CrzyDocTI
    29.12.2022 18:01
    +2

    рекомендую Слёрм:

    https://www.youtube.com/playlist?list=PL8D2P0ruohOA4Y9LQoTttfSgsRwUGWpu6

    когда-то они еще и превосходные статьи писали, сейчас читать - только время тратить.


    1. lock87
      30.12.2022 15:16

      Спасибо!

      Внесём в статью


  1. Fitrager
    29.12.2022 18:53
    +1

    Я начинал с ADV-IT. Потом курсы Slurm. Потом пытался перенести текущую инфраструктуру в Kubernetes и практика это лучший способ понять Kubernetes.Курсы по Udemy англоязычные проходил, но там не самые актуальные знания даются.


    1. lock87
      30.12.2022 15:16

      Спасибо!

      Добавим как в раздел «Советы от читателей»


  1. UnclShura
    29.12.2022 19:13
    +7

    Конфигурация Кубера - аццкий ад. Вместо просто тупо UI предлагается выучить как писать связанную (!) конфигурацию в текстовом редакторе без всякой поддержки. Предлагается пользоваться командной строкой для управдения, редактирования конфигурации и мониторинга. Открою вам тайну, граждане, kubectl не для людей. Он для приложений, которые по-идее должны обеспечивать UI. Да UI обертки есть, но не из коробки и ооочень далекие от WYSIWYG. Я что-то не знаю ни одной, где-бы в один прекрасный момент не появился-бы диалог редактирования Yaml.

    Связь между объектами... в текстовых файлах... редактировать руками... Ну да, ну да. Ошибся в labels - нет ошибок, но ничего не работает. Ой, а тут имя секрета надо... а оно относится к внутренним secret store Kubernetes или к секретам GKE импортированным через внешние secret storage? И много-много такого-же.

    Отдельные лучи ненависти Gateway/VirtualService - если не работает логов нет, если вы не админ всея кластера. А я не админ! Я админ в своем неймспейсе, и даже default не вижу.

    А дальше больше если у вас не один жалкий вэб сервачок (пусть даже масштабирующийся на 100500 инстансов) а меш микросервисов. Руками-ж каждый писать неохота - слишком одинаковые. Ну так helm/tanka в помощь. А вот теперь скажите почему 1) опять свзязь между объектами руками 2) для темплейтов выбран самый извращенный, самый нечитаемый, самый никому неизвестный язык разметки?

    Вобщем извините, если кого за живое задел, но накипело. Как будто и небыло тех 20-30 лет развития UI/UX и мы опять вернулись во времена начала CP/M / IBM360 / PDP11


  1. mSnus
    29.12.2022 22:09

    И уважаемый Джун потом пишет в резюме: "знаю K8s", более того, он в этом и сам уверен.

    А потом оказывается, что надо вообще хорошо знать Linux, например, что есть разница на какие дистрибутивы Linux ставить, разными файловыми системами, контейнерными подсистемами и сетевыми подсистемами, что без Анзибля и пары дашбордов этим всем управлять невозможно...


    1. Graid
      30.12.2022 12:35

      Думается мне от джуна бэка не ожидают чего-то особенного при виде k8s. Имеет общее представление уже хорошо и зачастую достаточно


  1. gelerum
    30.12.2022 13:46
    -2

    По сути сказано, что надо читать документацию и пытаться зюнастромть все самому на своем личном проекте и только. Ну... Бесполезная ведь статья.