如何从EKS节点将应用程序镜像重新推送到ECR,以及如何解决“FATA[0000] 无法创建临时单平台镜像,内容摘要未找到”的错误。
介绍在这篇文章里,你会学会如何从EKS节点恢复或推送一个图像到ECR。
最近,我发现一个问题,有一个在ECR仓库中被使用的图片被删除了。那个特定的图片无法通过构建管道重建,因为它已经太旧了,它唯一存在的地方是仍然运行着该pod的EKS节点上。
你将学会如何使用 nerdctl 来从节点恢复你的镜像,以及可能遇到的问题。还会解决“FATA[0000] 创建单平台临时镜像失败”错误。
我的配置- EKS 集群版本 - 1.30.3
- Kubectl - 1.30.1
- Containerd - 1.7.11
- Runc - 1.1.11
从 EKS 节点恢复镜像到私有 ECR 将会在下一节中使用 nerdctl 来完成。
康复
要访问我的Amazon EKS节点,我使用AWS Session Manager。这在控制台中很简单,只需进入实例并点击“连接”按钮。
一旦你在节点上,你可以通过运行以下命令来查找你的镜像:
sudo -s # 切换到 root 用户权限
nerdctl images # 查看节点上的所有镜像
现在,你可以找到你的镜像。在我的情况下,我使用的是 0123456789.dkr.ecr.eu-west-2.amazonaws.com/frontend-prod:v1.0.0,并想将其推送回我的 ECR 仓库中。
nerdctl push 0123456789.dkr.ecr.eu-west-2.amazonaws.com/frontend-prod:v1.0.0
错误[0000] 尝试创建临时单平台镜像“0123456789.dkr.ecr.eu-west-2.amazonaws.com/frontend-prod:v1.0.0-tmp-reduced-platform”失败:内容摘要为 sha256:96526aa774ef0126ad0fe9e9a95764c5fc37f409ab9e97021e7b4775d82bf6fa 未发现
正如你所见,出现了“无法创建临时文件”这样的错误。要解决这个问题,你需要在推送命令时添加额外的标志 — all-platforms。
nerdctl push 0123456789.dkr.ecr.eu-west-2.amazonaws.com/frontend-prod:v1.0.0 --all-platforms
将所有平台的 frontend-prod:v1.0.0 推送到指定的 Docker 注册表。
这将导致另一个错误“401 未授权”。这仅仅意味着你没有使用你的ECR进行身份验证。要解决这个问题,你可以运行以下命令:
执行以下命令来获取登录密码并登录:
aws ecr get-login-password -region eu-west-2 | nerdctl login -username AWS -password-stdin 0123456789.dkr.ecr.eu-west-2.amazonaws.com
现在,再次运行“nerdctl push…”命令时,会返回另一个错误,即 “403 Forbidden”。这个错误表明,与您的EKS节点关联的IAM角色没有权限将图像推送到ECR。为了解决这个问题,您可以临时在IAM角色策略中添加“ecr:PutImage”权限。
到了这一步,当你运行“nerdctl push…”命令时,一切都会顺利进行,你的镜像就会回到你的ECR仓库里。
希望这能帮助你在需要的时候快速恢复图片。
在这个过程中用到的命令:
nerdctl images
nerdctl push 0123456789.dkr.ecr.eu-west-2.amazonaws.com/frontend-prod:v1.0.0 --all-platforms
aws ecr get-login-password --region eu-west-2 | nerdctl login --username AWS --password-stdin 0123456789.dkr.ecr.eu-west-2.amazonaws.com # 使用管道传输密码
瑞典帮我一把
[在 GitHub Sponsors 上支持 @marcincuber
大家好,我是 Marcin,我是一名技术主管,专注于 DevOps 领域。我也是 AWS 认证专家……](https://github.com/sponsors/marcincuber?source=post_page-----15e37b661733--------------------------------)
和我在Medium上发表的其他故事一样,我在文中提到的任务都完成了。这是我自己的研究和遇到的一些问题之类的。
谢谢大家的阅读,Marcin Cuber