Як розробнику порозумітись з Kubernetes. Покроковий гайд

Усі статті, обговорення, новини про DevOps — в одному місці. Підписуйтеся на DOU | DevOps!

Ні для кого не секрет, що Kubernetes часто використовується у сучасних ІТ-продуктах. А ще він часто стає предметом мемів, мовляв, це черговий розділ чорної магії для айтівців.

Та чи настільки складно в ньому розібратись? У статті я дам практичні поради, як зробити це покроково та правильно. Щоб у разі відсутності девопса або клауд-інженера на проєкті можна було справитися самостійно.

Пререквізити

Щоб зрозуміти, як працює Kubernetes, найголовніше опанувати контейнеризацію Docker.

Варто відповісти собі на такі питання:
1. Що таке Docker-файл та як написати його для вашого сервісу/застосунку?
2. Навіщо потрібен port mapping в контейнерах?
3. Як замаунтити директорію на хостовій машині до контейнера?
4. Як написати Docker Compose файл і запустити його?

Якщо ви знаєте, як відповісти на ці питання стосовно свого проєкту або сервісу — вітаю! Цього достатньо, аби розібратись з азами Kubernetes. Окрім того, раджу озброїтись документацією до нього, адже вона насправді напрочуд вичерпна.

В цьому гайді не буде детальних пояснень, які команди треба використовувати для дебагінгу чи для деплою. Адже тоді це була б повноцінна лабораторна робота відповідного розміру 🙂

Крок 1. Сетап середовища для роботи

В більшості відео та статтях на цю тему рекомендують спочатку розгорнути на локальній машині Minikube — порізаний кластер, який може розгортатись тільки на одному сервері (вашій локальній машині) з дещо обрізаним функціоналом повноцінного Kubernetes.

Однак виходячи з досвіду роботи зі своїми менті, я б не радив так починати.

По-перше, встановлення Minikube вимагає додаткового розгортання віртуальної машини, що не є хорошим рішенням, коли у вас слабкий ноутбук. Окрім того, на машинах з Windows Minikube не завжди вдається встановити з першого разу. Без знань налаштування віртуалізації можна витратити досить багато часу на дебагінг і забити на вивчення Kubernetes, навіть його не почавши.

По-друге, Minikube — це одно-нодовий кластер, а отже погратись із закріпленням контейнерів (подів) до нод не вийде.

Які альтернативи?

На мій погляд, хорошим рішенням є K3D-дистрибутив. Це той же легкий за розмірами та розгортанням K3S, однак сам він запускається всередині Docker-контейнеру. Перевагою такого дистрибутиву є те, що він підтримує керування багатьма нодами, які по суті є контейнерами.

Щоб його встановити, достатньо мати на локалці Docker Desktop та слідувати інструкціям в офіційній документації до K3D. Також не забудьте перед цим встановити kubectl.

Крок 2. Docker Compose файл для вашого сервісу

Наступний крок — написання Docker Compose і Docker-файлу для сервісу. Ним може бути простий Python-мікросервіс, який віддає Hello world при зверненні до API. Але якщо ви робитимете власний сервіс, було б непогано створити endpoint /health, щоб отримати можливість гратись в Kubernetes з health checks.

Те саме можна зробити на будь-якій зручній мові. Та головна мета цього кроку — написати Docker Compose файл, який підіймав би без Kubernetes один контейнер з вашим повністю робочим сервісом. Це необхідно для подальшого дебагінгу — щоб не було сумнівів, що ваш код працює.

Крок 3. Міграція вашого сервісу на Kubernetes

Тепер можна створити свій перший об’єкт у Kubernetes, а саме под. Це абстракція, яка відповідає найменшій одиниці вашого застосунку. На початку його іноді прирівнюють до контейнера, але це не так. Адже сам по собі под може мати кілька контейнерів, а також багато інших корисних штук. Наприклад, initContainer, readiness and liveness probes або ж Lifecycle hooks.

Приблизно так може виглядати ваш YAML-файл із подом:

apiVersion: v1

kind: Pod

metadata:

  name: hello-world-pod

  labels:

    app: backend

spec:

  containers:

  - name: PyHelloWorld

    image: PyHelloWorld:latest

    ports:

    - containerPort: 80

Після цього напишіть в терміналі команду:

kubectl apply -f your_awesome_manifest.yaml
Ваш перший под успішно розгорнуто в кластері!


