Сборка кроссплатформенных образов с помощью Buildah и Merge-Image
Содержание
Обзор функцииВарианты использованияПредварительные требованияШаг 1: Подготовьте учетные данные registryШаг 2: Создайте Pipeline и запустите PipelineRunШаг 3: Проверьте платформы объединенного образаУстранение неполадокСвязанные материалыОбзор функции
В этом руководстве показано, как собирать образы для каждой архитектуры с помощью buildah Task, а затем объединять их в один многоархитектурный образ с помощью merge-image Task.
Типичный процесс:
- Соберите тег образа
linux/amd64(например,:v1.0.0-amd64) - Соберите тег образа
linux/arm64(например,:v1.0.0-arm64) - Объедините исходные теги в один или несколько целевых тегов (например,
:v1.0.0,:latest)
Варианты использования
- Сборка и публикация многоархитектурных образов из одного репозитория кода.
- Сохранение результатов сборки для конкретной архитектуры при предоставлении одного унифицированного тега релиза.
- Переназначение тегов и публикация нескольких целевых тегов за один шаг объединения.
Предварительные требования
- Установлен
Tekton Pipelines. - Установлены
git-clone,buildah(0.9) иmerge-image(0.1)Tasks. - У вас есть возможность отправлять образы в свой registry.
- Учетные данные для registry подготовлены в виде
Secretв Kubernetes. - Если вы используете нативные сборки на узлах (как показано в этом руководстве), в кластере должны быть доступны узлы как
amd64, так иarm64. - Необязательные инструменты для локальной проверки:
crane,jq.
Шаг 1: Подготовьте учетные данные registry
Создайте общий secret с config.json:
Шаг 2: Создайте Pipeline и запустите PipelineRun
Перед использованием обновите следующие значения:
- URL репозитория Git и revision
- Исходные теги образов для конкретных архитектур и итоговый целевой тег образа
- Runtime image для Crane, если нужно заменить значение по умолчанию
- Имена workspace и secret
Пример Pipeline:
Пример PipelineRun:
Ключевые моменты в этом примере:
- В примере используются ссылки через hub resolver для
git-clone,buildahиmerge-image, поэтому соответствующие Catalog Tasks должны быть доступны для разрешения в вашем кластере. image-amd64иimage-arm64заданы как явные параметры Pipeline. Это делает входные данные для объединения однозначными и соответствует тому, какmerge-imageиспользуетsourceImages.taskRunSpecs+podTemplate.nodeSelectorнастраиваются вPipelineRunи критически важны, если в кластере используются узлы с разными архитектурами CPU. Они гарантируют, что каждая задача сборки выполняется на узле нужной архитектуры.- По умолчанию Tekton использует
coschedule: workspaces, который создает Affinity Assistant и пытается разместить TaskRun, использующие один и тот же PVC-backed workspace, на одном узле. Если вы закрепляетеbuildah-amd64иbuildah-arm64за разными архитектурами, это поведение по умолчанию конфликтует сnodeSelectorна уровне отдельных задач. В таком случае установитеspec.pipeline.coschedule: disabledвTektonConfig, чтобы Tekton перестал принудительно размещать TaskRun с общим workspace на одном узле. Operator автоматически распространит эту настройку в ConfigMapfeature-flags. - Отключение
coscheduleнеобходимо для кросс-архитектурного планирования, но само по себе этого недостаточно. Если общий workspace основан на PVC сReadWriteOnce, Kubernetes все равно не сможет одновременно подключить этот том в режиме read-write к двум разным узлам. Чтобы выполнять параллельные сборки для amd64 и arm64 на разных узлах, используйте workspace backend, который поддерживает совместное использование несколькими узлами, напримерReadWriteMany. sourceImagesдолжны указывать на теги для конкретных архитектур, аtargetImages— на итоговый многоархитектурный тег или теги, которые вы хотите опубликовать.- Workspace
registry-credentialsпереиспользуется иbuildah, иmerge-image; сопоставление имен workspace (registryconfigпротивregistry-config) зависит от интерфейса задачи и должно соответствовать определению каждой Task.
Шаг 3: Проверьте платформы объединенного образа
После успешного завершения PipelineRun вы можете проверить платформы объединенного образа с помощью crane, podman или skopeo:
С помощью crane:
С помощью podman:
С помощью skopeo:
Ожидаемый вывод включает:
linux/amd64linux/arm64
Устранение неполадок
- Если
buildah-amd64иbuildah-arm64используют один PVC-backed workspace и закреплены за разными архитектурами, проверьте флаг функции Tekton Pipelinescoschedule. Установитеspec.pipeline.coschedule: disabledвTektonConfig, если нужно, чтобы эти TaskRun планировались на разные узлы; режим по умолчаниюworkspacesпытается размещать их на одном узле с помощью Affinity Assistant. Точное расположение настройки и поведение см. в Невозможно использовать несколько PVC workspace в Tekton. - Даже при
coschedule: disabledPVC сReadWriteOnceвсе равно нельзя одновременно подключить в режиме read-write с двух разных узлов. Для полноценной параллельной кросс-архитектурной сборки привяжите общий workspace к хранилищу, которое поддерживаетReadWriteMany. - Рекомендуется хранить
sourceImagesиtargetImagesв одном и том же registry. Ввод из разных registry допускается, ноmerge-imageвыводит предупреждения в лог. merge-imageдопускает объединение между разными repositories. Для исходных или целевых образов из разных registry он продолжает выполнение с предупреждениями в логе, поэтому убедитесь, что учетные данные действительны для каждого задействованного registry.sourceImagesиtargetImagesне должны быть пустыми. Дублирующиеся ссылки на исходные образы или дублирующиеся digest исходных образов пропускаются, и должен остаться как минимум один уникальный исходный образ.- Для self-signed registry:
buildah: подключайте файлы CA кsslcertdirmerge-image: подключайте файлы CA кca-bundleи при необходимости задавайтеcaFileName- задавайте
TLS_VERIFY/tlsVerifyв значениеfalseтолько в доверенных средах
- Параметры
buildahпишутся в верхнем регистре (например,IMAGES,CONTAINERFILE), тогда какmerge-imageиспользует lower camel case (например,sourceImages,targetImages).