教程:在 Azure 容器应用中创建 Azure 文件存储卷装载

了解如何使用 Azure 文件存储写入容器应用中的永久存储。 有关存储装载的详细信息,请参阅在 Azure 容器应用中使用存储装载

在本教程中,你将了解如何执行以下操作:

  • 创建容器应用环境
  • 创建 Azure 存储帐户
  • 在存储帐户中定义文件共享
  • 将环境链接到存储文件共享
  • 在单独的容器中装载存储共享
  • 通过查看网站访问日志验证存储装载

先决条件

设置环境

以下命令可帮助定义变量并确保容器应用扩展保持最新。

  1. 登录 Azure CLI。

    az login
    
  2. 设置要在接下来的各种命令中使用的环境变量。

    RESOURCE_GROUP="my-container-apps-group"
    ENVIRONMENT_NAME="my-storage-environment"
    LOCATION="canadacentral"
    
  3. 确保具有最新版本的容器应用 Azure CLI 扩展。

    az extension add -n containerapp --upgrade
    
  4. 注册 Microsoft.App 命名空间。

    az provider register --namespace Microsoft.App
    

创建环境

以下步骤将创建资源组和容器应用环境。

  1. 创建资源组。

    az group create \
      --name $RESOURCE_GROUP \
      --location $LOCATION \
      --query "properties.provisioningState"
    

    创建后,命令会返回“已成功”消息。

    在本教程的最后,你可以删除资源组以删除在本文中创建的所有服务。

  2. 创建容器应用环境。

    az containerapp env create \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --location "$LOCATION" \
      --query "properties.provisioningState"
    

    创建后,命令会返回“已成功”消息。

    存储帐户与容器应用环境相关联,并且是在独立的容器应用中配置的。

设置存储帐户

接下来,创建一个存储帐户并建立文件共享以装载到容器应用。

  1. 定义存储帐户名称。

    此命令会为存储帐户名称生成一个随机的后缀,从而保证名称的唯一性。

    STORAGE_ACCOUNT_NAME="myacastorageaccount$RANDOM"
    
  2. 创建 Azure 存储帐户。

    az storage account create \
      --resource-group $RESOURCE_GROUP \
      --name $STORAGE_ACCOUNT_NAME \
      --location "$LOCATION" \
      --kind StorageV2 \
      --sku Standard_LRS \
      --enable-large-file-share \
      --query provisioningState
    

    创建后,命令会返回“已成功”消息。

  3. 定义文件共享名称。

    STORAGE_SHARE_NAME="myfileshare"
    
  4. 创建 Azure 存储文件共享。

    az storage share-rm create \
      --resource-group $RESOURCE_GROUP \
      --storage-account $STORAGE_ACCOUNT_NAME \
      --name $STORAGE_SHARE_NAME \
      --quota 1024 \
      --enabled-protocols SMB \
      --output table
    
  5. 获取存储帐户密钥。

    STORAGE_ACCOUNT_KEY=`az storage account keys list -n $STORAGE_ACCOUNT_NAME --query "[0].value" -o tsv`
    

    在容器应用环境中创建存储链接需要存储帐户密钥。

  6. 定义存储装载名称。

    STORAGE_MOUNT_NAME="mystoragemount"
    

    此值是用于定义从容器应用环境到 Azure 存储帐户的存储装载链接的名称。

创建存储装载

