Подключение общего файлового ресурса Azure с помощью службы "Экземпляры контейнеров Azure"

Состояние в экземплярах контейнеров Azure не отслеживается по умолчанию. Если происходит сбой в контейнере, он перезапускается или завершает работу, все сведения о состоянии будут утеряны. Чтобы сохранить состояние после истечения времени существования контейнера, необходимо подключить том из внешнего хранилища. Как показано в этой статье, служба "Экземпляры контейнеров Azure" может подключать общий файловый ресурс Azure, созданный с помощью службы Файлы Azure. Служба "Файлы Azure" предоставляет полностью управляемые общие файловые ресурсы в службе хранилища Azure, доступ к которым можно получить с помощью стандартного отраслевого протокола SMB. Использование файлового ресурса Azure с Экземплярами контейнеров Azure предоставляет функции обмена файлами, похожие на использование файлового ресурса Azure совместно с виртуальными машинами Azure.

Ограничения

  • Общие файловые ресурсы Файлов Azure можно размещать только в контейнерах Linux. Ознакомьтесь с дополнительными сведениями о различиях в поддержке функций для групп контейнеров Linux и Windows в обзоре.
  • Для подключения общего файлового ресурса Azure требуется, чтобы контейнер Linux выполнялся от имени привилегированного пользователя.
  • Подключения к томам общего файлового ресурса Файлов Azure ограничены поддержкой CIFS.

Примечание

Подключение файлового ресурса Файлов Azure к экземпляру контейнера аналогично подключение привязки Docker. Если вы подключаете файловый ресурс к каталогу контейнера, в котором находятся файлы или каталоги, то присоединение скрывает файлы или каталоги, делая их недоступными во время выполнения контейнера.

Важно!

При развертывании групп контейнеров в виртуальной сети Azure необходимо добавить конечную точку службы в учетную запись службы хранилища Azure.

Создание файлового ресурса Azure

Перед использованием файлового ресурса Azure с Экземплярами контейнеров Azure необходимо создать его. Выполните приведенный ниже скрипт, чтобы создать учетную запись хранения для размещения файлового ресурса и общего ресурса. Имя учетной записи хранения должно быть глобально уникальным, поэтому скрипт добавляет случайное значение к базовой строке.

# Change these four parameters as needed
ACI_PERS_RESOURCE_GROUP=myResourceGroup
ACI_PERS_STORAGE_ACCOUNT_NAME=mystorageaccount$RANDOM
ACI_PERS_LOCATION=eastus
ACI_PERS_SHARE_NAME=acishare

# Create the storage account with the parameters
az storage account create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --location $ACI_PERS_LOCATION \
    --sku Standard_LRS

# Create the file share
az storage share create \
  --name $ACI_PERS_SHARE_NAME \
  --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME

Получение учетных данных хранилища

Для подключения файлового ресурса Azure в качестве тома в Экземплярах контейнеров Azure требуется три значения: имя учетной записи хранения, имя общего ресурса и ключ доступа к хранилищу.

  • Имя учетной записи хранения: если вы использовали сценарий выше, имя учетной записи хранения было сохранено в переменной $ACI_PERS_STORAGE_ACCOUNT_NAME. Для отображения имени учетной записи введите:

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • Имя общего ресурса — это значение уже известно (определено как acishare в предыдущем сценарии).

  • Ключ учетной записи хранения — это значение можно найти с помощью следующей команды:

    STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv)
    echo $STORAGE_KEY
    

Развертывание контейнера и подключение тома — CLI

Чтобы подключить файловый ресурс Azure в качестве тома в контейнере с помощью Azure CLI, укажите точку подключения для общего ресурса и тома при создании контейнера с помощью команды az container create. Если вы выполнили предыдущие инструкции, можно подключить созданный ранее общий ресурс с помощью следующей команды для создания контейнера:

az container create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name hellofiles \
    --image mcr.microsoft.com/azuredocs/aci-hellofiles \
    --dns-name-label aci-demo \
    --ports 80 \
    --azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --azure-file-volume-account-key $STORAGE_KEY \
    --azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
    --azure-file-volume-mount-path /aci/logs/

Значение --dns-name-label должно быть уникальным в пределах региона Azure, в котором создается экземпляр контейнера. Если при выполнении команды появится сообщение об ошибке Метка DNS-имени, обновите значение в предыдущей команде.

Управление файлами в подключенном томе

После запуска контейнера можно использовать простое веб-приложение, развернутое с помощью образа aci-hellofiles, чтобы создать мелкие текстовые файлы в файловом ресурсе Azure по указанному вами пути подключения. Получите полное доменное имя (FQDN) веб-приложения с помощью команды az container show.

az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
  --name hellofiles --query ipAddress.fqdn --output tsv

