从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
相关产品推荐
相关产品推荐

