#azure #azure-resource-manager #arm-template #azure-resource-group
#azure #azure-resource-manager #arm-template #azure-resource-group
Вопрос:
Когда я создаю кластер AKS с использованием шаблонов ARM с SystemAssigned
identity
помощью поля in, в созданной форме появляется вторичная группа ресурсов MC_<rg_name>_<cluster_name>_location
. Внутри этой группы находится управляемое удостоверение в форме <cluster-name>-agentpool
, которая Kubelet
использует.
Шаблон arm будет внизу сообщения, но общая структура выглядит следующим образом. Причина, по которой они находятся в отдельных развертываниях, заключается в том, что я развертываю вещи на уровне подписки:
Deployment A
- Microsoft.ContainerService/managedClusters
Deployment B (dependsOn A)
- Microsoft.Authorization/roleAssignments
- contains reference to `nodeResourceGroup` with API version so I made explicit dependsOn for A
Я планирую использовать Azure Pod Identity
so, поэтому мне нужно назначить этому управляемому идентификатору две роли: ManagedIdentityOperator
и VirtualMachineContributor
. У меня есть переменная, которая строит путь к этому идентификатору, который используется в ссылке:
"agentpool-account":[concat(subscription().id, '/resourceGroups/', variables('managedClusterResourceGroup'), '/providers/Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('cluster-name'), '-agentpool')]
"principalId": "[reference(parameters('agentpool-account'), '2018-11-30', 'full').properties.principalId]",
Однако при первом развертывании этого шаблона (т. Е. При создании кластера) RoleAssignment
Развертывание завершится неудачно из-за Resource Group not found
ошибки. Просмотр действия развертывания подтверждает, что RoleAssignment
оно развернуто до MC_group
создания, несмотря на наличие явного dependsOn
указания на развертывание кластера. И если я повторно разверну шаблон, он будет успешным, потому MC_group
что теперь он существует в соответствии с ARM.
Мне было интересно, сталкивался ли кто-нибудь еще с этой проблемой, и любые советы о том, как ее решить, были бы замечательными. Я наткнулся на ссылку https://bmoore-msft.blog/2020/07/26/resource-not-found-dependson-is-not-working / но, похоже, у меня это не работает.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"parameters": {
"cluster-name": {
"metadata": {
"description": "The name of the cluster"
},
"type": "string"
},
},
"resources": [
{
"apiVersion": "2019-10-01",
"location": "centralus",
"name": "test",
"type": "Microsoft.Resources/resourceGroups"
},
{
"apiVersion": "2020-06-01",
"dependsOn": [
"[resourceId('Microsoft.Resources/resourceGroups', 'test')]"
],
"name": "cluster-deployment",
"properties": {
"expressionEvaluationOptions": {
"scope": "outer"
},
"mode": "Incremental",
"parameters": {},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {},
"resources": [
{
"apiVersion": "2019-06-01",
"dependsOn": [],
"identity": {
"type": "SystemAssigned"
},
"location": "centralus",
"name": "[parameters('cluster-name')]",
"properties": {
"addonProfiles": {
"azurePolicy": {
"enabled": false
},
"httpApplicationRouting": {
"enabled": false
}
},
"agentPoolProfiles": [
{
"availabilityZones": [
"1",
"2",
"3"
],
"count": 3,
"maxPods": 110,
"mode": "System",
"name": "agentpool",
"osDiskSizeGB": 0,
"osType": "Linux",
"storageProfile": "ManagedDisks",
"type": "VirtualMachineScaleSets",
"vmSize": "Standard_D16s_v3"
}
],
"apiServerAccessProfile": {
"enablePrivateCluster": false
},
"dnsPrefix": "[concat(parameters('cluster-name'), '-dns')]",
"enableRBAC": true,
"kubernetesVersion": "1.17.11",
"networkProfile": {
"loadBalancerSku": "standard",
"networkPlugin": "kubenet",
"networkPolicy": "calico"
}
},
"tags": {},
"type": "Microsoft.ContainerService/managedClusters"
}
],
"variables": {}
}
},
"resourceGroup": "test",
"type": "Microsoft.Resources/deployments"
},
{
"apiVersion": "2020-06-01",
"dependsOn": [
"cluster-deployment"
],
"name": "identity-assignment",
"properties": {
"expressionEvaluationOptions": {
"scope": "outer"
},
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"outputs": {},
"parameters": {},
"resources": [
{
"apiVersion": "2017-09-01",
"name": "[guid('test', 'ManagedIdentityOperator')]",
"properties": {
"principalId": "[reference(variables('agentpoolResourceId'), '2018-11-30', 'full').properties.principalId]",
"roleDefinitionId": "[variables('managedIdentityOperatorRoleId')]",
"scope": "[concat(subscription().id, '/resourceGroups/test')]"
},
"type": "Microsoft.Authorization/roleAssignments"
},
{
"apiVersion": "2017-09-01",
"name": "[guid('test', 'VirtualMachineContributor')]",
"properties": {
"principalId": "[reference(variables('agentpoolResourceId'), '2018-11-30', 'full').properties.principalId]",
"roleDefinitionId": "[variables('virtualMachineContributorRoleId')]",
"scope": "[concat(subscription().id, '/resourceGroups/test')]"
},
"type": "Microsoft.Authorization/roleAssignments"
}
]
}
},
"resourceGroup": "test",
"type": "Microsoft.Resources/deployments"
}
],
"variables": {
"agentPoolResourceId": "[concat(subscription().id, '/resourceGroups/', variables('managedClusterResourceGroup'), '/providers/Microsoft.ManagedIdentity/userAssignedIdentities/', parameters('cluster-name'), '-agentpool')]",
"managedClusterResourceGroup": "[concat('MC_test_', parameters('cluster-name'), '_centralus')]",
"managedIdentityOperatorRoleId": "[concat(subscription().id, '/providers/Microsoft.Authorization/roleDefinitions/f1a07417-d97a-45cb-824c-7a7467783830')]",
"virtualMachineContributorRoleId": "[concat(subscription().id, '/providers/Microsoft.Authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c')]"
}
}
Ответ №1:
Попробуйте прикрепленный… Я подозреваю, что проблема, с которой вы столкнулись, заключается в том, что идентификатор systemAssigned (он же MSI) не был глобально реплицирован к моменту выполнения назначения роли. Чтобы исправить это, вы можете добавить principalType
свойство в roleAssigment, и это приведет к принудительному назначению, даже если принципал (т. Е. MSI) еще не найден. Вероятно, это простое решение.
Кроме того, я немного изменил шаблон, чтобы удалить второе развертывание, чтобы это могло показать большую разницу, чем вам на самом деле нужно, но просто другой подход к нему.
{
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
"contentVersion": "1.0.0.1",
"parameters": {
"cluster-name": {
"type": "string",
"defaultValue": "mc1"
},
"resourceGroupName": {
"type": "string",
"defaultValue": "test"
}
},
"resources": [
{
"type": "Microsoft.Resources/resourceGroups",
"apiVersion": "2019-10-01",
"location": "centralus",
"name": "[parameters('resourceGroupName')]"
},
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2020-06-01",
"name": "cluster-deployment",
"resourceGroup": "[parameters('resourceGroupName')]",
"dependsOn": [
"[subscriptionResourceId('Microsoft.Resources/resourceGroups', 'test')]"
],
"properties": {
"expressionEvaluationOptions": {
"scope": "inner"
},
"mode": "Incremental",
"parameters": {
"cluster-name":{
"value": "[parameters('cluster-name')]"
}
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"cluster-name": {
"type": "string"
}
},
"variables": {
"managedIdentityOperatorRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'f1a07417-d97a-45cb-824c-7a7467783830')]",
"virtualMachineContributorRoleId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '9980e02c-c2be-4d73-94e8-173b1dc7cf3c')]"
},
"resources": [
{
"type": "Microsoft.ContainerService/managedClusters",
"apiVersion": "2020-11-01",
"name": "[parameters('cluster-name')]",
"location": "centralus",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"addonProfiles": {
"azurePolicy": {
"enabled": false
},
"httpApplicationRouting": {
"enabled": false
}
},
"agentPoolProfiles": [
{
"availabilityZones": [
"1",
"2",
"3"
],
"count": 3,
"maxPods": 110,
"mode": "System",
"name": "agentpool",
"osDiskSizeGB": 0,
"osType": "Linux",
"storageProfile": "ManagedDisks",
"type": "VirtualMachineScaleSets",
"vmSize": "Standard_D16s_v3"
}
],
"apiServerAccessProfile": {
"enablePrivateCluster": false
},
"dnsPrefix": "[concat(parameters('cluster-name'), '-dns')]",
"enableRBAC": true,
"kubernetesVersion": "1.17.11",
"networkProfile": {
"loadBalancerSku": "standard",
"networkPlugin": "kubenet",
"networkPolicy": "calico"
}
}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2017-09-01",
"name": "[guid('test', 'ManagedIdentityOperator')]",
"properties": {
"principalId": "[reference(parameters('cluster-name'), '2020-11-01', 'full').identity.principalId]",
"roleDefinitionId": "[variables('managedIdentityOperatorRoleId')]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
},
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2017-09-01",
"name": "[guid('test', 'VirtualMachineContributor')]",
"properties": {
"principalId": "[reference(parameters('cluster-name'), '2020-11-01', 'full').identity.principalId]",
"roleDefinitionId": "[variables('virtualMachineContributorRoleId')]",
"scope": "[resourceGroup().id]",
"principalType": "ServicePrincipal"
}
}
]
}
}
}
]
}
LMK, если у вас есть какие-либо вопросы о других изменениях…
Комментарии:
1. Спасибо за ответ! На предыдущей итерации я фактически использовал эту точную ссылку на идентификатор, назначенный системой. Однако, когда я приступил к настройке
AAD Pod Identity
, я понял, что (по умолчанию) ожидаемое управляемое удостоверение — это не системное, а скорее присвоенное пользователем удостоверение в форме<cluster-name>-agentpool
. Учетная запись agentpool — это ресурс, который находится внутриMC_group
, и проверка того, чтоMC_group
он существует, — это то, что для меня не работает.2. Кажется, я нашел способ обойти это, и это процесс, аналогичный тому, что я нашел в вашем блоге. По сути, я превратил
ManagedCluster
развертывание вinner
развертывание области и выводreference('cluster-name').nodeResourceGroup
. Затем я передаю это значение в качестве параметра в отдельное развертывание назначений ролей в том же родительском шаблоне, и все работает с первого прохода.3. Добавьте
"principalType": "ServicePrincipal"
, и это сработает … спасибо, Брайан! (должно быть в документах действительно)4. вы правы, так и должно быть — где вы смотрели, я посмотрю, смогу ли я его обновить…