Використання реєстрів на основі OCI

Починаючи з Helm 3, ви можете використовувати реєстри контейнерів з підтримкою OCI для зберігання та обміну пакетами чартів. Починаючи з Helm v3.8.0, підтримка OCI є стандартно увімкнено.

Підтримка OCI до v3.8.0

Підтримка OCI перейшла з експериментального статусу в загальну доступність з Helm v3.8.0. У попередніх версіях Helm підтримка OCI працювала інакше. Якщо ви використовували підтримку OCI до Helm v3.8.0, важливо зрозуміти, що змінилося в Helm.

Увімкнення підтримки OCI до v3.8.0

До Helm v3.8.0 підтримка OCI є експериментальною і має бути увімкнена вручну.

Щоб увімкнути експериментальну підтримку OCI для версій Helm до v3.8.0, задайте HELM_EXPERIMENTAL_OCI у вашому середовищі. Наприклад:

export HELM_EXPERIMENTAL_OCI=1

Визнання застарілою функції OCI та зміни поведінки з v3.8.0

З виходом Helm v3.8.0 наступні функції та поведінка відрізняються від попередніх версій Helm:

  • При встановленні chart у залежностях як OCI, версію можна задати у вигляді діапазону, як і для інших залежностей.
  • Теги SemVer, які містять інформацію про збірку, можна публікувати та використовувати. Реєстри OCI не підтримують + як символ теґу. Helm перетворює + на _, коли він зберігається як теґ.
  • Команда helm registry login тепер дотримується тієї ж структури, що й Docker CLI для зберігання облікових даних. Те ж місце для конфігурації реєстру може бути передане як Helm, так і Docker CLI.

Визнання застарілою функції OCI та зміни поведінки з v3.7.0

Випуск Helm v3.7.0 включав реалізацію HIP 6 для підтримки OCI. Як результат, наступні функції та поведінка відрізняються від попередніх версій Helm:

  • Субкоманда helm chart була видалена.
  • Кеш chart був видалений (немає helm chart list тощо).
  • Посилання на реєстри OCI тепер завжди починаються з oci://.
  • Базове імʼя посилання на реєстр має завжди відповідати імені chart.
  • Тег посилання на реєстр має завжди відповідати семантичній версії chart (тобто без тегів latest).
  • Тип медіа шару chart був змінений з application/tar+gzip на application/vnd.cncf.helm.chart.content.v1.tar+gzip.

Використання реєстру на основі OCI

Репозиторії Helm у реєстрах на основі OCI

Репозиторій Helm — це спосіб зберігання та розподілу упакованих Helm chart. Реєстр на основі OCI може містити нуль або більше репозиторіїв Helm, і кожен з цих репозиторіїв може містити нуль або більше упакованих Helm chart.

Використання послуг реєстрів

Існує кілька реєстрів контейнерів з підтримкою OCI, які ви можете використовувати для ваших Helm chart. Наприклад:

Щоб створити та налаштувати реєстр з підтримкою OCI, дотримуйтесь документації постачальника реєстру контейнерів на хостингу.

Примітка: Ви можете запускати Docker Registry або zot, які є реєстрами на основі OCI, на вашому компʼютері для розробки. Запуск реєстру на основі OCI на вашому компʼютері, де відбувається розробка, слід використовувати лише для тестування.

Використання sigstore для підписування чартів на основі OCI

Втулок helm-sigstore дозволяє використовувати Sigstore для підписування Helm чартів тими ж інструментами, які використовуються для підписування контейнерних образів. Це є альтернативою перевірки походження, що використовує GPD, яке підтримується класичними репозиторіями чартів.

Для отримання додаткової інформації про використання втулка helm sigstore, дивіться документацію цього проєкту.

Команди для роботи з реєстрами

Команда registry

login

Вхід до реєстру (зручний варіант з ручним введенням пароля)

$ helm registry login -u myuser localhost:5000
Password:
Login succeeded

logout

Вийти з реєстру

$ helm registry logout localhost:5000
Logout succeeded

Команда push

