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节点上运行:
如果能输出一串长密码,说明实例角色权限正常;如果报错,检查IMDS(实例元数据服务)状态:aws ecr get-login-password --region eu-central-1- 运行
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:
然后修改Pod的kubectl create secret generic ecr-secret --from-file=.dockerconfigjson=~/.docker/config.json --type=kubernetes.io/dockerconfigjsonimagePullSecrets引用这个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