Щоб отримати доступ до вашого поду, раджу використати команду для port forwarding:

kubectl port-forward pod/my-simple-pod 8080:80
Таким чином можна отримати доступ до контейнера ззовні.

Крок 4. Масштабування сервісу

Kubernetes створений для ефективного масштабування сервісів, тому ускладнимо задачу. Перепишемо под на деплоймент-абстракції, яка дозволяє розгорнути кілька подів одночасно, а також дає можливість самовідновлення подів (рестарту) у разі їхнього виходу з ладу.

Ось як може виглядати маніфест деплойменту для вашого сервісу:

apiVersion: apps/v1

kind: Deployment

metadata:

  name: hello-world-deployment

spec:

  replicas: 3

  selector:

    matchLabels:

      app: backend

  template:

    metadata:

      labels:

        app: backend

    spec:

      containers:

      - name: PyHelloWorld

        image: PyHelloWorld:latest

        ports:

        - containerPort: 80

Але виникає логічне питання. У нас тепер аж три поди, як балансувати навантаження між ними? Чи можна зробити єдину точку входу для усіх трьох?

Допомогти з цією задачею зможе сервіс SVC — мережевий об’єкт Kubernetes, що надає постійну точку доступу до сервісу. Вони бувають різних типів, кожен з яких по-своєму особливий та корисний. Розгорнімо сервіс типу Cluster IP, оскільки він надає нам внутрішньокластерну постійну IP-адресу, а також за замовчуванням балансує навантаження за принципом round-robin:

apiVersion: v1

kind: Service

metadata:

  name: hello-world-service

spec:

  selector:

    app: backend

  ports:

    - port: 80

      targetPort: 80

  type: ClusterIP

Однак як тепер отримати доступ до наших сервісів? Можна зробити це двома способами: або використати port forwarding як у минулому кроці, або розгорнути простий под з Ubuntu image, зайти в нього і спробувати через curl робити запити на ваш кластер IP.

Підказка: всі SVC мають власні внутрішньокластерні лінки.

Вуаля! Ви розгорнули більш-менш повноцінний застосунок в Kubernetes!

Що далі

Однак розгорнути деплоймент з сервісом вашого застосунку — це лише початок, а загалом фіч для опанування Kubernetes є незліченна кількість.

Тому пропоную перелік вправ, що допоможуть краще зрозуміти, як він працює:

  1. Спробуйте зробити різні деплойменти одного і того ж самого застосунку, але в різних namespaces. Наприклад, один namespace назвіть dev, а інший — prod.
  2. Розгорніть Horizontal Pod Autoscaler, щоб він міг скейлитись відносно споживання CPU. Для тесту скейлінгу можна використати image busybox.
  3. Напишіть для свого застосунку health checks і використовуйте їх для liveness та readiness probe.
  4. Спробуйте розташувати поди в різних воркерах через taints and tolerations.
  5. Напишіть для своїх подів initContainer, який, наприклад, може просто створювати файл з фразою «Hello world». Цей файл зберігатиметься всередині основного контейнера, однак для цього ще треба правильно налаштувати маунти.
  6. Встановіть helm на локальну машину, створіть чарт для власного застосунку та розгорніть його в Kubernetes.

Цих вправ достатньо, щоб будь-який розробник міг зорієнтуватись, як працює Kubernetes в його конкретному комерційному випадку.

На цьому все! Пишіть у коментарях, як би ви починали свій шлях в Kubernetes або ж як ви його вже пройшли 🙂

👍ПодобаєтьсяСподобалось9
До обраногоВ обраному11
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Розумійтеся звісно, але не забувайте що від отетого порозуміння розробників з кубернетісом після прочитання пари мануалів в інтернеті, прибирати завжди потрібно іншим 🥲

Ну так давайте лікувати зуби без стоматолога, ремонтувати двигун авто без механіка, усувати протікання унітазу без сантехніка. Нащо нам всі ці чуваки, коли ми майстри на всі руки? Чи може все таки питання в якості виконання робіт людиною з відповідною спеціалізацією і знаннями? Статтю навіть не читав, бо вже заголовок відганяє українськими best practice: як повішати все на одну людину, щоб не дай боже компанія не витратилась на когось ще...

