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サポートを備えたホスト型コンテナレジストリがいくつかあります。例:
- Amazon ECR
- Azure Container Registry
- Docker Hub
- Google Artifact Registry
- Harbor
- IBM Cloud Container Registry
- JFrog Artifactory
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
を使用するのと同じくらい簡単です。