我当前在尝试提取通过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上托管的私有存储库中拉出。
这里有没有什么明显的东西让我无法从私有repos中提取,这样我就可以在本地机器上使用它们了?
发布于 2020-06-17 13:04:46
要在本地获取ECR镜像,您需要登录ECR并获取docker镜像。而如果你在Kubernetes上,你必须使用secret来存储ECR登录详细信息,并且每次都要使用它来从ECR中提取图像。
这里是shell脚本如果您在Kubernetes上,它将自动从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}"YAML文件中使用的imagePullSecret,用于拉取私有docker repos的存储密钥。
https://github.com/harsh4870/ECR-Token-automation/blob/master/aws-token.sh
发布于 2020-06-17 12:02:57
当集群中的节点启动容器时,它需要访问私有注册表的凭据才能拉取镜像。即使您已经在本地计算机上进行了身份验证,节点也不能重用登录,因为根据设计,它可能在另一台计算机上运行;因此您必须在pod模板中提供凭据。请遵循以下指南来执行此操作:
https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
基本上,您将ECR凭证存储为秘密,并在容器规范的imagePullSecret中提供它。然后,pod将能够每次都拉取图像。
如果您在本地机器上运行集群进行开发,您甚至不需要这样做。您可以通过将容器规范下的imagePullPolicy设置为IfNotPresent,或者对您的镜像使用特定的标签而不是latest,让pod重用已下载到本地缓存的镜像。
https://stackoverflow.com/questions/62420919
复制相似问题