Podman-compose-to-kube: различия между версиями
Kaf (обсуждение | вклад) м (Kaf переименовал страницу Podman-compose/kubernetes в Podman-compose-to-kubernetes: Написание скрипта podman-compose-to-kubernetes обеспечивающего описанный функционал) |
Kaf (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
== podman-compose как средство миграция docker-compose решений в kubernetes == | == podman-compose-to-kube как средство миграция docker-compose решений в kubernetes == | ||
Одной из основных проблем миграции <code>docker-compose</code> (<code>docker swarm</code>) решений в <code>kubernetes</code> является | Одной из основных проблем миграции <code>docker-compose</code> (<code>docker swarm</code>) решений в <code>kubernetes</code> является генерация <code>kubernetes-манифестов</code> из <code>YAML-файлов описания стека сервисов</code>. | ||
Существует достаточно бедный набор инструментов, решающий данную проблему. | Существует достаточно бедный набор инструментов, решающий данную проблему. | ||
Данный документ описывает решение данной проблемы путем использования | Данный документ описывает решение данной проблемы путем использования команд | ||
[https://github.com/containers/podman-compose podman-compose], | |||
[https://github.com/alt-cloud/podman-compose-to-kube podman-compose-to-kube]. | |||
В качестве примера разворачивания стека будет использоваться <code>docker-compose</code> стек [https://github.com/containers/podman-compose/tree/devel/examples/hello-python hello-python] проекта <code>podman-compose</code>. | В качестве примера разворачивания стека будет использоваться <code>docker-compose</code> стек [https://github.com/containers/podman-compose/tree/devel/examples/hello-python hello-python] проекта <code>podman-compose</code>. | ||
Строка 10: | Строка 13: | ||
=== Установка ПО, создание пользователей, разворачивание kubernetes === | === Установка ПО, создание пользователей, разворачивание kubernetes === | ||
Для разворачивания docker-compose стеков необходимо установить | Для разворачивания <code>docker-compose</code> стеков необходимо установить пакеты <code>podman-compose</code>б <code>podman-compose-to-kube</code>. | ||
==== rootfull-окружение ==== | ==== rootfull-окружение ==== | ||
Разворачивание решений в <code>roofull</code> окружении производится под пользователем root. | Разворачивание решений в <code>roofull</code> окружении производится под пользователем <code>root</code>. | ||
В создании других пользователей необходимости нет. | В создании других пользователей необходимости нет. | ||
Разворачивание <code>roofull-kubernetes</code> описано в документе [[Kubernetes]]. | Разворачивание <code>roofull-kubernetes</code> описано в документе [[Kubernetes]]. |
Версия от 11:39, 27 января 2024
podman-compose-to-kube как средство миграция docker-compose решений в kubernetes
Одной из основных проблем миграции docker-compose
(docker swarm
) решений в kubernetes
является генерация kubernetes-манифестов
из YAML-файлов описания стека сервисов
.
Существует достаточно бедный набор инструментов, решающий данную проблему.
Данный документ описывает решение данной проблемы путем использования команд
podman-compose,
podman-compose-to-kube.
В качестве примера разворачивания стека будет использоваться docker-compose
стек hello-python проекта podman-compose
.
Будут рассмотрены вопросы разворачивания миграции как rootfull
так и rootless-решений
.
Установка ПО, создание пользователей, разворачивание kubernetes
Для разворачивания docker-compose
стеков необходимо установить пакеты podman-compose
б podman-compose-to-kube
.
rootfull-окружение
Разворачивание решений в roofull
окружении производится под пользователем root
.
В создании других пользователей необходимости нет.
Разворачивание roofull-kubernetes
описано в документе Kubernetes.
rootless-решение
Разворачивание rooless-kubernetes
описано в документе Rootless kubernetes.
В процессе его разворачивания создается пользователь u7s-admin
. Вы можете разворачивать rootless podman-compose стек либо в рамках этого пользователя либо создать пользователя, имеющий право загружать образы с внешний репозиториев. В защищенных платформах c10f.
это пользователи, входящие в группу podman_dev
.
Пользователь u7s-admin
входит в эту группу.
Разворачивание docker-compose стека в podman-compose
Загрузка описания стека сервисов hello-python
Скопируйте содержимое каталога hello-python.
Если у Вас установлен git это можно сделать командами:
# git clone -n --depth=1 --filter=tree:0 https://github.com/containers/podman-compose.git # cd podman-compose/ # git sparse-checkout set --no-cone examples/hello-python # git checkout
После выполнения команд в каталоге podman-compose/examples/hello-python
развернется содержание указанного выше каталога.
Разворачивание стека сервисов
Описание стека сервисов
Перейдите в каталог podman-compose/examples/hello-python
.
Каталог содержит в файле docker-compose.yml
описание стека сервисов:
--- version: '3' volumes: redis: services: redis: read_only: true image: docker.io/redis:alpine command: ["redis-server", "--appendonly", "yes", "--notify-keyspace-events", "Ex"] volumes: - redis:/data web: read_only: true build: context: . image: hello-py-aioweb ports: - 8080:8080 environment: REDIS_HOST: redis
В сервисе redis
запускается контейнер и запускается томом redis
.
В сервисе web
собирается образ hello-py-aioweb
, получающий имя localhost/hello-py-aioweb
и на его основе запускается контейнер, обеспечивающий прием HTTP-запросов по порту 8080
.
Образ localhost/hello-py-aioweb
собирается на основе Dockerfile
:
FROM python:3.9-alpine WORKDIR /usr/src/app COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [ "python", "-m", "app.web" ] EXPOSE 8080
При запуске контейнера запускается python-скрипт app/web.py
, HTTP-принимающий запросы, формирующий счетчик запросов в redis-базе и возвращающий текст с номером запроса.
Запуск стека сервисов
Перед запуском стека сервисов необходимо утоснить файл docker-compose.yml
:
version: '3' volumes: redis: redis1: services: redis: read_only: true image: docker.io/redis:alpine command: ["redis-server", "--appendonly", "yes", "--notify-keyspace-events", "Ex"] volumes: - redis:/data ports: - 6379 web: read_only: true build: context: . image: hello-py-aioweb ports: - 8080:8080 environment: REDIS_HOST: redis REDIS_PORT: 6379
Отличия от исходного файла:
- Добавлено описание порта
6379
в сервисredis
. Это связано с тем, что файлы kubernetes-сервисов (kind: Service
) создаются только для сервисов, имеющих порты. Если сервис создан не будет redis-контейнер для разворачивания типаDeployment
(kind: Deployment
) не получит DNS-имя в рамках kubernetes-кластера и будет недоступен из других контейнеров (web-контейнера
).
- Добавлено описание переменной (
environment
)REDIS_PORT: 6379
. При отсутствии этой переменной в web-контейнер передается некорректное значение этой переменной форматаhttp://<.IP>:6379
, что вызывает ошибку вpython-коде App/web.py
.
Для запуска стека сервисов наберите команду:
podman-compose --in-pod counter -p counter up -d
При использовании podman-compose
версии >= 1.0.7
параметр --in-pod
необязателен.
Параметр -p
задает имя проекта - суффикс имени POD
'а (pod_counter
) и префикс имен контейнеров и томов.
Если параметр -p
отсутствует в качестве имени проекта принимается имя текущего каталога (в нашем случае hello-python
).
В процессе работы podman-compose
выводит список запускаемых команд:
... podman volume inspect counter_redis || podman volume create counter_redis ... podman pod create --name=pod_counter --infra=false --share= ... podman run --name=counter_redis_1 -d --pod=pod_counter --read-only --label ... ... podman run --name=counter_web_1 -d --pod=pod_counter --read-only --label ... ...
После запуска POD'а и контейнеров состояние можно посмотреть командами. - список запущенных POD'ов:
podman pod ls POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS d37ba3addeb3 pod_counter Running 9 minutes ago 2
- Логи контейнеров POD'а:
podman pod logs pod_counter b5bdc8d1977f 1:C 18 Jan 2024 11:04:20.309 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo ... b5bdc8d1977f 1:M 18 Jan 2024 11:04:20.312 * Ready to accept connections tcp
- Список запущенных контейнеров:
podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ... b5bdc8d1977f docker.io/library/redis:alpine redis-server --ap... 27 minutes ago Up 27 minutes counter_redis_1 49f6f5141b24 localhost/hello-py-aioweb:latest python -m App.web 27 minutes ago Up 27 minutes 0.0.0.0:8080->8080/tcp counter_web_1 ...
- Логи контейнера базы данных redis
podman logs counter_redis_1 1:C 18 Jan 2024 11:04:20.309 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo ... 1:M 18 Jan 2024 11:04:20.312 * Ready to accept connections tcp
- Логи контейнера WEB-интерфейса web:
podman log counter_web_1
Проверка работы стека сервисов
Для проверки работы стека последовательно пошлите запросы командой curl на порт 8080:
# curl localhost:8080/ counter=1 # curl localhost:8080/ counter=2 # curl localhost:8080/ counter=3 ...
Экспорт развернутого стека в kubernetes-манифесты
Копирование локальных образов в rootless окружении
В rootless-окружении образы, созданные podman-compose
хранятся в каталоге /var/lib/u7s-admin/.local/share/containers/storage/
. Образы же для kubernetes хранятся в другом каталоге /var/lib/u7s-admin/.local/share/usernetes/containers/storage/
. Для образов, загружаемых с регистраторов это несущественно, так как они подгружаются при запуске POD
'а. Образы же, созданные локально, как в нашем случае образ localhost/hello-py-aioweb
необходимо перенести в container-storage
для kubernetes-образов командой skopeo
:
# skopeo copy \ containers-storage:[/var/lib/u7s-admin/.local/share/containers/storage/]localhost/hello-py-aioweb \ containers-storage:[/var/lib/u7s-admin/.local/share/usernetes/containers/storage/]localhost/hello-py-aioweb
и изменить собственника перенесенного образа с root
на u7s-admin
:
# chown -R u7s-admin:u7s-admin /var/lib/u7s-admin/.local/
Формирование kubernetes-манифестов
Для формирования запустите команду:
# podman kube generate pod_counter
apiVersion: v1 kind: Pod metadata: ... name: podcounter spec: containers: ... image: docker.io/library/redis:alpine name: counterredis1 volumeMounts: - mountPath: /data name: counter_redis-pvc - image: localhost/hello-py-aioweb:latest name: counterweb1 ports: - containerPort: 8080 hostPort: 8080 ... volumes: - name: counter_redis-pvc persistentVolumeClaim: claimName: counter_redis