Завантажити чарт до реєстру на основі OCI:

$ helm push mychart-0.1.0.tgz oci://localhost:5000/helm-charts
Pushed: localhost:5000/helm-charts/mychart:0.1.0
Digest: sha256:ec5f08ee7be8b557cd1fc5ae1a0ac985e8538da7c93f51a51eff4b277509a723

Команда push може використовуватися тільки для .tgz файлів, створених заздалегідь за допомогою helm package.

При використанні helm push для завантаження чарту до реєстру OCI, посилання має починатися з oci:// і не повинно містити базове імʼя або теґ.

Базове імʼя посилання на реєстр визначається з імені чарту, а теґ визначається з семантичної версії чарту. Це наразі є строгими вимогами.

Деякі реєстри вимагають, щоб репозиторій та/або простір імен (якщо вказано) були створені заздалегідь. В іншому випадку під час операції helm push буде згенеровано помилку.

Якщо ви створили файл походження (.prov), і він присутній поруч з файлом чарту .tgz, він автоматично буде завантажено до реєстру при виконанні push. Це призводить до появи додаткового шару у маніфесті Helm chart.

Користувачі втулка helm-push (для завантаження chart до ChartMuseum) можуть стикатися з проблемами, оскільки втулок конфліктує з новою вбудованою командою push. З версії v0.10.0 втулок був перейменований на cm-push.

Інші підкоманди

Підтримка протоколу oci:// також доступна в різних інших підкомандах. Ось повний список:

  • helm pull
  • helm show
  • helm template
  • helm install
  • helm upgrade

Базове імʼя (імʼя chart) посилання на реєстр включено для будь-якого типу дії, що стосується завантаження chart (на відміну від helm push, де воно пропущене).

Ось кілька прикладів використання наведених вище підкоманд для chart на основі OCI:

$ helm pull oci://localhost:5000/helm-charts/mychart --version 0.1.0
Pulled: localhost:5000/helm-charts/mychart:0.1.0
Digest: sha256:0be7ec9fb7b962b46d81e4bb74fdcdb7089d965d3baca9f85d64948b05b402ff

$ helm show all oci://localhost:5000/helm-charts/mychart --version 0.1.0
apiVersion: v2
appVersion: 1.16.0
description: A Helm chart for Kubernetes
name: mychart
...

$ helm template myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
---
# Source: mychart/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
...

$ helm install myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
NAME: myrelease
LAST DEPLOYED: Wed Oct 27 15:11:40 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
...

$ helm upgrade myrelease oci://localhost:5000/helm-charts/mychart --version 0.2.0
Release "myrelease" has been upgraded. Happy Helming!
NAME: myrelease
LAST DEPLOYED: Wed Oct 27 15:12:05 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
...

Вказання залежностей

Залежності chart можна завантажити з реєстру за допомогою підкоманди dependency update.

repository для певного запису в Chart.yaml вказується як посилання на реєстр без базового імені:

dependencies:
  - name: mychart
    version: "2.7.0"
    repository: "oci://localhost:5000/myrepo"

Це завантажить oci://localhost:5000/myrepo/mychart:2.7.0, коли виконується dependency update.

Маніфест Helm чарту

Приклад маніфесту Helm чарту, представленого в реєстрі (зверніть увагу на поля mediaType):

{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.cncf.helm.config.v1+json",
    "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
    "size": 117
  },
  "layers": [
    {
      "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
      "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
      "size": 2487
    }
  ]
}

Наступний приклад містить файл походження (зверніть увагу на додатковий шар):

{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.cncf.helm.config.v1+json",
    "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
    "size": 117
  },
  "layers": [
    {
      "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
      "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
      "size": 2487
    },
    {
      "mediaType": "application/vnd.cncf.helm.chart.provenance.v1.prov",
      "digest": "sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a",
      "size": 643
    }
  ]
}

Міграція з репозиторіїв чартів

Міграція з класичних репозиторіїв чартів (репозиторії на основі index.yaml) є простою: використовуйте helm pull, а потім helm push, щоб завантажити отримані файли .tgz до реєстру.