Как развертывать приложения в Kubernetes
Опубликовано: 2022-11-09Kubernetes — одна из самых популярных платформ автоматизации для развертывания, масштабирования и эксплуатации контейнеров приложений в кластере хостов или узлов.
В этой статье мы обсудим один из центральных объектов в Kubernetes: развертывание. Цель состоит в том, чтобы понять его поведение и способы его создания, обновления и удаления.
Что такое развертывание?
Развертывание — это один из объектов, используемых для запуска подов. Лучшие практики Kubernetes поощряют использование развертываний для приложений без сохранения состояния. Без развертывания вам пришлось бы вручную создавать, обновлять и удалять несколько модулей, что было бы утомительно и невыполнимо для многих модулей.
Развертывание объявляет один объект в YAML, который не только создает модули, но также обеспечивает их актуальность и работу. Вы также можете легко автоматически масштабировать свои приложения, используя развертывание в Kubernetes. Таким образом, развертывание используется для масштабирования, развертывания и отката версий ваших приложений в модулях.
Развертывание также сообщает Kubernetes, сколько копий пода мы хотим запустить, а Kubernetes позаботится обо всем остальном. Связанный контроллер создаст ReplicaSet из вашей конфигурации при создании развертывания. Контроллер, связанный с набором реплик, создаст серию подов из конфигурации набора реплик.
Преимущества использования развертывания вместо непосредственного создания ReplicaSet:
- История объекта: каждое изменение объекта (с помощью «применить» или «редактировать») создаст резервную копию предыдущей версии.
- Управление развертыванием и откатом: Вы можете вернуться к конфигурации в связи с предыдущим пунктом.
Создание развертывания
Есть два метода, которые мы можем использовать для создания развертывания 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: #Specifies the number of Pod Copies replicas: 3 #Selects the Pod to be managed by the deployment selector: #Matches the defined labels matchLabels: deploy: example template: metadata: #Specifies the labels on the Pod. labels: deploy: example spec: containers: - name: nginx image: nginx:1.20.2
В этом файле YAML после определения версии Kubernetes API, типа создаваемого объекта и имени развертывания есть раздел спецификации. В этом разделе вы сначала определите ключ реплик, который указывает количество экземпляров Pod, которые развертывание должно поддерживать активными.
Используйте метку селектора, чтобы идентифицировать модули в развертывании. Для этого вы можете использовать метку развертывания, которая сообщает, что все модули, соответствующие этим меткам, сгруппированы в развертывании.
После этого у вас есть объект шаблона, в котором у вас есть модель Pod внутри вашей спецификации развертывания. Когда развертывание создает модули, оно создает их с использованием этого шаблона. Спецификацию обычного модуля можно найти под ключом шаблона.
При таком развертывании образы Nginx с метками будут развернуты в модулях. Кроме того, вы также должны быть осторожны в этом вопросе, а Pod — это единица масштабируемости в Kubernetes, поэтому вам нужно подумать о шаблоне, который вы хотите использовать, если вы помещаете несколько контейнеров в один и тот же Pod.
Затем примените new_deployment.yaml
-файл new_deployment.yaml, используя следующую команду:
kubectl apply -f new_deployment.yaml
Через несколько секунд вы можете получить статус развертывания, используя следующее:
kubectl get all

Получить и обновить развертывание
Обратите внимание, что у вас есть созданные модули, развертывание, а также набор реплик. Таким образом, развертывание всегда создает набор реплик и управляет им. Теперь вы можете использовать следующую команду для описания развертывания:

kubectl describe deployment nginx-deployment

Теперь у вас есть полное описание развертывания. Он выделяет стратегию, используемую для создания/перестроения модулей, когда обновление было определено как RollingUpdate.
Стратегия RollingUpdate позволяет упорядоченную миграцию одной версии приложения на более новую версию. Это стратегия по умолчанию, используемая в Kubernetes.
В дополнение к этому, у нас также есть следующие стратегии:
- Воссоздать: останавливает запущенные в данный момент экземпляры пода и «воссоздает» их с новой версией;
- Синий/зеленый: эта стратегия создает две отдельные, но идентичные среды. В синей среде приложение работает как есть, тогда как в зеленой среде приложение работает так, как будет в будущем;
- Canary: стратегия развертывания, при которой подгруппа пользователей участвует в добавочном выпуске приложения или службы.
Если вы выберете «скользящее обновление», вы можете настроить его поведение в отношении желаемого количества реплик.
-
maxSurge
позволяет указать (в процентах или абсолютных значениях), сколько модулей Pod может быть создано в дополнение к количеству настроенных реплик. -
maxUnavailable
позволяет указать (в процентах или абсолютных значениях), сколько подов может быть «недоступно» во время обновления, в зависимости от количества настроенных реплик.
В зависимости от вашего приложения и средства автомасштабирования эти конфигурации позволят вам обеспечить качество обслуживания или ускорить развертывание.
Затем вам нужно масштабировать модули до 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 приложение называется релизом. Он связан с чартом, т. е. набором конфигурационных файлов в формате YAML, содержащих глобальные переменные и шаблоны, описывающие ресурсы Kubernetes.
Вывод
Развертывание — важный объект Kubernetes. Поскольку великая сила подразумевает большую ответственность, вы должны быть осторожны при ее настройке, иначе вы рискуете столкнуться с неожиданным поведением. Чтобы узнать больше о конфигурациях развертывания, вы можете обратиться к документации Kubernetes.
Вы также можете изучить некоторые из лучших руководств по Kubernetes, чтобы научиться с нуля и стать экспертом.