OCIベースのレジストリの使用

Helm 3以降では、チャートパッケージを保存および共有するために、OCIをサポートするコンテナレジストリを使用できます。Helm v3.8.0以降では、OCIサポートがデフォルトで有効になっています。

v3.8.0より前のOCIサポート

OCIサポートは、Helm v3.8.0で実験的段階から一般利用可能になりました。以前のバージョンのHelmでは、OCIサポートの動作が異なっていました。Helm v3.8.0より前のOCIサポートを使用していた場合は、異なるバージョンのHelmでの変更点を理解することが重要です。

v3.8.0より前のOCIサポートの有効化

Helm v3.8.0より前では、OCIサポートは実験的であり、有効にする必要があります。

v3.8.0より前のHelmバージョンでOCI実験的サポートを有効にするには、環境内でHELM_EXPERIMENTAL_OCIを設定します。例:

export HELM_EXPERIMENTAL_OCI=1

v3.8.0でのOCI機能の非推奨と動作の変更

Helm v3.8.0のリリースでは、次の機能と動作が以前のバージョンのHelmと異なります。

  • 依存関係でチャートをOCIとして設定する場合、バージョンは他の依存関係と同様に範囲を設定できます。
  • ビルド情報を含むSemVerタグをプッシュして使用できます。OCIレジストリは、タグ文字として+をサポートしていません。Helmは、タグとして保存するときに+_に変換します。
  • helm registry loginコマンドは、資格情報を保存するためにDocker CLIと同じ構造に従うようになりました。レジストリ構成の同じ場所をHelmとDocker CLIの両方に渡すことができます。

v3.7.0でのOCI機能の非推奨と動作の変更

Helm v3.7.0のリリースには、OCIサポートのHIP 6の実装が含まれていました。その結果、次の機能と動作が以前のバージョンのHelmと異なります。

  • helm chartサブコマンドが削除されました。
  • チャートキャッシュが削除されました(helm chart listなどはありません)。
  • OCIレジストリ参照には、常にoci://がプレフィックスとして付くようになりました。
  • レジストリ参照のベース名は、常にチャートの名前と一致する必要があります。
  • レジストリ参照のタグは、常にチャートのセマンティックバージョンと一致する必要があります(つまり、latestタグは使用できません)。
  • チャートレイヤーのメディアタイプは、application/tar+gzipからapplication/vnd.cncf.helm.chart.content.v1.tar+gzipに切り替えられました。

OCIベースのレジストリの使用

OCIベースのレジストリ内のHelmリポジトリ

Helmリポジトリは、パッケージ化されたHelmチャートを格納および配布する方法です。OCIベースのレジストリには、ゼロ個以上のHelmリポジトリを含めることができ、それらの各リポジトリには、ゼロ個以上のパッケージ化されたHelmチャートを含めることができます。

ホスト型レジストリの使用

Helmチャートに使用できるOCIサポートを備えたホスト型コンテナレジストリがいくつかあります。例:

OCIサポートを備えたレジストリを作成および構成するには、ホスト型コンテナレジストリプロバイダーのドキュメントに従ってください。

注意:開発コンピュータで、OCIベースのレジストリであるDocker Registryまたはzotを実行できます。開発コンピュータでのOCIベースのレジストリの実行は、テスト目的でのみ使用する必要があります。

Sigstoreを使用してOCIベースのチャートに署名する

helm-sigstoreプラグインを使用すると、Sigstoreを使用して、コンテナイメージの署名に使用するのと同じツールでHelmチャートに署名できます。これにより、従来のチャートリポジトリでサポートされているGPGベースの来歴の代替手段が提供されます。

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サブコマンドは、helm packageを使用して事前に作成された.tgzファイルに対してのみ使用できます。

helm pushを使用してチャートをOCIレジストリにアップロードする場合、参照にはoci://がプレフィックスとして付いており、ベース名やタグを含めてはなりません。

レジストリ参照のベース名はチャートの名前から推測され、タグはチャートのセマンティックバージョンから推測されます。これは現在、厳密な要件です。

一部のレジストリでは、リポジトリや名前空間(指定されている場合)を事前に作成する必要があります。それ以外の場合、helm push操作中にエラーが発生します。

来歴ファイル.prov)を作成し、それがチャートの.tgzファイルの隣にある場合、push時に自動的にレジストリにアップロードされます。これにより、Helmチャートマニフェストに追加のレイヤーが作成されます。

helm-pushプラグイン(チャートをChartMuseumにアップロードするため)のユーザーは、プラグインが新しい組み込みのpushと競合するため、問題が発生する可能性があります。バージョンv0.10.0以降、プラグインの名前はcm-pushに変更されました。

その他のサブコマンド

oci://プロトコルのサポートは、他のさまざまなサブコマンドでも利用できます。以下に完全なリストを示します。

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

レジストリ参照のベース名(チャート名)は、チャートのダウンロードを伴うあらゆるタイプのアクションに含まれます(helm pushでは省略されます)。

以下に、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:
...

依存関係の指定

チャートの依存関係は、dependency updateサブコマンドを使用してレジストリからプルできます。

Chart.yaml内の特定のエントリのrepositoryは、ベース名なしのレジストリ参照として指定されます。

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

これにより、dependency updateが実行されると、oci://localhost:5000/myrepo/mychart:2.7.0がフェッチされます。

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を使用して、結果の.tgzファイルをレジストリにアップロードするためにhelm pushを使用するのと同じくらい簡単です。