注册中心

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

激活对 OCI 的支持

当前的对 OCI 的支持被认为具有实验性

为了能使用下面描述的命令,需要在环境变量中设置 HELM_EXPERIMENTAL_OCI

  1. export HELM_EXPERIMENTAL_OCI=1

有关此功能的详细信息及一般可用性计划,请参阅 OCI支持Helm改进的建议.

运行一个注册中心

为测试目的启动注册中心是比较简单的。只要你安装了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

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

认证

如果您想启用注册中心认证,需要使用用户名和密码先创建 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

用于处理注册中心的命令

helm registryhelm chart 下的命令都可以用来操作注册中心和本地缓存。

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 chart 子命令

save

保存chart目录到本地缓存

  1. $ helm chart save mychart/ localhost:5000/myrepo/mychart:2.7.0
  2. ref: localhost:5000/myrepo/mychart:2.7.0
  3. digest: 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
  4. size: 2.4 KiB
  5. name: mychart
  6. version: 0.1.0
  7. 2.7.0: saved

list

列举出所有的chart

  1. $ helm chart list
  2. REF NAME VERSION DIGEST SIZE CREATED
  3. localhost:5000/myrepo/mychart:2.7.0 mychart 2.7.0 84059d7 454 B 27 seconds
  4. localhost:5000/stable/acs-engine-autoscaler:2.2.2 acs-engine-autoscaler 2.2.2 d8d6762 4.3 KiB 2 hours
  5. localhost:5000/stable/aerospike:0.2.1 aerospike 0.2.1 4aff638 3.7 KiB 2 hours
  6. localhost:5000/stable/airflow:0.13.0 airflow 0.13.0 c46cc43 28.1 KiB 2 hours
  7. localhost:5000/stable/anchore-engine:0.10.0 anchore-engine 0.10.0 3f3dcd7 34.3 KiB 2 hours
  8. ...

export

导出chart到目录

  1. $ helm chart export localhost:5000/myrepo/mychart:2.7.0
  2. ref: localhost:5000/myrepo/mychart:2.7.0
  3. digest: 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
  4. size: 2.4 KiB
  5. name: mychart
  6. version: 0.1.0
  7. Exported chart to mychart/

push

推送chart到远程

  1. $ helm chart push localhost:5000/myrepo/mychart:2.7.0
  2. The push refers to repository [localhost:5000/myrepo/mychart]
  3. ref: localhost:5000/myrepo/mychart:2.7.0
  4. digest: 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
  5. size: 2.4 KiB
  6. name: mychart
  7. version: 0.1.0
  8. 2.7.0: pushed to remote (1 layer, 2.4 KiB total)

remove

从缓存中移除chart

  1. $ helm chart remove localhost:5000/myrepo/mychart:2.7.0
  2. 2.7.0: removed

pull

从远程拉取chart

  1. $ helm chart pull localhost:5000/myrepo/mychart:2.7.0
  2. 2.7.0: Pulling from localhost:5000/myrepo/mychart
  3. ref: localhost:5000/myrepo/mychart:2.7.0
  4. digest: 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
  5. size: 2.4 KiB
  6. name: mychart
  7. version: 0.1.0
  8. Status: Downloaded newer chart for localhost:5000/myrepo/mychart:2.7.0

指定依赖项

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

成功拉取依赖后,注册中心的镜像名字必须和chart名字匹配,tag必须匹配chart的版本。Chart.yaml中的仓库条目指向注册中心的仓库名称, 而不是镜像名称。

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

执行dependency update之后就可以获取到localhost:5000/myrepo/mychart:2.7.0

我的chart在哪里?

使用上述命令存储的chart会被缓存到文件系统中。

OCI 镜像设计规范 严格遵守文件系统布局的。例如:

  1. $ tree ~/Library/Caches/helm/
  2. /Users/myuser/Library/Caches/helm/
  3. └── registry
  4. ├── cache
  5. ├── blobs
  6. └── sha256
  7. ├── 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
  8. ├── 31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef
  9. └── 8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111
  10. ├── index.json
  11. ├── ingest
  12. └── oci-layout
  13. └── config.json

index.json示例, 包含了所有的Helm chart manifests的参考:

  1. $ cat ~/Library/Caches/helm/registry/cache/index.json | jq
  2. {
  3. "schemaVersion": 2,
  4. "manifests": [
  5. {
  6. "mediaType": "application/vnd.oci.image.manifest.v1+json",
  7. "digest": "sha256:31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef",
  8. "size": 354,
  9. "annotations": {
  10. "org.opencontainers.image.ref.name": "localhost:5000/myrepo/mychart:2.7.0"
  11. }
  12. }
  13. ]
  14. }

Helm chart manifest示例 (注意 mediaType 字段):

  1. $ cat ~/Library/Caches/helm/registry/cache/blobs/sha256/31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef | jq
  2. {
  3. "schemaVersion": 2,
  4. "config": {
  5. "mediaType": "application/vnd.cncf.helm.config.v1+json",
  6. "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
  7. "size": 117
  8. },
  9. "layers": [
  10. {
  11. "mediaType": "application/tar+gzip",
  12. "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
  13. "size": 2487
  14. }
  15. ]
  16. }

从chart仓库迁移

从经典 chart 仓库 (基于index.yaml的仓库) 尽量简单地 helm fetch (Helm 2 CLI), helm chart save, helm chart push

Prev← Chart仓库指南

NextHelm 架构 →