无法使用 AKS 和 ACR 拉取新镜像。

3

我突然在使用AKS从Azure容器注册表中拉取最新镜像时遇到了问题(之前可以正常工作)。

如果我运行以下命令:

kubectl describe pod <podid> I get:


Failed to pull image <image>: rpc error: code = Unknown desc = Error response from daemon: Get <image>: unauthorized: authentication required

我尝试手动登录 ACR,一切正常 - 新的镜像已经正确地推送了,我可以手动拉取它们。

此外,我还尝试过:

az aks update -g MyResourceGroup -n MyManagedCluster --attach-acr acrName

虽然成功了(没有错误,有输出传播成功),但仍然不起作用。

我尝试使用以下方式更新凭据:

az aks update-credentials --resource-group <group>--name <aks name>--reset-service-principal --service-principal <sp id> --client-secret <client-secret>

这将会输出一个相当奇怪的信息:

Deployment failed. Correlation ID: 6e84754a-821d-4a39-a0df-7ab9ba21973f. 
Unable to get log analytics workspace info. Resource ID: 
/subscriptions/<subscription id>/resourcegroups/defaultresourcegroup- 
weu/providers/microsoft.operationalinsights/workspaces/defaultworkspace- 
d259e6ea-8230-4cb0-a7a8-7f0df6c7ef18-weu. Details: autorest/azure: Service 
returned an error. Status=404 Code="ResourceGroupNotFound" 
Message="Resource group 'defaultresourcegroup-weu' could not be found.". For 
more details about how to create and use log analytics workspace,  please 
refer to: https://aka.ms/new-log-analytics

我尝试创建了一个新的日志分析工作区,但出现了上述错误。

我还尝试了以下步骤:

此链接

这篇SO文章

以及这篇文章

除了以上文章,我还查阅了许多教程和Microsoft页面来尝试解决问题。

我已经尝试过创建新的服务主体并为其分配适当的角色,但仍然存在该错误。 我也曾尝试创建新的密钥,但没有成功。

我的不需要新映像的Pod都按预期运行。 如果我查看我的应用程序注册(在Azure活动目录下),它们都是一年前创建的 - 所以我担心某些内容已经过期,而我不知道如何解决。


建议使用ACR资源ID更好。当您更新服务主体时出现错误,显示找不到资源组。所以您是否检查了组是否正确?并且尝试重置AKS的服务主体凭据了吗? - Charles Xu
2个回答

3

有两种方法可以解决这个问题

  1. 将ACR映射到AKS

CLIENT_ID=$(az aks show --resource-group $AKS_RESOURCE_GROUP --name 
$AKS_CLUSTER_NAME --subscription $SUBSCRIPTION_ID --query "servicePrincipalProfile.clientId" --output tsv)

ACR_ID=$(az acr show --name $ACR_NAME --resource-group $ACR_RESOURCE_GROUP --subscription $SUBSCRIPTION_ID --query "id" --output tsv)

az role assignment create --assignee $CLIENT_ID --role Reader --scope $ACR_ID

另一种方法是添加镜像拉取密钥,该密钥的类型将为kubernetes.io/dockerconfigjson

操作步骤如下 -

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

然后,您可以在部署文件中将此密码作为imagePullSecret引用,这样就不会出现身份验证错误。

添加imagepullsecret是有效的 - 但第一种方法仍然不起作用 - 即使命令似乎运行正确(仍然抛出相同的错误)。我真的很想知道为什么会这样。 - adrian
你有提到订阅 ID 吗?还有我分享的命令! - Tushar Mahajan
我不确定我理解你的意思 - 是在我运行的初始命令中还是在我收到的响应中? - adrian
我刚刚编辑了答案,在那里添加了订阅 ID。 - Tushar Mahajan
在 Azure 上,ACR 和 AKS 的订阅是否匹配?还是它们是不同的? - Tushar Mahajan
显示剩余2条评论

2

通过以下命令禁用 Log Analytics 插件,使其正常工作:

az aks disable-addons -a monitoring -n <AKSName> -g <ResourceGroupName>

根据我发布的错误消息之一,似乎我的日志分析只是导致事情崩溃(不确定为什么),因此暂时禁用它,并能够使用以下命令更新凭据:

az aks update-credentials --resource-group <group>--name <aks name>--reset-service-principal --service-principal <sp id> --client-secret <client-secret>


1
太棒了,谢谢。我们已经尝试了其他所有方法,但都无济于事。 - Asu
很高兴我能帮到你。 - adrian

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