В Helm есть много замечательных инструментов, но хранение диаграмм всегда было проблемой. Давайте посмотрим, как мы можем сделать этот процесс намного проще!
Одним из больших преимуществ понимания того, как работает экосистема контейнеров, является то, что вы можете использовать один и тот же шаблон для нескольких спецификаций.
Не так давно Helm объявил, что будет поддерживать артефакты OCI, которые представляют собой не что иное, как открытую спецификацию OCI для распространения образов контейнеров и других типов данных, называемых артефактами.
Эта спецификация, как и все другие спецификации OCI, не зависит от облака, что делает ее фантастическим инструментом для работы.
Запись контейнера (CR) или реестр — это то, что приходилось использовать всем, кто когда-либо имел дело с контейнерами. CR — это место, где мы храним наши образы контейнеров, поэтому мы можем получать их из любого места и в любое время.
По сути, изображение — это набор файлов, которые имеют примерно такую структуру:
├── blobs │ └── sha256 │ ├── 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db3... │ ├── 31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106... │ └── 8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690f... ├── index.json └── oci-layout
Файл index.json представляет собой список всех доступных манифестов, то есть это список всех изображений, доступных в определенном месте. В нашем случае это список всех карт руля.
Каждый файл внутри blobs/sha256 представляет собой JSON, который идентифицирует артефакт, будь то изображение или диаграмма. Этот JSON соответствует спецификации OCI для файлов SHA.
Если коротко, то это список настроек, описывающих характеристики BLOB, его настройки, свойства, слои файловой системы, а также начальные команды.
В случае Helm Chart у нас есть следующий файл:
{ "schemaVersion": 2, "config": { "mediaType": "application/vnd.cncf.helm.config.v1+json", "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111", "size": 117 }, "layers": [ { "mediaType": "application/tar+gzip", "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617", "size": 2487 } ] }
Обратите внимание, что у нас есть дифференциация mediaType, в то время как обычный образ Docker имеет тип application/vnd.oci.image.config.v1+json.
Здесь у нас тип application/vnd.cncf.helm.config, то же самое и со слоями, каждый слой изображения OCI имеет тип application/vnd.oci.image.layer.v1.tar+gzip, а здесь у нас есть только формат .tar.gz.
Размещение диаграмм Helm в Azure CR очень похоже на их локальное хранение. Вам необходимо иметь доступ к Azure через Azure CLI. Мы предполагаем, что у вас уже есть Azure CLI, поэтому давайте создадим наш ACR.
Сначала мы должны создать нашу группу ресурсов, а затем ACR с помощью команд:
az group create -n helm-reg -l eastus az acr create -n chartregistry$RANDOM -g helm-reg --sku Basic -o tsv --query loginServer
Совет — сохранить имя репозитория в переменной:
export ACR=$(az acr create -n chartregistry$RANDOM -g helm-reg --sku Basic -o tsv --query loginServer)
Теперь мы собираемся войти в наш реестр, используя управляемые ключи Azure, но нам нужно включить административный контроль с помощью az acr update -n $ACR —admin-enabled true.
Затем выполните следующие две команды, чтобы получить учетные данные для входа и сохранить их в оболочке:
export ACRUSER=$(az acr credential show -n $ACR --query username -o tsv) export ACRPASS=$(az acr credential show -n $ACR --query 'passwords[0].value' -o tsv)
Теперь мы можем войти в наш реестр с помощью Helm helm registry login $ACR —username $ACRUSER —password $ACRPASS, и отсюда у нас уже настроен наш реестр.
Давайте создадим еще один артефакт с помощью helm chart save hrepo $ACR/hrepo:2.1.3(в качестве примера я буду использовать диаграмму из пустого репозитория с именем hrepo). Затем мы подтолкнем его с помощью helm chart push $ACR/hrepo:3.8.0.
Как только он будет там, мы сможем перечислить все в репозитории с помощью команды Azure CLI:
az acr repository show -n $ACR --repository hrepo
Обратите внимание, что у нас будет именно то, что мы отправили:
{ "changeableAttributes": { "deleteEnabled": true, "listEnabled": true, "readEnabled": true, "writeEnabled": true }, "createdTime": "2022-03-05T20:56:49.6118202Z", "imageName": "hrepo", "lastUpdateTime": "2022-03-05T20:56:49.7812323Z", "manifestCount": 1, "registry": "chartregistry23657.azurecr.io", "tagCount": 1 }
Мы также можем получить более подробную информацию с помощью команды show-manifests, добавив —detail:
az acr repository show-manifests -n $ACR --repository hrepo --detail
Это даст нам точное определение артефактов OCI:
[ { "changeableAttributes": { "deleteEnabled": true, "listEnabled": true, "quarantineState": "Passed", "readEnabled": true, "writeEnabled": true }, "configMediaType": "application/vnd.cncf.helm.config.v1+json", "createdTime": "2022-03-05T20:56:49.7213057Z", "digest": "sha256:4780713fa23d7144d356c353795b5b84e66ad2b8bbd47c7118b4b85435d50bbc", "imageSize": 1378, "lastUpdateTime": "2022-03-05T20:56:49.7213057Z", "mediaType": "application/vnd.oci.image.manifest.v1+json", "tags": [ "2.1.3" ] } ]
Чтобы сохранить его, мы должны просто:
helm chart pull $ACR/hrepo:3.8.0 helm chart export $ACR/hrepo:3.8.0 -d ./destination helm install hrepo-acr ./destination
Хотя использовать Helm легко, все же не существует «простого» способа разместить диаграмму Helm как своего рода частную запись.
Хотя в Helm есть отличные инструменты, такие как Chart Museum, они все же не являются полностью стандартными, и для легкой распределенной разработки важно, чтобы у нас были открытые стандарты, которым может следовать каждый в целом.
Helm недавно перевел поддержку реестра OCI с экспериментальной на общую функцию, что является убедительным признаком того, что экосистема контейнеров становится все лучше.