С помощью портала Azure или такого средства, как Обозреватель службы хранилища Microsoft Azure, можно извлечь и проверить файл(ы), записанный в файловый ресурс после сохранения текста с использованием приложения.

Развертывание контейнера и подключение тома — YAML

Вы также можете развернуть группу контейнеров и подключить том в контейнере с помощью Azure CLI и шаблона YAML. При развертывании группы контейнеров, состоящей из нескольких контейнеров, рекомендуется использовать шаблон YAML.

Следующий шаблон YAML определяет группу контейнеров с одним контейнером, созданным с помощью образа aci-hellofiles. Контейнер подключает файловый ресурс Azure acishare, созданный ранее в качестве тома. Где указано, введите имя и ключ хранилища для учетной записи хранения, в которой размещен общий файловый ресурс.

Как и в примере CLI, значение dnsNameLabel должно быть уникальным в пределах региона Azure, в котором создается экземпляр контейнера. При необходимости обновите значение в файле YAML.

apiVersion: '2019-12-01'
location: eastus
name: file-share-demo
properties:
  containers:
  - name: hellofiles
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-hellofiles
      ports:
      - port: 80
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /aci/logs/
        name: filesharevolume
  osType: Linux
  restartPolicy: Always
  ipAddress:
    type: Public
    ports:
      - port: 80
    dnsNameLabel: aci-demo
  volumes:
  - name: filesharevolume
    azureFile:
      sharename: acishare
      storageAccountName: <Storage account name>
      storageAccountKey: <Storage account key>
tags: {}
type: Microsoft.ContainerInstance/containerGroups

Для развертывания с помощью шаблона YAML сохраните предыдущий YAML в файл с именем deploy-aci.yaml, а затем выполните команду az container create с параметром --file:

# Deploy with YAML template
az container create --resource-group myResourceGroup --file deploy-aci.yaml

Развертывание контейнера и подключение тома — диспетчер ресурсов

Помимо развертывания с помощью CLI и шаблона YAML также можно развернуть группу контейнеров и подключить том в контейнере с помощью шаблона Azure Resource Manager.

Сначала заполните массив volumes в разделе properties группы контейнеров шаблона.

Затем для каждого контейнера, в котором нужно подключить том, нужно заполнить массив volumeMounts в разделе properties определения контейнера.

Следующий шаблон Resource Manager определяет группу контейнеров с одним контейнером, созданным с помощью образа aci-hellofiles. Контейнер подключает файловый ресурс Azure acishare, созданный ранее в качестве тома. Где указано, введите имя и ключ хранилища для учетной записи хранения, в которой размещен общий файловый ресурс.

Как и в предыдущих примерах, значение dnsNameLabel должно быть уникальным в пределах региона Azure, в котором создается экземпляр контейнера. При необходимости обновите значение в шаблоне.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "hellofiles",
    "container1image": "mcr.microsoft.com/azuredocs/aci-hellofiles"
  },
  "resources": [
    {
      "name": "file-share-demo",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "/aci/logs"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ],
          "dnsNameLabel": "aci-demo"
        },
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
                "shareName": "acishare",
                "storageAccountName": "<Storage account name>",
                "storageAccountKey": "<Storage account key>"
            }
          }
        ]
      }
    }
  ]
}

Для развертывания с помощью шаблона Resource Manager сохраните предыдущий JSON в файл с именем deploy-aci.json, а затем выполните команду az deployment group create с параметром --template-file:

# Deploy with Resource Manager template
az deployment group create --resource-group myResourceGroup --template-file deploy-aci.json

Подключение нескольких томов

Чтобы подключить несколько томов в экземпляре контейнера, необходимо выполнить развертывание с помощью шаблона Azure Resource Manager, YAML-файла или иного программного метода. Чтобы использовать шаблон или YAML-файл, укажите сведения о файловом ресурсе и определите тома, заполнив массив volumes в разделе properties файла.

Например, если вы создали два файловых ресурса Azure с именами share1 и share2 в учетной записи хранения myStorageAccount, массив volumes в шаблоне Resource Manager будет аналогичен приведенному ниже:

"volumes": [{
  "name": "myvolume1",
  "azureFile": {
    "shareName": "share1",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
},
{
  "name": "myvolume2",
  "azureFile": {
    "shareName": "share2",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
}]

Затем для каждого контейнера в группе контейнеров, в которой нужно подключить тома, заполните массив volumeMounts в разделе properties определения контейнера. В результате этого, подключатся, например, тома myvolume1 и myvolume2, определенные ранее.

"volumeMounts": [{
  "name": "myvolume1",
  "mountPath": "/mnt/share1/"
},
{
  "name": "myvolume2",
  "mountPath": "/mnt/share2/"
}]

Дальнейшие действия

Сведения о подключении других типов томов в службе "Экземпляры контейнеров Azure" см. в следующих статьях: