使用基於 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 圖表。例如:

請遵循託管容器註冊表供應商的文件來建立和設定支援 OCI 的註冊表。

**注意:**您可以在您的開發電腦上執行 Docker Registryzot,它們都是基於 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 檔案上傳到註冊表即可。