Як розробнику порозумітись з 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 є незліченна кількість.
Тому пропоную перелік вправ, що допоможуть краще зрозуміти, як він працює:
- Спробуйте зробити різні деплойменти одного і того ж самого застосунку, але в різних namespaces. Наприклад, один namespace назвіть dev, а інший — prod.
- Розгорніть Horizontal Pod Autoscaler, щоб він міг скейлитись відносно споживання CPU. Для тесту скейлінгу можна використати image busybox.
- Напишіть для свого застосунку health checks і використовуйте їх для liveness та readiness probe.
- Спробуйте розташувати поди в різних воркерах через taints and tolerations.
- Напишіть для своїх подів initContainer, який, наприклад, може просто створювати файл з фразою «Hello world». Цей файл зберігатиметься всередині основного контейнера, однак для цього ще треба правильно налаштувати маунти.
- Встановіть helm на локальну машину, створіть чарт для власного застосунку та розгорніть його в Kubernetes.
Цих вправ достатньо, щоб будь-який розробник міг зорієнтуватись, як працює Kubernetes в його конкретному комерційному випадку.
На цьому все! Пишіть у коментарях, як би ви починали свій шлях в Kubernetes або ж як ви його вже пройшли 🙂
15 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів