Condividi tramite


Montare un volume basato su File di Azure in un'applicazione di Service Fabric Mesh

Importante

L'anteprima di Azure Service Fabric Mesh è stata ritirata. Le nuove distribuzioni non saranno più consentite tramite l'API Service Fabric Mesh. Il supporto per le distribuzioni esistenti continuerà fino al 28 aprile 2021.

Per informazioni dettagliate, vedere Ritiro di Azure Service Fabric Mesh anteprima.

Questo articolo spiega come montare un volume basato su File di Azure in un servizio di un'applicazione di Service Fabric Mesh. Il driver di volume di File di Azure è un driver di volume Docker usato per montare una condivisione di File di Azure in un contenitore, che viene usato per rendere persistente lo stato del servizio. I volumi offrono una risorsa di archiviazione file per utilizzo generico e consentono di leggere/scrivere i file usando le normali API di file I/O del disco. Per altre informazioni sui volumi e sulle opzioni per l'archiviazione dei dati dell'applicazione, vedere l'archiviazione dello stato.

Per montare un volume in un servizio, creare una risorsa di volume nell'applicazione di Service Fabric Mesh e quindi fare riferimento a quel volume nel servizio. La dichiarazione della risorsa di volume e il riferimento alla stessa nella risorsa di servizio si possono effettuare nei file di risorsa basati su YAML o nel modello di distribuzione basato su JSON. Prima di montare il volume, creare un account di archiviazione di Azure e una condivisione file in File di Azure.

Prerequisiti

Nota

Problema noto relativo alla distribuzione nel computer di sviluppo RS5 Windows: è presente un bug aperto con il cmdlet di PowerShell New-SmbGlobalMapping nei computer RS5 Windows che impedisce il montaggio dei volumi di Azurefile. Di seguito è riportato l'errore di esempio rilevato quando il volume basato su AzureFile viene montato nel computer di sviluppo locale.

Error event: SourceId='System.Hosting', Property='CodePackageActivation:counterService:EntryPoint:131884291000691067'.
There was an error during CodePackage activation.System.Fabric.FabricException (-2147017731)
Failed to start Container. ContainerName=sf-2-63fc668f-362d-4220-873d-85abaaacc83e_6d6879cf-dd43-4092-887d-17d23ed9cc78, ApplicationId=SingleInstance_0_App2, ApplicationName=fabric:/counterApp. DockerRequest returned StatusCode=InternalServerError with ResponseBody={"message":"error while mounting volume '': mount failed"}

La soluzione alternativa per il problema consiste nell'eseguire il comando seguente come amministratore di PowerShell e 2)Riavviare il computer.

PS C:\WINDOWS\system32> Mofcomp c:\windows\system32\wbem\smbwmiv2.mof

Per completare questo articolo è possibile usare Azure Cloud Shell o un'installazione locale dell'interfaccia della riga di comando di Azure.

Per usare l'interfaccia della riga di comando di Azure con questo articolo, verificare che az --version restituisca almeno azure-cli (2.0.43). Per installare (o aggiornare) il modulo dell'estensione dell'interfaccia della riga di comando di Azure Service Fabric Mesh, seguire queste istruzioni.

Per accedere ad Azure e impostare la sottoscrizione:

az login
az account set --subscription "<subscriptionID>"

Creare un account di archiviazione e una condivisione file (facoltativo)

Il montaggio di un volume di File di Azure richiede un account di archiviazione e una condivisione file. È possibile usare un account di archiviazione e una condivisione file di Azure esistenti o creare risorse:

az group create --name myResourceGroup --location eastus

az storage account create --name myStorageAccount --resource-group myResourceGroup --location eastus --sku Standard_LRS --kind StorageV2

$current_env_conn_string=$(az storage account show-connection-string -n myStorageAccount -g myResourceGroup --query 'connectionString' -o tsv)

az storage share create --name myshare --quota 2048 --connection-string $current_env_conn_string

Ottenere il nome e la chiave dell'account di archiviazione e il nome della condivisione file

Il nome dell'account di archiviazione, la chiave dell'account di archiviazione e il nome della condivisione file vengono indicati come <storageAccountName>, <storageAccountKey> e <fileShareName> nelle sezioni seguenti.

Indicare gli account di archiviazione e ottenere il nome dell'account di archiviazione con la condivisione file da usare:

az storage account list

Ottenere il nome della condivisione file:

az storage share list --account-name <storageAccountName>

Ottenere la chiave dell'account di archiviazione ("key1"):

az storage account keys list --account-name <storageAccountName> --query "[?keyName=='key1'].value"

È anche possibile trovare questi valori nel portale di Azure:

  • <storageAccountName> - In Account di archiviazione il nome dell'account di archiviazione usato per creare la condivisione file.
  • <storageAccountKey> - Selezionare il proprio account di archiviazione in Account di archiviazione, quindi selezionare Chiavi di accesso e usare il valore in key1.
  • <fileShareName>- Selezionare l'account di archiviazione in Archiviazione Account e quindi selezionare File. Il nome da usare è il nome della condivisione file creata.

Dichiarare una risorsa di volume e aggiornare la risorsa di servizio (JSON)

Aggiungere i parametri per i valori <fileShareName>, <storageAccountName> e <storageAccountKey> individuati in un passaggio precedente.

