使用基於 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 版本包含了 HIP 6 針對 OCI 支援的實作。因此,以下功能和行為與先前版本的 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 圖表套件。
使用託管註冊表
有幾個支援 OCI 的託管容器註冊表,您可以將其用於您的 Helm 圖表。例如:
- Amazon ECR
- Azure 容器註冊表
- Docker Hub
- Google Artifact Registry
- Harbor
- IBM Cloud Container Registry
- JFrog Artifactory
請遵循託管容器註冊表供應商的文件來建立和設定支援 OCI 的註冊表。
**注意:**您可以在您的開發電腦上執行 Docker Registry 或 zot
,它們都是基於 OCI 的註冊表。在您的開發電腦上執行基於 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
,然後使用 helm push
將產生的 .tgz
檔案上傳到註冊表即可。