注册中心

Helm 3 支持 OCI 用于包分发。 Chart包可以通过基于OCI的注册中心存储和分发。

激活对 OCI 的支持

在Helm v3.8.0之前,OCI支持被认为是实验性的,需要手动启用。从v3.8.0开始,默认启用。

为了在v3.8.0之前的版本中使用OCI实验性支持,请在环境变量中设置HELM_EXPERIMENTAL_OCI

  1. export HELM_EXPERIMENTAL_OCI=1

运行一个注册中心

为测试目的启动注册中心是比较简单的。只要您安装了Docker,运行以下命令即可:

  1. docker run -dp 5000:5000 --restart=always --name registry registry

这样就会启动一个注册服务在 localhost:5000

使用 docker logs -f registry 可以查看日志, docker rm -f registry 可以停止服务。

如果您希望持久化存储,可以在上面的命令中添加 -v $(pwd)/registry:/var/lib/registry

关于更多配置选项,请查看 文档.

注意:macOS上,5000端口可能被”AirPlay Receiver”占用。您可以选择其他本地端口(比如:-p 5001:5000),或者在系统偏好设置中关闭AirPlay。

认证

如果您想启用注册中心认证,需要使用用户名和密码先创建 auth.htpasswd 文件:

  1. htpasswd -cB -b auth.htpasswd myuser mypass

然后启动服务,启动时挂载文件并设置 REGISTRY_AUTH环境变量:

  1. docker run -dp 5000:5000 --restart=always --name registry \
  2. -v $(pwd)/auth.htpasswd:/etc/docker/registry/auth.htpasswd \
  3. -e REGISTRY_AUTH="{htpasswd: {realm: localhost, path: /etc/docker/registry/auth.htpasswd}}" \
  4. registry

用于处理注册中心的命令

registry 子命令

login

登录到注册中心 (手动输入密码)

  1. $ helm registry login -u myuser localhost:5000
  2. Password:
  3. Login succeeded

logout

从注册中心注销

  1. $ helm registry logout localhost:5000
  2. Logout succeeded

The push 子命令

上传chart到注册中心

  1. $ helm push mychart-0.1.0.tgz oci://localhost:5000/helm-charts
  2. Pushed: localhost:5000/helm-charts/mychart:0.1.0
  3. Digest: sha256:ec5f08ee7be8b557cd1fc5ae1a0ac985e8538da7c93f51a51eff4b277509a723

push子命令的额外说明

push子命令只能用于helm package提前创建的.tgz文件。

使用helm push上传chart到OCI注册表时,引用必须以oci://开头,且不能包含基础名称或tag。

注册表引用基础名称是由chart名称推断而来,tag是由chart语义版本推断而来。这是目前的严格要求。( 更多信息)。

某些注册表(如果指定)要求事先创建仓库或者命名空间,或者两者都需要创建。否则,helm push 会出现错误。

如果您已经创建了一个 源文件 (.prov), 且和.tgz文件在同一文件下,会通过push自动上传到注册表。会在 Helm chart manifest生成一个额外的层。

helm-push plugin的用户 (用于上传chart到 ChartMuseum)可能会遇到问题,因为与内置的新的push插件有冲突。 从v0.10.0版本开始,该插件已被命名为cm-push

其他命令

oci://协议的支持同样适用于很多其他子命令。以下是完整列表:

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

注册表的基础名称(chart name)包含了涉及chart下载的任意类型的操作。(相对于helm push被省略的位置)。

下面是一些基于OCI的chart使用上述子命令的示例:

  1. $ helm pull oci://localhost:5000/helm-charts/mychart --version 0.1.0
  2. Pulled: localhost:5000/helm-charts/mychart:0.1.0
  3. Digest: sha256:0be7ec9fb7b962b46d81e4bb74fdcdb7089d965d3baca9f85d64948b05b402ff
  4. $ helm show all oci://localhost:5000/helm-charts/mychart --version 0.1.0
  5. apiVersion: v2
  6. appVersion: 1.16.0
  7. description: A Helm chart for Kubernetes
  8. name: mychart
  9. ...
  10. $ helm template myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
  11. ---
  12. # Source: mychart/templates/serviceaccount.yaml
  13. apiVersion: v1
  14. kind: ServiceAccount
  15. ...
  16. $ helm install myrelease oci://localhost:5000/helm-charts/mychart --version 0.1.0
  17. NAME: myrelease
  18. LAST DEPLOYED: Wed Oct 27 15:11:40 2021
  19. NAMESPACE: default
  20. STATUS: deployed
  21. REVISION: 1
  22. NOTES:
  23. ...
  24. $ helm upgrade myrelease oci://localhost:5000/helm-charts/mychart --version 0.2.0
  25. Release "myrelease" has been upgraded. Happy Helming!
  26. NAME: myrelease
  27. LAST DEPLOYED: Wed Oct 27 15:12:05 2021
  28. NAMESPACE: default
  29. STATUS: deployed
  30. REVISION: 2
  31. NOTES:
  32. ...

指定依赖项

chart的依赖项可用从使用了dependency update命令的注册中心拉取。

Chart.yaml中给定的repository被指定为没有基础名称注册表引用:

  1. dependencies:
  2. - name: mychart
  3. version: "2.7.0"
  4. repository: "oci://localhost:5000/myrepo"

这会在执行dependency update时获取oci://localhost:5000/myrepo/mychart:2.7.0

Helm chart manifest

在注册表中表示的Helm chart manifest示例(注意mediaType字段):

  1. {
  2. "schemaVersion": 2,
  3. "config": {
  4. "mediaType": "application/vnd.cncf.helm.config.v1+json",
  5. "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
  6. "size": 117
  7. },
  8. "layers": [
  9. {
  10. "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
  11. "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
  12. "size": 2487
  13. }
  14. ]
  15. }

下面的示例包含一个 源文件(注意额外层):

  1. {
  2. "schemaVersion": 2,
  3. "config": {
  4. "mediaType": "application/vnd.cncf.helm.config.v1+json",
  5. "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
  6. "size": 117
  7. },
  8. "layers": [
  9. {
  10. "mediaType": "application/vnd.cncf.helm.chart.content.v1.tar+gzip",
  11. "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
  12. "size": 2487
  13. },
  14. {
  15. "mediaType": "application/vnd.cncf.helm.chart.provenance.v1.prov",
  16. "digest": "sha256:3e207b409db364b595ba862cdc12be96dcdad8e36c59a03b7b3b61c946a5741a",
  17. "size": 643
  18. }
  19. ]
  20. }

从chart仓库迁移

从经典 chart 仓库(基于index.yaml)和使用 helm pull一样简单,然后使用helm push上传生成的.tgz文件到注册表。

Deprecated features and strict naming policies

在Helm 3.7.0 之前,Helm的OCI支持略有不同。

为了简化和稳定这个功能集,形成 HIP 6, 做了一些更改:

  • 移除了helm chart子命令
  • 删除了chart缓存(无helm chart list等)
  • OCI 注册表引用现在要以oci://作为前缀
  • 注册表引用的基础名称必须始终匹配chart名称
  • 注册表引用的tag必须始终匹配chart的语义版本(即去掉了latest版本)
  • chart层媒体类型从 application/tar+gzip 切换到了 application/vnd.cncf.helm.chart.content.v1.tar+gzip

感谢您的耐心,Helm团队将继续致力于稳定对OCI注册表的本地支持。