Зависимость от шаблона Azure ARM не работает (выполняется успешно при повторном развертывании)

#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. вы правы, так и должно быть — где вы смотрели, я посмотрю, смогу ли я его обновить…