执行
helm repo add
时出现以下错误:
Error: could not find protocol handler for: ecr
我在不同的 helm 版本(3.8.0、3.10.1、3.12)上收到此错误。
查看 helm registries 文档,看起来 helm 最新版本原生支持 OCI(AWS ECR 使用的图像规范),但您仍然需要 ECR 插件才能使其工作。
我发现工作的插件是helm-ecr
:
helm plugin install https://github.com/vetyy/helm-ecr.git
helm
兼容,其中包括
helm CLI
,您不需要 ECR 的 helm 插件。
创建/打包 OCI 映像:
在现有的 helm 存储库中,确保图表名称按照Chart.yaml
中的预期编写,还要确保您正在使用文件的
version
字段跟踪应用程序的版本。将图表打包为:
$ helm package <chart-name>
<chart-name>-<version>.tgz
的文件,这是一个有效的 OCI 映像,可以部署在集群上并且与 AWS ECR 兼容。 例如。
nginx-0.1.6.tgz
将图表上传到AWS ECR:
<registry-name>/<chart-name>
例如
Suppose your Chart name is nginx-on-steroids and you want your registry to be called my-company-name (This is just a name, can be anything, keep it common for all charts of the org for similar setup of cluster)
The ECR Repo should be created with name : "my-company-name/nginx-on-steroids"
$ aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
$ aws ecr get-login-password --region <region> | helm registry login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
都将凭证存储在同一位置。
.tgz
图表推送到注册表:
$ helm push <chart-name> <registry>
例如。
$ helm push nginx-on-steroids my-company-name
Pushed: ***.dkr.ecr.<region>.amazonaws.com/my-company-name/nginx-on-steroids:0.1.6
Digest: sha256:c1bd780f358afcd1efd3d5144683b259fcf3e4424be1409735b04fed3f389fads
直接使用集群中的OCI镜像:
按照上述方式登录ECR,然后您可以执行以下操作:A.本地拉取镜像:
$ helm pull oci://<aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-company-name/nginx-on-steroids --version 0.1.6
$ helm install my-new-release-nginx oci://<aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-company-name/nginx-on-steroids --version 0.1.6
使用Cluster中的OCI Image作为子图:
如上所述登录 ECR,然后在要使用 OCI 图像作为子图表的图表的Chart.yaml
中,添加图像的依赖项,例如:
apiVersion: v2
name: mega-project
description: A super duper project
type: application
version: 0.1.0
appVersion: "0.1.0"
dependencies:
- name: nginx-on-steroids
repository: "oci://<aws_account_id>.dkr.ecr.<region>.amazonaws.com/my-company-name"
version: "0.1.6"
注意:存储库没有图表名称,只有注册表名称。
在 Values.yaml 中,通过创建一个具有子图表名称的部分,将值传递给子图表:
nameOverride: blah
...
nginx-on-steroids:
serviceAccountName: something-else
...
打包图:
https://helm.sh/blog/storing-charts-in-oci/
处理注册表:https://helm.sh/docs/topics/registries/
使用 ECR:https://docs.aws.amazon.com/AmazonECR/latest/userguide/push-oci-artifact.html