我该如何找到我的AKS集群的服务主体密码?

14

好的,所以我搞砸了,我不小心对我们的AKS集群运行的服务主体运行了az ad sp reset-credentials命令。现在我们正在收到如下错误:

创建负载均衡器时出错(将重试):获取服务test/admin-api的LB出错:azure.BearerAuthorizer#WithAuthorization:刷新请求的令牌失败:https://management.azure.com/subscriptions/****/resourceGroups/MC_****/providers/Microsoft.Network/loadBalancers?api-version=2017-09-01的状态代码=0 - 原始错误:adal:刷新请求失败。 状态码='401'。响应正文:{"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials. AADSTS50012: Invalid client secret is provided.\r\nTrace ID:****\r\nCorrelation ID:**** \r\nTimestamp: 2018-08-23 12:01:33Z","error_codes":[70002,50012],"timestamp":"2018-08-23 12:01:33Z","trace_id":"****","correlation_id":"****"}

无法拉取镜像“****.azurecr.io/****:****”:rpc错误:代码= Unknown desc =从守护程序中获取错误响应:Get https://****.azurecr.io/v2/****/manifests/****:未经授权:需要验证

现在我想找到服务主体使用的原始客户端密钥,以便我可以将其重新添加为服务主体的密钥。这是我所能想到的唯一解决方案,除非重新创建整个群集。

有什么想法吗?

4个回答

12

最终的解决方案非常简单。

  • 在Azure门户中,导航到名为MC_<resourcegroup>_<aksName>_<region> 的资源组。
  • 单击类型为“虚拟机”的其中一个资源。
  • 向下滚动至“Run command”

Run command

  • 选择“RunShellScript”
  • 输入cat /etc/kubernetes/azure.json并单击“Run”

该命令将返回JSON文件的内容。您需要的属性是aadClientSecret


我在所提及的资源组中找不到我的虚拟机的运行命令。但是我找到了一种替代方法,即通过执行进入集群上的 Azure Pod 之一,因为它们已经挂载了该目录:kubectl exec -it --container azuredisk -n kube-system csi-azuredisk-node-cgncv -- cat /etc/kubernetes/azure.json(将 azuredisk-node-cgncv 替换为您集群中的 Pod 名称)。 - bene96

6

微软推出了更新的解决方案,可用于解决此问题。

https://learn.microsoft.com/zh-cn/azure/aks/update-credentials#update-aks-cluster-with-new-credentials

他们还提到(这并不明显): 默认情况下,AKS 群集会创建一个有效期为一年的服务主体。

此外, 自 Azure CLI 2.0.68 起,不再支持使用“--password”参数来创建具有用户定义密码的服务主体,以防止意外使用弱密码。 因此,更改服务主体密码的初始解决方案已不再适用。


0

在Azure门户中,有新的功能可用于查看群集配置,而无需使用CLI。 前往Azure门户 -> 您的群集资源 -> 概述

在右侧有一个按钮,上面写着“JSON视图”。单击它,您将看到一个包含群集详细信息的json文件。服务主体ID在“servicePrincipalProfile”下可见。


问题是关于服务主体的密码,而不是ID。 - PeterH

0

这是一件让人烦恼的事情。对于您的问题,如果没有进行身份验证,您将无法拉取图像。

首先,您需要找到容器注册表的服务主体。您可以在 Azure 门户中执行此操作并导航到注册表面板,然后您可以像这样找到服务主体:

enter image description here

或者您可以使用 Azure CLI 命令像这样查找注册表 ID:

az acr show --resource-group groupName --name registryName --query id --output tsv

然后使用以下命令查找服务主体 ID:

az role assignment list --scope registryID

您可以选择所需的服务主体。

然后,您可以使用命令kubectl get secretskubectl get secrets secretName -o yaml 来获取密钥的 Token。然后逐一分析检查是否用户名与服务主体ID相同,您可以使用 JWT 等工具来分析密钥 Token。结果将如下所示:

enter image description here

如果用户名与您找到的服务主体ID相同,则该密码就是您想要的。这一步有点麻烦。您应该逐个检查密码,或者您可以找到更好的方法来检查它们。

顺便说一下,当您创建服务主体时,似乎只能看到其密码一次。Azure不会再次显示给您。但是,如果您创建了Kubernetes密钥,密码将存储在其中。


谢谢Charles,但我不认为那会起作用。问题不仅在于集群无法访问ACR。集群使用错误的密码连接到Azure以创建负载均衡器、IP地址等。我不认为该密码存储在K8s secret中。根据文档,“在Kubernetes集群的主节点和代理VM中,服务主体凭据存储在文件/etc/kubernetes/azure.json中”。所以我认为我需要想办法获取那个文件。 - PeterH
@PeterH 我所发布的结果是我测试过的。你可以试一下。就像你说的,秘密存储在文件/etc/kubernetes/azure.json中。主控和代理是容器,文件/etc/kubernetes/azure.json在其中。如果你是对的,你可以在外面检查秘密,或连接到容器内部获取里面的信息。你认为哪种方式更方便呢? - Charles Xu
连接到容器是我的首选,但我如何连接到容器? - PeterH
我尝试了你的方法,但是没有一个令牌符合你展示的格式。我认为这是因为我从未创建过密钥,因为我们没有使用ImagePullSecrets,而只是授予了服务主体访问ACR的权限,所以不需要密钥。 - PeterH
我找到了解决方案,你可以通过Azure门户运行一个命令。我已经在答案中提供了解决方案。 - PeterH

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