Dela via


Montera en Azure Files baserad volym i ett Service Fabric Mesh program

Viktigt

Förhandsversionen av Azure Service Fabric Mesh har dragits tillbaka. Nya distributioner kommer inte längre att tillåtas via Service Fabric Mesh-API:et. Stödet för befintliga distributioner fortsätter till och med den 28 april 2021.

Mer information finns i Förhandsversionen av Azure Service Fabric Mesh.

I den här artikeln beskrivs hur du monterar en Azure Files baserad volym i en tjänst för ett Service Fabric Mesh program. Den Azure Files volymdrivrutinen är en Docker-volymdrivrutin som används för att montera en Azure Files resurs till en container som du använder för att bevara tjänsttillståndet. Volymer ger dig allmän fillagring och gör att du kan läsa/skriva filer med vanliga I/O-fil-API:er för diskar. Mer information om volymer och alternativ för att lagra programdata finns i lagringstillstånd.

Om du vill montera en volym i en tjänst skapar du en volymresurs i ditt Service Fabric Mesh program och refererar sedan till volymen i din tjänst. Du kan deklarera volymresursen och referera till den i tjänstresursen antingen i YAML-baserade resursfiler eller i den JSON-baserade distributionsmallen. Innan du monterar volymen måste du först skapa ett Azure-lagringskonto och en filresurs i Azure Files.

Förutsättningar

Anteckning

Känt problem med distribution på Windows RS5-utvecklingsdator: Det finns ett öppet fel med Powershell-cmdleten New-SmbGlobalMapping på RS5 Windows-datorer som förhindrar montering av Azurefile-volymer. Nedan visas exempelfel som uppstår när AzureFile-baserad volym monteras på den lokala utvecklingsdatorn.

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"}

Lösningen för problemet är att 1)Kör kommandot nedan som Powershell-administratör och 2)Starta om datorn.

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

Du kan använda Azure Cloud Shell eller en lokal installation av Azure CLI för att slutföra den här artikeln.

Om du vill använda Azure CLI lokalt med den här artikeln kontrollerar du att az --version returnerar minst azure-cli (2.0.43). Installera (eller uppdatera) Azure Service Fabric Mesh CLI-tilläggsmodulen genom att följa dessa instruktioner.

Så här loggar du in på Azure och anger din prenumeration:

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

Skapa ett lagringskonto och en filresurs (valfritt)

Montering av en Azure Files volym kräver ett lagringskonto och en filresurs. Du kan använda ett befintligt Azure-lagringskonto och en filresurs eller skapa resurser:

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

Hämta lagringskontots namn och nyckel och filresursnamnet

Lagringskontots namn, lagringskontonyckeln och filresursnamnet refereras till som <storageAccountName>, <storageAccountKey>och <fileShareName> i följande avsnitt.

Ange dina lagringskonton och hämta namnet på lagringskontot med den filresurs som du vill använda:

az storage account list

Hämta namnet på filresursen:

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

Hämta lagringskontonyckeln ("key1"):

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

Du kan också hitta dessa värden i Azure Portal:

  • <storageAccountName>– Under Storage-konton, namnet på det lagringskonto som användes för att skapa filresursen.
  • <storageAccountKey>– Välj ditt lagringskonto under Storage Konton och välj sedan Åtkomstnycklar och använd värdet under key1.
  • <fileShareName>– Välj ditt lagringskonto under Storage Konton och välj sedan Filer. Namnet som ska användas är namnet på den filresurs som du skapade.

Deklarera en volymresurs och uppdatera tjänstresursen (JSON)

Lägg till parametrar för värdena <fileShareName>, <storageAccountName>och <storageAccountKey> som du hittade i föregående steg.

Skapa en volymresurs som peer för programresursen. Ange ett namn och providern ("SFAzureFile" för att använda den Azure Files-baserade volymen). I azureFileParametersanger du parametrarna för värdena <fileShareName>, <storageAccountName>och <storageAccountKey> som du hittade i föregående steg.

Om du vill montera volymen i din tjänst lägger du till en volumeRefs i -elementet codePackages i tjänsten. name är resurs-ID:t för volymen (eller en distributionsmallparameter för volymresursen) och namnet på volymen som deklarerats i resursfilen volume.yaml. destinationPath är den lokala katalog som volymen ska monteras på.

{
  "$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')]"
        }
      }
    }
    ...
  ]
}

Deklarera en volymresurs och uppdatera tjänstresursen (YAML)

Lägg till en ny volume.yaml-fil i katalogen Appresurser för ditt program. Ange ett namn och providern ("SFAzureFile" för att använda den Azure Files-baserade volymen). <fileShareName>, <storageAccountName>och <storageAccountKey> är de värden som du hittade i ett tidigare steg.

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>

Uppdatera filen service.yaml i katalogen Tjänstresurser för att montera volymen i din tjänst. Lägg till -elementet volumeRefs i -elementet codePackages . name är resurs-ID:t för volymen (eller en distributionsmallparameter för volymresursen) och namnet på volymen som deklarerats i resursfilen volume.yaml. destinationPath är den lokala katalog som volymen ska monteras på.

## 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

Nästa steg