【问题标题】:How to pull a private container from AWS ECR to a local cluster如何将私有容器从 AWS ECR 拉到本地集群
【发布时间】:2020-10-06 19:04:55
【问题描述】:

我目前在尝试拉取通过 AWS ECR 托管的远程 docker 映像时遇到问题。运行部署时出现此错误

步骤 1)

运行

aws ecr get-login-password --region cn-north-1 | docker login --username AWS --password-stdin xxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn

步骤 2)

运行kubectl create -f backend.yaml

从这里开始:

➜  backend git:(kubernetes-fresh) ✗ kubectl get pods
NAME                      READY   STATUS             RESTARTS   AGE
backend-89d75f7df-qwqdq   0/1     Pending            0          2s

➜  backend git:(kubernetes-fresh) ✗ kubectl get pods
NAME                      READY   STATUS              RESTARTS   AGE
backend-89d75f7df-qwqdq   0/1     ContainerCreating   0          4s

➜  backend git:(kubernetes-fresh) ✗ kubectl get pods
NAME                      READY   STATUS             RESTARTS   AGE
backend-89d75f7df-qwqdq   0/1     ErrImagePull       0          6s

➜  backend git:(kubernetes-fresh) ✗ kubectl get pods
NAME                      READY   STATUS             RESTARTS   AGE
backend-89d75f7df-qwqdq   0/1     ImagePullBackOff   0          7s

然后我运行kubectl describe pod backend,它会输出:

Events:
  Type     Reason     Age                 From               Message
  ----     ------     ----                ----               -------
  Normal   Scheduled  117s                default-scheduler  Successfully assigned default/backend-89d75f7df-qwqdq to minikube
  Normal   Pulling    32s (x4 over 114s)  kubelet, minikube  Pulling image "xxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/baopals:latest"
  Warning  Failed     31s (x4 over 114s)  kubelet, minikube  Failed to pull image "xxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/baopals:latest": rpc error: code = Unknown desc = Error response from daemon: Get https://xxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/v2/baopals/manifests/latest: no basic auth credentials
  Warning  Failed     31s (x4 over 114s)  kubelet, minikube  Error: ErrImagePull
  Warning  Failed     19s (x6 over 113s)  kubelet, minikube  Error: ImagePullBackOff
  Normal   BackOff    4s (x7 over 113s)   kubelet, minikube  Back-off pulling image "xxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/baopals:latest"

主要错误是no basic auth credentials

现在我感到困惑的是,我可以很好地将图像推送到我的 ECR,我也可以推送到我的远程 EKS 集群我觉得基本上我现在唯一不能做的就是从我托管的私有存储库中提取在 ECR 上。

这里有什么明显的东西让我无法从私人存储库中提取,以便我可以在本地机器上使用它们吗?

【问题讨论】:

  • 您是否使用凭据创建了图像拉取机密?
  • @ArghyaSadhu 你能解释一下你的意思吗?
  • 我认为这仅依赖于 docker 而不是 ECR,对吧?还是同样的事情
  • 这适用于任何私有注册表

标签: amazon-web-services docker kubernetes


【解决方案1】:

要在本地获取 ECR 映像,您必须登录 ECR 并获取 docker 映像。而如果您在 Kubernetes 上,则必须使用 secret 来存储 ECR 登录详细信息,并每次都使用它从 ECR 中提取图像。

如果您在 Kubernetes 上,这里的 shell 脚本会自动从 AWS 配置中获取值,否则您可以在脚本开始时更新变量。

ACCOUNT=$(aws sts get-caller-identity --query 'Account' --output text) #aws account number
REGION=ap-south-1                                     #aws ECR region
SECRET_NAME=${REGION}-ecr-registry                    #secret_name
EMAIL=abc@xyz.com                                     #can be anything

TOKEN=`aws ecr --region=$REGION get-authorization-token --output text --query authorizationData[].authorizationToken | base64 -d | cut -d: -f2`

kubectl delete secret --ignore-not-found $SECRET_NAME
kubectl create secret docker-registry $SECRET_NAME \
 --docker-server=https://$ACCOUNT.dkr.ecr.${REGION}.amazonaws.com \
 --docker-username=AWS \
 --docker-password="${TOKEN}" \
 --docker-email="${EMAIL}"

imagePullSecret 在 YAML 文件中用于提取私有 Docker 存储库的存储秘密。

https://github.com/harsh4870/ECR-Token-automation/blob/master/aws-token.sh

【讨论】:

    【解决方案2】:

    当集群中的节点启动容器时,它需要凭据才能访问私有注册表以提取映像。即使您已经在本地机器上进行了身份验证,节点也不能重用登录,因为按照设计它可以在另一台机器上运行;因此您必须在 pod 模板中提供凭据。请按照本指南执行此操作:

    https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

    基本上,您将 ECR 凭据存储为机密,并在容器规范的 imagePullSecret 中提供。 pod 将能够每次都拉取图像。

    如果您在本地机器上运行集群进行开发,您甚至不需要这样做。您可以通过将容器规范下的imagePullPolicy 设置为IfNotPresent,或者为您的图像使用特定标签而不是latest,让pod 重用您下载到本地缓存的图像。

    【讨论】:

    • 好的,谢谢你的链接,我认为这现在更有意义,但是从那个文档我不确定这个错误在说什么,因为我不知道它试图获取什么文件 @987654326 @ 我运行它,但随后得到错误 no such file or directory: --type=kubernetes.io/dockerconfigjson 我确实有它谈论的第一个配置
    • @NooBskie 如果这是原因,您需要删除 括号。或者尝试那里记录的这种方法,您第一次使用kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> 可能会更容易
    猜你喜欢
    • 2020-09-09
    • 2021-12-23
    • 2018-05-17
    • 2021-06-24
    • 1970-01-01
    • 2016-05-30
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多