阿克斯。无法从 acr 拉取映像



我尝试使用秘密从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

怎么了?为什么与秘密无效?请不要建议我与服务校长做法,因为我想理解为什么这种剥夺行不通。我认为它一定是在起作用。

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

这对我来说也很好。也就是说,建议不是使用管理员帐户,而是服务原则。借助SP,您将获得对访问ACR实例访问权限的精细控制(请阅读,撰稿人,所有者(。

此文档包括使用服务原理在AK和ACR之间进行身份验证的两种方法。

https://learn.microsoft.com/en-us/azure/container-registry/container-registry-registry-auth-aks

这不是问题案例。但是我在使用附件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 URL中的所有较低量。

最新更新