тебе взагалі ще рік тому альтман заобсолітив, хай собі погризуть свій кактус пару років попишуть хелмчарти по¨буться зі скейлінгом. Зара простіше піцерію відкрити ніж довести щось. Через рік просто скажеш, що ти ж попереджав :)

Чесно кажучи, першу частину комента от взагалі не зрозумів...

Ну ти ж якби без 5хв автоматизований.. копайлот в ажур порталі в куточку що ще не бачив? Це твій наступник 😅

Єдине шо шкода що перед тим як тебе знову найняти бо розробник з копайлотом вияляється не витягує, будуть скорочення бо розробник порозумівся з копайлотом.... і торкнувся сили! Добре ще якщо розробник, я вже від всяких безробітних дівчаток і пмів статті про «як легко в кубер і тераформ» бачив

Ну таке, автоматизація автоматизацією, але все одно потрібна жива людина як мінімум за всім наглядати... Як не крути, а змащувати робота все одно комусь треба)

я то всіма клавіатурами згоден але от чели тіпа надели, пічая й безоса поки що активно змащують хіба дорогу на вихід, за пару місяців ця мода дойде до манагерів решти треш-компаній з претензією на «we are market leaders in anything».

Стаття цікава, лише постає питання, навіщо розробнику ДевОпсові технології?

А це чисто українська фіча: навалити все на одну людину, щоб не витрачати бабло на якогось девопса. А то як хизуватись, так компанія крутить ледь не мільярдами, а як по факту — жлобиться найняти необхідного спеца всього на 3к баксів в місяць.

Колись джавістів схиляли до джаваскриптоложестсва, типу, fool-стек.

Minikube — це одно-нодовий кластер

Не правда. Деталі: minikube.sigs.k8s.io/...​ocs/tutorials/multi_node

Які альтернативи?

Найкраща альтернатива — це kind, який розробляють автори Kubernetes і на ньому ж його і тестують. Для продакшн деплоя можна також глянути в сторону Talos Linux (не бийте за русню).

Наступний крок — написання Docker Compose

Навіщо вам для кубера докер-композ файл? От навіщо?
Якщо кому цікаво, як конвертувати готовий компоуз-файл в маніфест для кубера, то для цього є аппка Kompose.

оскільки він надає нам внутрішньокластерну постійну IP-адресу

Не надає. Це віртуальна адреса, яка існує тільки в рамках кластера. Адреса вибирається динамічно з пулу вільних адрес.

Можна зробити це двома способами

Як мінімум в мінікубі це роблять через команду kubectl proxy, а в повноцінних енвах це роблять через Інгресс контроллер або новий Гейтвей АПІ.

Розгорніть Horizontal Pod Autoscaler, щоб він міг скейлитись відносно споживання CPU.

Для того, щоб HPA банально працював, то потрібно встановити Metrics Server (для прода ще і сертифікати підкинути) і налаштувати ресурси та ліміти для ваших сервісів.

І, накінець,

Як розробнику порозумітись з Kubernetes.

Просто потрібно прочитати якусь розумну книжку по куберу і все. Від себе рекомендую:

Brendan Burns, Joe Beda, Kelsey Hightower — Kubernetes: Up and Running
Alan Hohn — The Book of Kubernetes

Ну автор просто награфоманив, просто переказавши зміст парочки базових туторіалів. На питання «як порозумітися» ця стаття не відповідає. Хоча відповідь досить проста — щоб порозумітися із Кубером треба почати його вчити і з ним працювати.

Не надає. Це віртуальна адреса, яка існує тільки в рамках кластера. Адреса вибирається динамічно з пулу вільних адрес.

Це не зовсім так, ніхто не заважає видавати білі адреси сервісам (це питання реалізації). Також цю адресу можна дійсно назвати постійною, оскільки вона буде закріплена за сервісом на весь час його існування. IP-адреси не обов’язково роздаються випадково з пулу — їх можна задати явно при створенні сервісу.

Ну і автор забув додати, що

round-robin

буде на L4 рівні, а це не дуже ефектино для більшості додатків.

Цих вправ достатньо, щоб будь-який розробник міг зорієнтуватись, як працює Kubernetes в його конкретному комерційному випадку

на мою думку цих вправ достатньо виключно щоб щось зламати. На мою думку, розробники повинні починати своє знайомство з Kubernetes з екзіт кодів, сигналів і усіх видів проб. Без цього немає сенсу рухатись далі.

Підписатись на коментарі