Ошибка при создании нескольких ACI через Azure ARM шаблон с использованием COPY - PullRequest
0 голосов
/ 10 марта 2020

В настоящее время я пытаюсь развернуть группу контейнеров внутри Azure Экземпляры контейнеров по шаблону ARM, все они вызываются из Azure Конвейер сборки Devops Yaml. Я обнаружил, что могу использовать предложение copy для создания нескольких групп ресурсов и / или свойств.

Вот мой шаблон ARM

{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
    "containerGroupName": {
        "type": "string",
        "metadata": {
            "description": "Emulators ACR name."
        }
    },
    "copies":{
        "type": "int",
        "defaultValue": 2,
        "metadata": {
            "description": "Defines the number of container's copies."
        }
    },
    "server":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACR server url."
        }
    },
    "serverUser":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACR user."
        }
    },
    "serverPassword":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACR password."
        }
    },
    "imageName":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACR repository hosting the image."
        }
    },
    "imageVersion":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACR image version."
        }
    },
    "containerName":{
        "type": "string",
        "metadata": {
            "description": "Defines the ACI containers name. This will be suffixed with the copy index."
        }
    }
},
"variables": {
    "emulatorImage": "[concat(parameters('server'), '/', parameters('imageName'))]",
    "emulatorImageVersion": "[parameters('imageVersion')]"
},
"resources": [
    {
        "name": "[concat(parameters('containerGroupName'), '-', copyIndex(1))]",
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2018-10-01",
        "location": "[resourceGroup().location]",
        "copy": {
            "name": "acicopy",
            "count": "[if(equals(mod(parameters('copies'), 60), 0), div(parameters('copies'), 60), add(div(parameters('copies'), 60), 1))]"
        },
        "properties": {
            "copy": [
                {
                    "name": "containers",
                    "count": "[if(equals(div(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), if(equals(mod(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), 60, mod(sub(parameters('copies'), mul(60, copyIndex())), 60)), 0)]",
                    "input": {
                        "name": "[concat(parameters('containerName'), '-', copyIndex(1), copyIndex('containers', 1))]",
                        "properties": {
                            "image": "[concat(variables('emulatorImage'), ':' ,variables('emulatorImageVersion'))]",
                            "resources": {
                                "requests": {
                                    "cpu": 0.01,
                                    "memoryInGB": 0.1
                                }
                            }
                        }
                    }
                }
            ],
            "imageRegistryCredentials": [
                {
                    "server": "[parameters('server')]",
                    "username": "[parameters('serverUser')]",
                    "password": "[parameters('serverPassword')]"
                }
            ],
            "osType": "Linux"
        }
    }
]

}

Как видите, у меня есть две копии итераций. Первый в RG генерирует достаточно экземпляров контейнеров (поскольку я ограничен 60 контейнерами на ACI), а второй - в свойствах, чтобы генерировать несколько контейнеров (максимум 60).

Итак, если мне нужно 100 контейнеры, я должен создать 2 ACI, первый будет содержать 60 контейнеров, второй 40.

Условия для свойств счетчика copy могут показаться немного сложными для чтения, поэтому здесь C# эквивалентность.

public static void DefineNumber(int number)
{
    Console.WriteLine("Number : " + number);
    int mainLoop = number % 60 == 0 ? (int)(number / 60) : (int)(number / 60) + 1;
    Console.WriteLine("MainLoop : " + mainLoop);

    for(int i = 0; i < mainLoop; i++)
    {
        Console.WriteLine("----");

        int div = (number - (60 * i)) / 60;
        Console.WriteLine("Div : " + div);

        int mod = (number - (60 * i)) % 60;
        Console.WriteLine("Mod : " + mod);  

        int iteration = div == 0 ? (mod == 0 ? 60 : mod) : 60;
        Console.WriteLine("Number of containers for main loop n°" + (i+1) + " will be : " + iteration);
    }
}

mainl oop предназначена для первой копии итерации

итерации для второго

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что при запросе шаблона на создание 100 контейнеров у меня возникает следующая ошибка сборки

enter image description here

Сообщение достаточно ясное, но я не понимаю, в чем проблема. imageRegistryCredentials свойство определяется один раз для каждой итерации copy и располагается на том же уровне, что и свойство Containers , поэтому почему оно успешно выполняется на первой итерации, а затем завершается с ошибкой

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Я выяснил, что пошло не так в моем шаблоне ARM. Это была глупая ошибка при опечатке .... В конце своей "свойства" скопировать итерационные функции в конце я поставил значение 0 вместо 60

"count": "[if(equals(div(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), if(equals(mod(sub(parameters('copies'), mul(60, copyIndex())), 60), 0), 60, mod(sub(parameters('copies'), mul(60, copyIndex())), 60)), 0)]",

Если я заменю его на C# эквивалентность,

Что я должен был поставить:

 int iteration = div == 0 ? (mod == 0 ? 60 : mod) : 60;

Что я положил:

 int iteration = div == 0 ? (mod == 0 ? 60 : mod) : 0;

Разница в конец ...

В любом случае спасибо 4c74356b41 за помощь!

0 голосов
/ 10 марта 2020

Согласно тому, что я знаю (я не пересматривал этот конкретный сценарий в течение очень долгого времени), вы не можете использовать копирование и копирование свойств на одном и том же ресурсе. Ваш обходной путь - создать связанные развертывания (по 1 на каждые 60 контейнеров), а затем вам потребуется только копировать свойства внутри каждого из них.

, но, учитывая эту ошибку, я не уверен, что этот сценарий невозможен на данный момент. Потому что ранее он жаловался на то, что copyIndex () не ожидается в этом месте.

...