Container au Havre pour les 500 ans by 0Lifea.
При разработке Open-source-проекта важно помогать пользователям и оставлять рекомендации. Но чтобы это делать, иногда нужно буквально «прочувствовать их боль»: воссоздать их рабочую среду, запустить тот же код и посмотреть на ту же ошибку. А учитывая сложность современных стеков данных, это бывает непросто.
Команда Kubernetes aaS VK Cloud Solutions перевела статью об инструменте Everything Bagel, который позволяет эффективнее работать с локальными стеками данных.
Что такое Everything Bagel
Everything Bagel — это мультиконтейнерная среда Docker, которую можно запустить локально одной командой. Она содержит множество технологий, с которыми выполняется деплоймент lakeFS: Spark, Hive, Trino, MinIO.
При этом lakeFS можно скачать бесплатно в репозитории.
Разберем, как запустить на своем ноутбуке Docker Everything Bagel, как он работает и что еще интересного можно сделать с помощью этого инструмента.
Начало работы
Первым делом ставим на ноутбук Docker. Потом запускаем Everything Bagel по инструкции:
- Клонируем репозиторий lakeFS:
git clone https://github.com/treeverse/lakeFS.git
.
- Переходим к директории deployments/compose:
cd. deployments/compose
.
- Запускаем
compose up -d
.
Готово! Начинается деплоймент контейнеров — в первый раз это займет несколько минут. После этого можно проверить статус контейнеров — для этого нужно запустить
docker compose ps
. Ответ можно увидеть в терминале:NAME COMMAND SERVICE STATUS PORTS
compose_spark-worker_1 "/opt/bitnami/script…" spark-worker running 0.0.0.0:53129->8081/tcp
compose_spark-worker_2 "/opt/bitnami/script…" spark-worker running 0.0.0.0:53126->8081/tcp
compose_spark-worker_3 "/opt/bitnami/script…" spark-worker running 0.0.0.0:53128->8081/tcp
compose_spark_1 "/opt/bitnami/script…" spark running 0.0.0.0:18080->8080/tcp, :::18080->8080/tcp
hive "/bin/sh -c \"/entryp…" hive-metastore running 0.0.0.0:9083->9083/tcp, :::9083->9083/tcp
hiveserver2 "hive --service hive…" hive-server running
lakefs "/app/wait-for postg…" lakefs running 0.0.0.0:8000->8000/tcp, :::8000->8000/tcp
lakefs-setup "/app/wait-for postg…" lakefs-setup exited (0)
mariadb "docker-entrypoint.s…" mariadb running 3306/tcp
minio "minio server /data …" minio running 0.0.0.0:9000->9000/tcp, :::9000->9000/tcp, 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp
minio-setup "mc mb lakefs/example" minio-setup exited (0)
postgres "docker-entrypoint.s…" postgres running 5432/tcp
trino "/usr/lib/trino/bin/…" trino running 8080/tcp
Если создаете более десяти контейнеров Everything Bagel, убедитесь, что приложению Docker хватит выделенной памяти.
Чтобы изменить эту настройку, перейдите на страницу параметров Docker. Там откройте вкладку Resources и убедитесь, что в параметре Memory задано как минимум 4 ГБ.
Как работает Docker Everything Bagel
Принцип работы Everything Bagel поможет понять файл
docker-compose.yaml
. На него по умолчанию ссылается команда docker compose up -d
. Флаг -d
означает «Запущено в состоянии Detached».Мы не сможем полностью рассказать про все файлы Docker Compose, но давайте коснемся раздела о сервисах, чтобы понимать, что происходит. Посмотрим на фрагмент конфигурации.
version: "3"
services:
lakefs-setup:
image: treeverse/lakefs:latest
container_name: lakefs-setup
depends_on:
- postgres
- minio-setup
environment:
- LAKEFS_AUTH_ENCRYPT_SECRET_KEY=some random secret string
- LAKEFS_DATABASE_CONNECTION_STRING=postgres://lakefs:lakefs@postgres/postgres?sslmode=disable
- LAKECTL_CREDENTIALS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
- LAKECTL_CREDENTIALS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
- LAKECTL_SERVER_ENDPOINT_URL=http://lakefs:8000
entrypoint: ["/app/wait-for", "postgres:5432", "--", "sh", "-c",
"lakefs setup --user-name docker --access-key-id AKIAIOSFODNN7EXAMPLE --secret-access-key wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY && lakectl repo create lakefs://example s3://example"
]
minio-setup:
image: minio/mc
container_name: minio-setup
environment:
- MC_HOST_lakefs=http://minioadmin:minioadmin@minio:9000
depends_on:
- minio
command: ["mb", "lakefs/example"]
postgres:
image: postgres:11
container_name: postgres
environment:
POSTGRES_USER: lakefs
POSTGRES_PASSWORD: lakefs
В этом фрагменте показаны разделы, создающие контейнеры, в которых выполняются Postgres (зависимость lakeFS), MinIO (базовое объектное хранилище) и lakeFS. Разберем отдельные компоненты файла.
image
. Пожалуй, самая важная настройка в разделеservices
. В ней указан базовый образ, который используется для создания контейнера. В большинстве случаев в Docker Hub можно найти официальный образ сервиса, который устанавливает все пакеты для выполнения сервиса. Например, образ lakeFS на Docker Hub выгружается автоматически рабочим процессом GitHub Action каждый раз, когда появляется новый официальный релиз lakeFS. И после начала работы автоматически запускает выполнение lakeFS.
- Ключ
depends_on
. Нужен для контроля последовательности, в которой создаются контейнеры. Перед запуском сервиса lakeFS необходимо убедиться, что первыми запускается контейнер, выполняющий Postgres, и сервис, который запускает MinIO и создает bucket. MinIO — это Open-source объектное хранилище, совместимое с S3 API. Поэтому в нем удобно моделировать S3 в локальных средах, чем мы и занимаемся.
- Ключ
environment
. В нем можно перечислить любые переменные рабочей среды. Аналогичным образом мы можем целиком сохранить файлы конфигурации и скопировать их в контейнер как Volume. В качестве примера можно посмотреть сервис Spark.
- Ключ
entrypoint
. Это команда или команды, которые нам нужно запустить в контейнере. Обычно так запускают соответствующий сервис. Однако в lakeFS-setup мы выполняем дополнительные шаги — создаем пользователя и репозиторий lakeFS (через утилиту командной строки lakectl), так что вручную повторять эти действия каждый раз не надо.
После этого экземпляр Repository-less lakeFS практически не нужен.
Если правильно указать эти настройки, можно запустить практически любой нужный нам сервис в изолированной рабочей среде Docker.
Как можно использовать Everything Bagel
- Подключаться к клиентам Hive и Trino
[docker compose — profile client run — rm trino-client]
и создавать таблицы или запросы к данным.
- Перемещаться в контейнер Spark
[docker-compose exec spark bash]
и тестировать задания Spark-submit.
- Открывать пользовательские интерфейсы lakeFS (http://localhost:8000) и MinIO (http://localhost:9000) и смотреть, как в них отображаются операции Spark, Hive и Trino.
Попробуйте Kubernetes as a Service на платформе VK Cloud Solutions. Мы даем новым пользователям 3000 бонусных рублей на тестирование кластера или любых других сервисов.
Что еще почитать:
- Рабочие узлы Kubernetes: много маленьких или несколько больших?
- Чек-лист по безопасности контейнеров
- Политики управления рабочими нагрузками в Kubernetes
- Телеграм-канал с новостями о Kubernetes