Creare una risorsa Volume come peer della risorsa Applicazione. Specificare un nome e il provider ("SFAzureFile" per utilizzare il volume basato su File di Azure). In azureFileParameters specificare i parametri per i valori <fileShareName>, <storageAccountName> e <storageAccountKey> individuati in un passaggio precedente.

Per montare il volume nel servizio, aggiungere un volumeRefs all'elemento codePackages del servizio. name è l'ID risorsa per il volume (o un parametro del modello di distribuzione per la risorsa di volume) e il nome del volume dichiarato nel file di risorse volume.yaml. destinationPath è la directory locale in cui verrà montato il volume.

{
  "$schema": "https://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "defaultValue": "EastUS",
      "type": "String",
      "metadata": {
        "description": "Location of the resources."
      }
    },
    "fileShareName": {
      "type": "string",
      "metadata": {
        "description": "Name of the Azure Files file share that provides the volume for the container."
      }
    },
    "storageAccountName": {
      "type": "string",
      "metadata": {
        "description": "Name of the Azure storage account that contains the file share."
      }
    },
    "storageAccountKey": {
      "type": "securestring",
      "metadata": {
        "description": "Access key for the Azure storage account that contains the file share."
      }
    },
    "stateFolderName": {
      "type": "string",
      "defaultValue": "TestVolumeData",
      "metadata": {
        "description": "Folder in which to store the state. Provide an empty value to create a unique folder for each container to store the state. A non-empty value will retain the state across deployments, however if more than one applications are using the same folder, the counter may update more frequently."
      }
    }
  },
  "resources": [
    {
      "apiVersion": "2018-09-01-preview",
      "name": "VolumeTest",
      "type": "Microsoft.ServiceFabricMesh/applications",
      "location": "[parameters('location')]",
      "dependsOn": [
        "Microsoft.ServiceFabricMesh/networks/VolumeTestNetwork",
        "Microsoft.ServiceFabricMesh/volumes/testVolume"
      ],
      "properties": {
        "services": [
          {
            "name": "VolumeTestService",
            "properties": {
              "description": "VolumeTestService description.",
              "osType": "Windows",
              "codePackages": [
                {
                  "name": "VolumeTestService",
                  "image": "volumetestservice:dev",
                  "volumeRefs": [
                    {
                      "name": "[resourceId('Microsoft.ServiceFabricMesh/volumes', 'testVolume')]",
                      "destinationPath": "C:\\app\\data"
                    }
                  ],
                  "environmentVariables": [
                    {
                      "name": "ASPNETCORE_URLS",
                      "value": "http://+:20003"
                    },
                    {
                      "name": "STATE_FOLDER_NAME",
                      "value": "[parameters('stateFolderName')]"
                    }
                  ],
                  ...
                }
              ],
              ...
            }
          }
        ],
        "description": "VolumeTest description."
      }
    },
    {
      "apiVersion": "2018-09-01-preview",
      "name": "testVolume",
      "type": "Microsoft.ServiceFabricMesh/volumes",
      "location": "[parameters('location')]",
      "dependsOn": [],
      "properties": {
        "description": "Azure Files storage volume for the test application.",
        "provider": "SFAzureFile",
        "azureFileParameters": {
          "shareName": "[parameters('fileShareName')]",
          "accountName": "[parameters('storageAccountName')]",
          "accountKey": "[parameters('storageAccountKey')]"
        }
      }
    }
    ...
  ]
}

Dichiarare una risorsa di volume e aggiornare la risorsa di servizio (YAML)

Aggiungere un nuovo file volume.yaml nella directory delle risorse dell'app per l'applicazione. Specificare un nome e il provider ("SFAzureFile" per utilizzare il volume basato su File di Azure). <fileShareName>, <storageAccountName> e <storageAccountKey> sono i valori individuati in un passaggio precedente.

volume:
  schemaVersion: 1.0.0-preview2
  name: testVolume
  properties:
    description: Azure Files storage volume for counter App.
    provider: SFAzureFile
    azureFileParameters: 
        shareName: <fileShareName>
        accountName: <storageAccountName>
        accountKey: <storageAccountKey>

Aggiornare il file service.yaml nella directory delle risorse di servizio per montare il volume nel servizio. Aggiungere l'elemento volumeRefs all'elemento codePackages. name è l'ID risorsa per il volume (o un parametro del modello di distribuzione per la risorsa di volume) e il nome del volume dichiarato nel file di risorse volume.yaml. destinationPath è la directory locale in cui verrà montato il volume.

## Service definition ##
application:
  schemaVersion: 1.0.0-preview2
  name: VolumeTest
  properties:
    services:
      - name: VolumeTestService
        properties:
          description: VolumeTestService description.
          osType: Windows
          codePackages:
            - name: VolumeTestService
              image: volumetestservice:dev
              volumeRefs:
                - name: "[resourceId('Microsoft.ServiceFabricMesh/volumes', 'testVolume')]"
                  destinationPath: C:\app\data
              endpoints:
                - name: VolumeTestServiceListener
                  port: 20003
              environmentVariables:
                - name: ASPNETCORE_URLS
                  value: http://+:20003
                - name: STATE_FOLDER_NAME
                  value: TestVolumeData
              resources:
                requests:
                  cpu: 0.5
                  memoryInGB: 1
          replicaCount: 1
          networkRefs:
            - name: VolumeTestNetwork

Passaggi successivi