Шаблон Azure ARM зависит от того, не работает (успешно при повторном развертывании)

Когда я создаю кластер AKS с использованием шаблонов ARM с SystemAssigned в поле identity, создается вторичная группа ресурсов в форме MC_<rg_name>_<cluster_name>_location. Внутри этой группы находится управляемая личность в форме <cluster-name>-agentpool, которую использует Kubelet.

Шаблон руки будет внизу стойки, но общая структура следующая. Причина, по которой я использую их в отдельных развертываниях, заключается в том, что я развертываю их на уровне подписки:

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, поэтому мне нужно назначить этому управляемому удостоверению две роли: 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')]"
  }
}

person corgc0der    schedule 18.11.2020    source источник


Ответы (1)


Попробуйте прикрепить ... Я подозреваю, что проблема, с которой вы столкнулись, заключается в том, что идентификатор systemAssigned (он же MSI) не реплицируется глобально к моменту выполнения roleAssignment. Чтобы исправить это, вы можете добавить свойство 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, если у вас есть вопросы по другим изменениям ...

person bmoore-msft    schedule 19.11.2020
comment
Спасибо за ответ! В предыдущей итерации я фактически использовал эту точную ссылку на идентификатор, присвоенный системой. Однако, когда я приступил к настройке AAD Pod Identity, я понял, что (по умолчанию) ожидаемый управляемый идентификатор - это не идентификатор, назначенный системой, а скорее идентификатор, назначенный пользователем в форме <cluster-name>-agentpool. Учетная запись пула агентов - это ресурс, который живет внутри MC_group, и проверка того, что MC_group существует, - вот что для меня не работает. - person corgc0der; 19.11.2020
comment
Кажется, я нашел способ обойти это, и это процесс, аналогичный тому, что я нашел в вашем блоге. Я фактически превратил развертывание ManagedCluster в развертывание inner области действия и вывел reference('cluster-name').nodeResourceGroup. Затем я перенаправляю это значение в качестве параметра в отдельное развертывание назначений ролей в том же родительском шаблоне, и все работает на первом проходе. - person corgc0der; 19.11.2020
comment
Добавьте "principalType": "ServicePrincipal", и он работает ... спасибо, Брайан! (действительно должно быть в документации) - person Peter; 09.06.2021
comment
ты прав должен - где ты смотрел, посмотрю, смогу ли обновить ... - person bmoore-msft; 10.06.2021