注册中心

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

激活对 OCI 的支持

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

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

export HELM_EXPERIMENTAL_OCI=1

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

运行一个注册中心

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

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 文件:

htpasswd -cB -b auth.htpasswd myuser mypass

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

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

用于处理注册中心的命令

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

registry 子命令

login

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

$ helm registry login -u myuser localhost:5000
Password:
Login succeeded

logout

从注册中心注销

$ helm registry logout localhost:5000
Logout succeeded

The chart 子命令

save

保存chart目录到本地缓存

$ helm chart save mychart/ localhost:5000/myrepo/mychart:2.7.0
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
2.7.0: saved

list

列举出所有的chart

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

export

导出chart到目录

$ helm chart export localhost:5000/myrepo/mychart:2.7.0
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
Exported chart to mychart/

push

推送chart到远程

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

remove

从缓存中移除chart

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

pull

从远程拉取chart

$ helm chart pull localhost:5000/myrepo/mychart:2.7.0
2.7.0: Pulling from localhost:5000/myrepo/mychart
ref:     localhost:5000/myrepo/mychart:2.7.0
digest:  1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
size:    2.4 KiB
name:    mychart
version: 0.1.0
Status: Downloaded newer chart for localhost:5000/myrepo/mychart:2.7.0

指定依赖项

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

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

dependencies:
  - name: mychart
    version: "2.7.0"
    repository: "oci://localhost:5000/myrepo"

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

我的chart在哪里?

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

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

$ tree ~/Library/Caches/helm/
/Users/myuser/Library/Caches/helm/
└── registry
    ├── cache
    │   ├── blobs
    │   │   └── sha256
    │   │       ├── 1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617
    │   │       ├── 31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef
    │   │       └── 8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111
    │   ├── index.json
    │   ├── ingest
    │   └── oci-layout
    └── config.json

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

$ cat ~/Library/Caches/helm/registry/cache/index.json  | jq
{
  "schemaVersion": 2,
  "manifests": [
    {
      "mediaType": "application/vnd.oci.image.manifest.v1+json",
      "digest": "sha256:31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef",
      "size": 354,
      "annotations": {
        "org.opencontainers.image.ref.name": "localhost:5000/myrepo/mychart:2.7.0"
      }
    }
  ]
}

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

$ cat ~/Library/Caches/helm/registry/cache/blobs/sha256/31fb454efb3c69fafe53672598006790122269a1b3b458607dbe106aba7059ef | jq
{
  "schemaVersion": 2,
  "config": {
    "mediaType": "application/vnd.cncf.helm.config.v1+json",
    "digest": "sha256:8ec7c0f2f6860037c19b54c3cfbab48d9b4b21b485a93d87b64690fdb68c2111",
    "size": 117
  },
  "layers": [
    {
      "mediaType": "application/tar+gzip",
      "digest": "sha256:1b251d38cfe948dfc0a5745b7af5ca574ecb61e52aed10b19039db39af6e1617",
      "size": 2487
    }
  ]
}

从chart仓库迁移

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