You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从AWS ECR部署镜像到Kubernetes遇401 Unauthorized错误求助

AWS ECR镜像拉取Kubernetes 401 Unauthorized问题排查

问题描述

我尝试将AWS ECR中的镜像部署到Kubernetes集群,执行以下命令获取令牌并创建镜像拉取密钥:

TOKEN=`aws ecr get-login-password --region us-east-1 | cut -d' ' -f6`                                                                                                                                       
kubectl delete secret -n default --ignore-not-found awsecr-cred                                                                                                                                           
kubectl create secret -n default docker-registry awsecr-cred --docker-server=123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway --docker-username=AWS --docker-password=$TOKEN --namespace=default

但Pod日志显示拉取镜像123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway:0.0.1时出现401未授权错误:

Failed to pull image "123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway:0.0.1": rpc error: code = Unknown desc = failed to pull and unpack image "123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway:0.0.1": failed to resolve reference "123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway:0.0.1": pulling from host 123456789.dkr.ecr.us-east-1.amazonaws.com failed with status code [manifests 0.0.1]: 401 Unauthorized

单独执行aws ecr get-login-password --region us-east-1 | cut -d' ' -f6能正常获取令牌,请问问题出在哪里?

问题根源及解决方法

  • Docker Server地址错误:创建secret时指定的--docker-server包含了仓库名称test-gateway,但ECR的registry地址应为账号对应的基础域名(123456789.dkr.ecr.us-east-1.amazonaws.com),不能带仓库名。Kubernetes会根据镜像的registry前缀匹配secret,带仓库名的地址无法匹配到镜像拉取请求。
  • 令牌截取冗余且可能出错:新版aws ecr get-login-password直接输出有效身份令牌,无需用cut -d' ' -f6截取。该截取操作来自旧版aws ecr get-login的用法,新版命令返回的令牌本身不含空格,截取后可能因为格式问题导致令牌无效。
  • Pod未关联镜像拉取密钥:即使secret创建正确,也要确保Pod/Deployment的imagePullSecrets字段已配置该awsecr-cred,否则Kubernetes不会使用此密钥拉取镜像。

修正后的命令

# 获取正确令牌,无需截取
TOKEN=$(aws ecr get-login-password --region us-east-1)
# 删除旧secret(如果存在)
kubectl delete secret -n default --ignore-not-found awsecr-cred
# 创建符合要求的镜像拉取secret
kubectl create secret docker-registry awsecr-cred \
  --docker-server=123456789.dkr.ecr.us-east-1.amazonaws.com \
  --docker-username=AWS \
  --docker-password=$TOKEN \
  --namespace=default

验证Pod配置

确保你的Deployment或Pod YAML中包含imagePullSecrets配置:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-gateway
spec:
  replicas: 1
  selector:
    matchLabels:
      app: test-gateway
  template:
    metadata:
      labels:
        app: test-gateway
    spec:
      containers:
      - name: test-gateway
        image: 123456789.dkr.ecr.us-east-1.amazonaws.com/test-gateway:0.0.1
      # 关联镜像拉取密钥
      imagePullSecrets:
      - name: awsecr-cred

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 16:48:16