AKS. 无法从 ACR 中拉取镜像。

36

我试图使用一个密钥从ACR拉取镜像,但无法成功。

我使用Azure CLI命令创建资源:

az login
az provider register -n Microsoft.Network
az provider register -n Microsoft.Storage
az provider register -n Microsoft.Compute
az provider register -n Microsoft.ContainerService

az group create --name aksGroup --location westeurope

az aks create --resource-group aksGroup --name aksCluster --node-count 1 --generate-ssh-keys -k 1.9.2
az aks get-credentials --resource-group aksGroup --name aksCluster

az acr create --resource-group aksGroup --name aksClusterRegistry --sku Basic --admin-enabled true

然后我登录并成功地将镜像推送到从本地机器创建的 ACR。

docker login aksclusterregistry.azurecr.io
docker tag jetty aksclusterregistry.azurecr.io/jetty
docker push aksclusterregistry.azurecr.io/jetty

接下来的步骤是创建一个秘密:

kubectl create secret docker-registry secret --docker-server=aksclusterregistry.azurecr.io --docker-username=aksClusterRegistry --docker-password=<Password from tab ACR/Access Keys> --docker-email=some@email.com

最终,我试图使用来自ACR的镜像创建Pod:

#pod.yml
apiVersion: v1
kind: Pod
metadata:
  name: jetty
spec:
  containers:
  - name: jetty
    image: aksclusterregistry.azurecr.io/jetty
  imagePullSecrets:
  - name: secret

kubectl create -f pod.yml

结果是我有一个状态为ImagePullBackOff的pod:

>kubectl get pods
NAME                    READY     STATUS             RESTARTS   AGE
jetty                   0/1       ImagePullBackOff   0          1m
> kubectl describe pod jetty
Events:
  Type     Reason                 Age              From                               Message
  ----     ------                 ----             ----                               -------
  Normal   Scheduled              2m               default-scheduler                  Successfully assigned jetty to aks-nodepool1-62963605-0
  Normal   SuccessfulMountVolume  2m               kubelet, aks-nodepool1-62963605-0  MountVolume.SetUp succeeded for volume "default-token-w8png"
  Normal   Pulling                2m (x2 over 2m)  kubelet, aks-nodepool1-62963605-0  pulling image "aksclusterregistry.azurecr.io/jetty"
  Warning  Failed                 2m (x2 over 2m)  kubelet, aks-nodepool1-62963605-0  Failed to pull image "aksclusterregistry.azurecr.io/jetty": rpc error: code = Unknown desc = Error response from daemon: Get https://aksclusterregistry.azurecr.io/v2/jetty/manifests/latest: unauthorized: authentication required
  Warning  Failed                 2m (x2 over 2m)  kubelet, aks-nodepool1-62963605-0  Error: ErrImagePull
  Normal   BackOff                2m (x5 over 2m)  kubelet, aks-nodepool1-62963605-0  Back-off pulling image "aksclusterregistry.azurecr.io/jetty"
  Normal   SandboxChanged         2m (x7 over 2m)  kubelet, aks-nodepool1-62963605-0  Pod sandbox changed, it will be killed and re-created.
  Warning  Failed                 2m (x6 over 2m)  kubelet, aks-nodepool1-62963605-0  Error: ImagePullBackOff

出了什么问题?为什么使用秘密方式不起作用? 请不要建议我使用服务主体的方式,因为我想知道为什么这种方法不起作用。我认为它应该可以工作。


这看起来没问题,应该可以工作。服务主体在这里并不重要。 - 4c74356b41
2
但它不起作用。 - typik89
好的,请检查Docker凭据。我强烈建议使用小写用户名。 - 4c74356b41
3个回答

29

使用 AKS 的“旧方法”是按照你提到的方式执行 create secret。这种方法现在已不再建议使用。

“新方法”是附加容器注册表。 此文章 解释了如何使用“新方法”来附加 ACR,还提供了旧方法的链接以消除混淆。当你创建集群时,请使用以下命令进行附加:

az aks create -n myAKSCluster -g myResourceGroup --attach-acr $MYACR

或者,如果您已经创建了自己的集群,请使用以下命令进行更新:

az aks update -n myAKSCluster -g myResourceGroup --attach-acr $MYACR

备注:

  • $MYACR是你的注册表的名称,但不包括 .azurecr.io。例如:MYACR=foobar而不是MYACR=foobar.azurecr.io

  • 在连接你的ACR后,需要几分钟时间才能将 ImagePullBackOff 状态转换为 Running


1
这应该是被接受的答案,谢谢! - Veve
非常感谢您的回答。 - Sapnandu

13

8
可以。但是请问一下,为什么使用管理员帐户的方式不起作用呢?因为我可以使用本地 Docker 中的管理员帐户连接到 ACR。另外,我该如何获取 SP 密码或在创建后重置它呢?我在门户上没有找到这些信息,并且我也没有找到可以帮助我的命令。 - typik89
1
我也有同样的问题,想知道为什么这种方法有效而原来的方法无效。 - Asu

1

这不完全是问题的情况。但我在使用“附加ACR方法”时遇到了类似的问题。我的问题是注册表名称中的大写字符。以下警告由az cli生成。

Uppercase characters are detected in the registry name. When using its server url in docker commands, to avoid authentication errors, use all lowercase

因此,请确保在Docker命令中使用ACR网址时全部使用小写字母。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接