现在,可以更新容器应用配置来支持存储装载。

  1. 在环境中创建存储链接。

    az containerapp env storage set \
      --access-mode ReadWrite \
      --azure-file-account-name $STORAGE_ACCOUNT_NAME \
      --azure-file-account-key $STORAGE_ACCOUNT_KEY \
      --azure-file-share-name $STORAGE_SHARE_NAME \
      --storage-name $STORAGE_MOUNT_NAME \
      --name $ENVIRONMENT_NAME \
      --resource-group $RESOURCE_GROUP \
      --output table
    

    此命令在容器应用环境和通过 az storage share-rm 命令创建的文件共享之间创建链接。

    现在,存储帐户和环境已链接,你可以创建使用存储帐户的容器应用。

  2. 定义容器应用名称。

    CONTAINER_APP_NAME="my-container-app"
    
  3. 创建容器应用。

    az containerapp create \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --environment $ENVIRONMENT_NAME \
      --image nginx \
      --min-replicas 1 \
      --max-replicas 1 \
      --target-port 80 \
      --ingress external \
      --query properties.configuration.ingress.fqdn
    

    此命令显示新容器应用的 URL。

  4. 复制 URL 并将其粘贴到 Web 浏览器以导航到网站。

    页面加载后,会看到“欢迎来到 nginx!”消息。 请将此浏览器选项卡保持打开状态。 存储装载验证步骤期间将返回该网站。

    现在,你已确认配置了容器,可以用存储装载定义更新应用。

  5. 导出容器应用的配置。

    az containerapp show \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --output yaml > app.yaml
    

    注意

    虽然此应用程序没有机密,但很多应用程序都有机密。 默认情况下,导出应用的配置时,生成的 YAML 中不包含机密的值。

    如果不需要更改机密值,可以删除 secrets 部分,机密将保持不变。 或者,如果需要更改一个机密的值,请确保在尝试更新应用之前为文件中的所有机密提供 namevalue。 忽略 secrets 部分中的机密会删除该机密。

  6. 在代码编辑器中打开 app.yaml。

  7. template 部分中的 volumes: null 定义替换为引用存储卷的 volumes: 定义。 模板部分应如下所示:

    template:
      volumes:
      - name: my-azure-file-volume
        storageName: mystoragemount
        storageType: AzureFile
      containers:
      - image: nginx
        name: my-container-app
        volumeMounts:
        - volumeName: my-azure-file-volume
          mountPath: /var/log/nginx
        resources:
          cpu: 0.5
          ephemeralStorage: 3Gi
          memory: 1Gi
      initContainers: null
      revisionSuffix: ''
      scale:
        maxReplicas: 1
        minReplicas: 1
        rules: null
    

    新的 template.volumes 部分包含以下属性。

    属性 说明
    name 此值通过调用 az containerapp env storage set 命令与创建的卷匹配。
    storageName 此值定义环境中的容器访问存储卷时使用的名称。
    storageType 此值确定为环境定义的存储卷的类型。 在本例中,它会声明一个 Azure 文件存储装载。

    volumes 部分从应用级别定义卷,应用程序容器或 sidecar 容器可以通过与容器关联的 volumeMounts 部分引用这些卷。

  8. volumeMounts 部分添加到 containers 部分中的 nginx 容器。

    containers:
      - image: nginx
        name: my-container-app
        volumeMounts:
        - volumeName: my-azure-file-volume
          mountPath: /var/log/nginx
    

    新的 volumeMounts 部分包含以下属性:

    属性 说明
    volumeName 此值必须与 volumes 定义中定义的名称相匹配。
    mountPath 此值定义装载存储的容器中的路径。
  9. 使用新的存储装载配置更新容器应用。

    az containerapp update \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP \
      --yaml app.yaml \
      --output table
    

验证存储装载

现在,存储装载已建立,可以从容器中操作 Azure 存储中的文件。 使用以下命令观察工作状态下的存储装载。

  1. 在容器应用中打开一个交互式 shell 来执行正在运行的容器中的命令。

    az containerapp exec \
      --name $CONTAINER_APP_NAME \
      --resource-group $RESOURCE_GROUP
    

    此命令可能需要一段时间才能打开远程 shell。 Shell 准备就绪后,可以通过文件系统命令与存储装载交互。

  2. 转为进入 nginx /var/log/nginx 文件夹。

    cd /var/log/nginx
    
  3. 返回浏览器,导航到网站并刷新页面几次。

    对网站发出的请求创建了一系列日志流条目。

  4. 返回终端并列出 /var/log/nginx 文件夹的值。

    注意 access.log 和 error.log 文件在此文件夹中的显示方式。 这些文件已写入之前的步骤中创建的 Azure 存储共享的 Azure 文件存储装载中。

  5. 查看 access.log 文件的内容。

    cat access.log
    
  6. 退出容器的交互式 shell,返回本地终端会话。

    exit
    
  7. 现在,可以在 Azure 门户中查看这些文件,以验证它们是否存在于 Azure 存储帐户中。 打印随机生成的存储帐户的名称。

    echo $STORAGE_ACCOUNT_NAME
    
  8. 导航到 Azure 门户,打开本过程中创建的存储帐户。

  9. 在“数据存储”下,选择“文件共享”。

  10. 选择“myshare”以查看 access.log 和 error.log 文件。

清理资源

如果不打算继续使用此应用程序,请运行以下命令,删除资源组以及本文中创建的所有资源。

az group delete \
  --name $RESOURCE_GROUP

后续步骤