Kubernetes є однією з найпопулярніших платформ для автоматизації процесів розгортання, масштабування та керування контейнеризованими додатками в кластері хостів або вузлів.
Ця стаття детально розгляне один з ключових об’єктів Kubernetes – розгортання (Deployment). Ми дослідимо його функціональність, а також методи його створення, оновлення та видалення.
Що таке розгортання?
Розгортання є важливим об’єктом, що використовується для запуску модулів (Pod). Рекомендованою практикою Kubernetes є використання розгортань для додатків, які не зберігають стан (stateless). Без розгортання, необхідність вручну створювати, оновлювати та видаляти велику кількість модулів стає обтяжливою і часто непрактичною, особливо при роботі з великою кількістю контейнерів.
Розгортання представляє собою єдиний об’єкт, описаний у YAML-файлі, який не тільки створює модулі, але й гарантує їхню актуальність та працездатність. Крім того, розгортання в Kubernetes дозволяє автоматично масштабувати ваші додатки. Таким чином, розгортання слугує для масштабування, розгортання нових версій та відкату до попередніх версій ваших програм у Pod.
Розгортання інформує Kubernetes про необхідну кількість копій Pod, а Kubernetes вже забезпечує їхнє створення та керування. Контролер, пов’язаний з розгортанням, створює ReplicaSet на основі вашої конфігурації. А контролер ReplicaSet, в свою чергу, створює необхідну кількість модулів згідно з конфігурацією ReplicaSet.
Переваги використання розгортання замість безпосереднього створення ReplicaSet:
- Збереження історії об’єкта: кожна зміна, внесена до об’єкта (через команди “apply” або “edit”), створює резервну копію попередньої версії.
- Керування розгортанням та відкатом: ви маєте можливість повернутися до попередньої конфігурації, використовуючи збережені версії.
Створення розгортання
Існують два основні методи для створення розгортання в Kubernetes:
Імперативний метод
API Kubernetes надає можливість використовувати більш прямий, імперативний підхід. Він не вимагає використання файлів конфігурації або маніфестів у форматі YAML. Цей метод полягає в тому, що ви просто вказуєте, що потрібно зробити, а Kubernetes бере на себе відповідальність за визначення конкретних дій для досягнення заданого результату.
Для використання імперативного методу, достатньо скористатися командою, наведенною нижче:
kubectl create deployment nginx-deployment --image nginx --port=80
Декларативний метод
У декларативному методі, ви повинні детально описати необхідну конфігурацію. Kubernetes, у свою чергу, просто зчитує ваші визначення та створює об’єкти відповідно до них.
Для використання декларативного розгортання, необхідно створити YAML-файл.
YAML-файл для розгортання з назвою new_deployment.yaml:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: #Вказує кількість копій Pod replicas: 3 #Визначає Pod, якими керує розгортання selector: #Відповідає заданим міткам matchLabels: deploy: example template: metadata: #Визначає мітки на Pod. labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
У цьому YAML-файлі, після визначення версії Kubernetes API, типу об’єкта, що створюється, та назви розгортання, йде розділ “spec”. У цьому розділі ви спочатку визначаєте ключ “replicas”, який задає кількість екземплярів Pod, які розгортання має підтримувати активними.
Мітка “selector” використовується для ідентифікації модулів, що належать до цього розгортання. Для цього ви можете використовувати мітку “deploy”, яка вказує, що всі модулі, які мають цю мітку, об’єднуються в одне розгортання.
Далі, ви бачите об’єкт “template”, в якому описана модель Pod для вашого розгортання. Коли розгортання створює модулі, вони створюються з використанням цього шаблону. Специфікація звичайного Pod знаходиться під ключем “template”.
Згідно з цим розгортанням, образи Nginx з відповідними мітками будуть розгорнуті в Pod. Важливо пам’ятати, що Pod є одиницею масштабування в Kubernetes, тому варто ретельно продумати шаблон, який ви використовуєте, особливо якщо ви розміщуєте декілька контейнерів в одному Pod.
Далі, застосуйте YAML-файл new_deployment.yaml, виконавши наступну команду:
kubectl apply -f new_deployment.yaml
За кілька секунд ви зможете перевірити статус розгортання, скориставшись наступною командою:
kubectl get all
Отримання та оновлення розгортання
Зверніть увагу, що вже створено модулі, розгортання, а також набір реплік. Отже, розгортання завжди створює набір реплік і керує ним. Для отримання детальної інформації про розгортання, можна скористатися командою:
kubectl describe deployment nginx-deployment
Таким чином ви отримуєте повний опис розгортання. З нього ви можете дізнатись про стратегію, яка використовується для створення/оновлення модулів, де RollingUpdate встановлено як стратегію оновлення.
Стратегія RollingUpdate забезпечує плавний перехід від однієї версії програми до нової. Це стандартна стратегія оновлення, яку використовує Kubernetes.
Окрім цього, існують також інші стратегії оновлення:
- Recreate: ця стратегія завершує роботу існуючих екземплярів Pod і “відтворює” їх з новою версією;
- Синій/зелений: ця стратегія передбачає створення двох окремих, але ідентичних середовищ. У синьому середовищі програма працює у поточному стані, а в зеленому середовищі – так, як це буде у майбутньому;
- Canary: стратегія розгортання, де поступове випускання нової версії програми або сервісу відбувається на підмножині користувачів.
При виборі стратегії “RollingUpdate” ви можете налаштувати її поведінку щодо бажаної кількості реплік.
- maxSurge дозволяє вказати (у відсотках або абсолютних значеннях), на скільки більше модулів може бути створено на додаток до налаштованої кількості реплік.
- maxUnavailable дозволяє вказати (у відсотках або абсолютних значеннях), скільки модулів можуть бути “недоступними” під час оновлення, відносно до налаштованої кількості реплік.
Залежно від особливостей вашого додатку та налаштувань автомасштабування, ці параметри дозволять вам оптимізувати якість обслуговування (QoS) або пришвидшити процес розгортання.
Далі, ви можете масштабувати кількість Pod до 10 та змінити тег зображення Nginx на останню версію.
kubectl scale deployment nginx-deployment --replicas=10
Зверніть увагу, що на початку ми маємо 5 контейнерів, а з 10 контейнерів доступні 5.
За кілька секунд виконайте команду:
kubectl get all
Ви побачите, що всі контейнери створено і вони знаходяться в робочому стані.
Видалення вашого розгортання
Для видалення розгортання в Kubernetes, скористайтесь наступними командами:
kubectl delete deploy nginx-deployment kubectl delete deploy new_deployment.yaml
Helm: Спрощення процесу розгортання
У випадках, коли потрібно розгорнути складні додатки, які використовують десятки або навіть сотні ресурсів Kubernetes, інструмент kubectl стає недостатнім. Саме тому був розроблений Helm. Helm – це менеджер пакетів для Kubernetes, який базується на kubectl і спрощує процес розгортання додатків.
У термінології Helm, додаток називається “випуском” (release). Він пов’язаний з “діаграмою” (chart) – набором конфігураційних файлів у форматі YAML, що містять глобальні змінні та шаблони, які описують ресурси Kubernetes.
Висновок
Розгортання є важливим об’єктом Kubernetes. Важливо бути обережним під час його налаштування, щоб уникнути непередбачуваної поведінки. Для подальшого вивчення конфігурацій розгортання, радимо звертатися до офіційної документації Kubernetes.
Також, ви можете ознайомитися з навчальними матеріалами Kubernetes, щоб поглибити свої знання та стати досвідченим користувачем.