You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

EC2上Kubernetes微服务架构内核更新后无法拉取AWS ECR镜像求助

排查EC2 Kubernetes拉取ECR镜像失败的方向

碰到过类似内核更新后ECR镜像拉取失败的情况,结合你的报错(unauthorized: authentication required)和IAM规则无异常的前提,给你几个实际可落地的排查方向:

1. 优先检查ECR凭证助手的有效性

内核更新很容易破坏依赖库或重置工具状态,这是最常见的诱因:

  • 在EC2节点上直接测试凭证助手:运行docker-credential-ecr-login get,然后输入以下内容并回车:
    {"ServerURL":"https://595264310722.dkr.ecr.eu-central-1.amazonaws.com"}
    
    如果返回类似{"Username":"AWS","Password":"xxx"}的有效凭证,说明工具正常;如果报错,直接重新安装AWS ECR凭证助手:重新下载对应系统的docker-credential-ecr-login二进制包,赋予执行权限后放到/usr/bin目录即可。
  • 检查Docker配置文件:查看/etc/docker/config.json~/.docker/config.json,确认是否存在"credsStore": "ecr-login"的配置,内核更新可能意外重置了Docker的凭证存储设置。

2. 验证EC2实例角色的实际权限

虽然你说IAM规则无异常,但还是要确认实例角色是否能正常调用ECR API:

  • 在EC2节点上运行:
    aws ecr get-login-password --region eu-central-1
    
    如果能输出一串长密码,说明实例角色权限正常;如果报错,检查IMDS(实例元数据服务)状态:
    • 运行curl http://169.254.169.254/latest/meta-data/iam/security-credentials/,如果能返回你的实例角色名,说明IMDSv1正常;如果需要IMDSv2,要确认Docker/K8s是否配置了获取token的逻辑——内核更新可能强制启用了IMDSv2但相关组件没适配。可以临时允许IMDSv1测试:sudo sysctl -w net.ipv4.conf.all.route_localnet=1,再重试拉取。

3. 排查Kubernetes层面的认证配置

如果节点层面Docker能拉取,但K8s Pod不行,就要看K8s的配置:

  • 如果你用的是IRSA(IAM Roles for Service Accounts):检查对应ServiceAccount的注解是否正确(比如eks.amazonaws.com/role-arn),同时查看kubelet日志journalctl -u kubelet,看有没有IRSA webhook相关的错误——内核更新后kubelet重启可能导致webhook配置失效。
  • 临时创建测试Secret:先用节点上的aws命令获取ECR登录密码,手动登录Docker,然后把~/.docker/config.json转成K8s Secret:
    kubectl create secret generic ecr-secret --from-file=.dockerconfigjson=~/.docker/config.json --type=kubernetes.io/dockerconfigjson
    
    然后修改Pod的imagePullSecrets引用这个Secret,看是否能拉取镜像,以此排除K8s认证配置的问题。

4. 检查安全模块(SELinux/AppArmor)的变化

内核更新通常会同步更新SELinux政策或AppArmor规则,可能导致Docker权限受限:

  • 检查SELinux状态:运行getenforce,如果是Enforcing模式,临时设置setenforce 0测试,要是能正常拉取了,就需要调整SELinux政策(比如给Docker相关文件添加正确的上下文)。
  • 查看审计日志:tail -f /var/log/audit/audit.log | grep deny,找和docker、ecr相关的拒绝记录,这能精准定位权限被阻断的原因。

内容的提问来源于stack exchange,提问作者LordHW4

火山引擎 最新活动