Как развернуть стеки Docker Compose в Kubernetes с помощью Kompose
Docker Compose позволяет вам определять стеки контейнеров, которыми вы можете управлять коллективно. Это относительно простой инструмент, изначально предназначенный для локальных установок Docker.
Kubernetes — это оркестратор контейнеров, который поставляется с собственным набором инструментов и файлами манифеста. Обычно он считается более сложным, чем обычный рабочий процесс Docker, но его возможности облегчают масштабируемое развертывание контейнеров в рабочей среде.
Kompose — это инструмент, который позволяет вам брать файлы Docker Compose и развертывать их в кластерах Kubernetes. Он разработан в рамках проекта Kubernetes.
Текущие версии Kompose ограничены преобразованием файлов YAML. Вы должны применить преобразованные манифесты ресурсов Kubernetes к своему кластеру с помощью такого инструмента, как Kubectl. В более ранних версиях Kompose была встроенная команда up
, которую можно было развернуть прямо в вашем кластере без промежуточного шага преобразования. Это было удалено из-за растущей технической сложности.
Начиная
Kompose доступен для Windows, macOS и большинства популярных дистрибутивов Linux. Готовые бинарные файлы доступны в репозитории GitHub. Загрузите последнюю версию, установите бит разрешения на выполнение и переместите двоичный файл в каталог, который находится на вашем пути. Также поддерживаются несколько менеджеров пакетов.
curl -L https://github.com/kubernetes/kompose/releases/download/v1.23.0/kompose-linux-amd64 -o kompose chmod +x kompose sudo mv ./kompose /usr/local/bin/kompose
Попробуйте запустить kompose
в своем терминале. Вы увидите основную информацию о доступных командах. Запуск kompose version
проверяет версию Kompose, которую вы используете.
Теперь убедитесь, что у вас есть файл docker-compose.yml
. Вот простой пример настройки веб-сервера Apache с базой данных MySQL:
version: "3" services: apache: image: httpd:latest ports: - 80:80 mysql: image: mysql:latest expose: - 3306 volumes: - mysql:/var/lib/mysql volumes: mysql:
Вам также нужен кластер Kubernetes для развертывания. Либо создайте новый кластер с поставщиком общедоступного облака, либо разверните свой собственный, используя такой проект, как MicroK8s.
Преобразование вашего стека
Команда kompose convert
принимает путь к файлу Docker Compose и создает эквивалентные манифесты ресурсов Kubernetes. Он использует docker-compose.yml
в вашем рабочем каталоге, если путь не указан. Несколько файлов принимаются с помощью флага -f
.
kompose convert -f docker-compose.yml -f docker-compose-dev.yml
Вы увидите несколько строк вывода, когда Compose записывает файлы манифеста для каждого из ресурсов в вашем стеке Compose. Отдельные файлы создаются для каждого компонента вашего docker-compose.yml
. Они будут помещены в ваш рабочий каталог.
Вот результат преобразования docker-compose.yml
, показанный выше:
Развертывание и служба Kubernetes были созданы для каждой из служб Compose. Эти ресурсы определяют создаваемые поды, а также их правила сетевой маршрутизации.
Для контейнера MySQL также существует PersistentVolumeClaim. Это том, настроенный в docker-compose.yml
, обеспечивающий постоянное хранилище для базы данных MySQL, которое дольше любого отдельного модуля.
Если вы просмотрите файлы YAML, вы увидите, что это обычные Kubectl-совместимые манифесты Kubernetes. Вот преобразованный файл apache-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.23.0 (bc7d9f4f)
creationTimestamp: null
labels:
io.kompose.service: apache
name: apache
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: apache
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.23.0 (bc7d9f4f)
creationTimestamp: null
labels:
io.kompose.service: apache
spec:
containers:
- image: httpd:latest
name: apache
ports:
- containerPort: 80
resources: {}
restartPolicy: Always
status: {}
spec
развертывания очень похож на определение контейнера Apache в исходном docker-compose.yml
. В случае с этим простым сервисом его легко сопоставить с объектом Kubernetes. Остальная часть файла в основном содержит метаданные настроек, в том числе специфичные для Kompose аннотации, которые позволяют идентифицировать ресурсы, созданные с помощью этого инструмента.
Развертывание в вашем кластере
Разверните набор файлов манифеста обычным способом с помощью kubectl apply
. Рекомендуется хранить их в отдельном каталоге вашего docker-compose.yml
, чтобы kubectl
также не пытался выбрать этот несовместимый файл.
kubectl apply .
Ресурсы будут предоставлены внутри вашего кластера. Запуск служб может занять несколько минут. Проверьте свое развертывание с помощью kubectl get deploys
. Когда в столбце AVAILABLE
отображается 1
, ваша рабочая нагрузка должна быть доступна.
Теперь вы можете обновить свое развертывание, отредактировав сгенерированные манифесты и повторно запустив kubectl apply
. Если вы хотите масштабировать Apache до трех реплик, вы должны открыть apache-deployment.yaml
, изменить поле replicas
на 3
и применить модифицированный манифест.
Вы также можете обновлять файл Docker Compose. Запустите kompose convert
еще раз, чтобы получить последнюю интерпретацию Kubernetes его содержимого, а затем повторно примените выходные данные к своему кластеру. Имейте в виду, что это перезапишет любые изменения, которые вы применяли вручную с тех пор.
Ограничения
Kompose обычно хорошо работает с файлами Docker Compose, используя наиболее распространенные функции и рекомендации. Он может создавать контейнеры, открывать порты и предоставлять постоянное хранилище через тома.
Однако не каждое преобразование будет идеальным. Некоторые возможности Compose не имеют прямого эквивалента в мире Kubernetes, в то время как другие будут отображаться таким образом, который может не соответствовать вашим потребностям. Использование развертываний и служб в этом примере — один из таких случаев: если вы выполняли развертывание непосредственно в Kubernetes, вы могли бы использовать правило Ingress для предоставления своей службы, но оно не создается Kompose. Самоуверенные решения разрешаются путем принятия самого простого варианта.
Вы также столкнетесь с проблемами, связанными с объемами. Файлы Docker Compose могут связывать файлы и папки монтирования с хоста в контейнеры. В Kubernetes это невозможно, поэтому вам понадобится альтернативное решение. Кроме того, хотя Kompose может создавать ресурсы для PersistentVolumeClaims, он не создает фактические PersistentVolumes. Вам понадобится уже доступный том в вашем кластере, прежде чем вы попытаетесь развернуть свои манифесты.
Полная таблица поддерживаемых функций и сведения о преобразовании предлагаются как часть документации Kompose. Прежде чем приступать к преобразованию, стоит убедиться, что используемые вами функции Docker Compose поддерживаются.
Заключение
Kompose упрощает переход с Docker Compose на кластер Kubernetes. Он автоматизирует шаги, которые ранее были утомительными, отнимающими много времени и подверженными ошибкам. Это хорошее вспомогательное средство, хотя и не тот инструмент, которым следует пользоваться без определенного контроля.
Преобразования Kompose не универсальны, поэтому они не подходят для всех сред. Всегда стоит проверять сгенерированные манифесты, прежде чем применять их к кластеру. В некоторых случаях лучше всего использовать Kompose в качестве эталона — преобразовать свой docker-compose.yml
, посмотреть, что получится в результате, а затем использовать его в качестве отправной точки для создания манифестов, полностью совместимых с ваше приложение и кластер.