OCI ベースのレジストリの使用
Helm 3 以降、OCI をサポートするコンテナレジストリを使用して chart パッケージを保存・共有できます。Helm v3.8.0 以降、OCI サポートはデフォルトで有効になっています。
v3.8.0 より前の OCI サポート
OCI サポートは Helm v3.8.0 で実験的機能から一般提供(GA)に昇格しました。それ以前のバージョンでは OCI サポートの動作が異なります。v3.8.0 より前に OCI サポートを使用していた場合は、各バージョンの変更点を確認してください。
v3.8.0 より前の OCI サポートの有効化
Helm v3.8.0 より前では、OCI サポートは実験的機能であり、明示的に有効化する必要があります。
v3.8.0 より前のバージョンで OCI サポートを有効にするには、環境変数 HELM_EXPERIMENTAL_OCI を設定します。例:
export HELM_EXPERIMENTAL_OCI=1
v3.8.0 での OCI 機能の廃止と動作変更
Helm v3.8.0 のリリースで、以下の機能と動作が以前のバージョンと異なっています:
- 依存関係で chart を OCI として設定する場合、他の依存関係と同様にバージョンを範囲指定できます。
- ビルド情報を含むセマンティックバージョンタグをプッシュして使用できます。OCI レジストリはタグ文字として
+をサポートしていません。Helm はタグとして保存する際に+を_に変換します。 helm registry loginコマンドは、認証情報の保存において Docker CLI と同じ構造に従うようになりました。レジストリ設定の同じ場所を Helm と Docker CLI の両方に渡すことができます。
v3.7.0 での OCI 機能の廃止と動作変更
Helm v3.7.0 のリリースには、OCI サポートの HIP 6 の実装が含まれていました。その結果、以下の機能と動作が以前のバージョンと異なっています:
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 ベースのレジストリの使用
OCI ベースレジストリにおける Helm リポジトリ
Helm リポジトリは、パッケージ化された Helm chart を格納・配布する方法です。OCI ベースのレジストリには複数の Helm リポジトリを含めることができ、各リポジトリには複数のパッケージ化された Helm chart を含めることができます。
ホステッドレジストリの使用
OCI 対応のホスト型コンテナレジストリがいくつかあります。例:
- Amazon ECR
- Azure Container Registry
- Cloudsmith
- Docker Hub
- Google Artifact Registry
- Harbor
- IBM Cloud Container Registry
- JFrog Artifactory
- RepoFlow
ホステッドコンテナレジストリプロバイダーのドキュメントに従って、OCI サポート付きのレジストリを作成・設定してください。
注意: ローカル環境で Docker Registry や zot などの OCI レジストリを実行することも可能です。ただし、ローカル環境での実行はテスト目的に限定してください。
sigstore を使用した OCI ベース chart の署名
helm-sigstore プラグインを使用すると、コンテナイメージの署名と同じツールで Sigstore を使用して Helm chart に署名できます。これは、従来の chart リポジトリでサポートされている GPG ベースの provenance の代替手段です。
helm sigstore プラグインの使用方法の詳細は、プロジェクトのドキュメントを参照してください。
レジストリ操作用のコマンド
registry サブコマンド
login
レジストリにログインします(パスワードを手動入力)
$ helm registry login -u myuser localhost:5000
Password:
Login succeeded
logout
レジストリからログアウトします
$ helm registry logout localhost:5000
Logout succeeded
push サブコマンド
OCI ベースのレジストリに chart をアップロードします:
$ 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 を使用して chart を OCI レジストリにアップロードする場合、参照には oci:// プレフィックスを付ける必要があり、ベース名やタグを含めてはいけません。
レジストリ参照のベース名は chart の名前から推測され、タグは chart のセマンティックバージョンから推測されます。これは現在、厳格な要件です。
一部のレジストリでは、リポジトリや namespace(指定する場合)を事前に作成しておく必要があります。そうしないと、helm push 操作中にエラーが発生します。
provenance ファイル(.prov)を作成済みで、chart の .tgz ファイルと同じディレクトリにある場合、push 時に自動的にレジストリにアップロードされます。これにより、Helm chart マニフェストに追加のレイヤーが作成されます。
helm-push プラグイン(ChartMuseum に chart をアップロードするためのプラグイン)のユーザーは、このプラグインが新しい組み込みの push と競合するため、問題が発生する可能性があります。バージョン v0.10.0 以降、このプラグインは cm-push に名前が変更されました。
その他のサブコマンド
oci:// プロトコルは、他のさまざまなサブコマンドでもサポートされています。以下は完全なリストです:
helm pullhelm pushhelm showhelm templatehelm installhelm upgrade
chart のダウンロードを伴うアクションでは、レジストリ参照のベース名(chart 名)を含めます(helm push ではベース名を省略)。
以下は、上記のサブコマンドを OCI ベースの chart に対して使用する例です:
$ 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 サブコマンドを使用してレジストリから取得できます。
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 chart マニフェスト
レジストリに表示される Helm chart マニフェストの例です(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
}
]
}
以下の例には provenance ファイルが含まれています(追加のレイヤーに注目してください):
{
"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
}
]
}
chart リポジトリからの移行
従来の chart リポジトリ(index.yaml ベースのリポジトリ)からの移行は、helm pull を使用してから、生成された .tgz ファイルを helm push でレジストリにアップロードするだけです。