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

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

本教程中,您将学习如何:

  • 创建容器应用环境
  • 创建 Azure 存储帐户
  • 在存储帐户中定义文件共享
  • 授予环境的托管标识对文件共享的访问权限
  • 将环境链接到存储文件共享
  • 在单个容器中装载存储共享
  • 通过查看网站访问日志来验证存储装载

注释

Azure 容器应用支持使用 SMB 和 NFS 协议装载文件共享。 本教程演示如何使用 SMB 协议装载 Azure 文件共享。 若要详细了解如何装载 NFS 共享,请参阅 在 Azure 容器应用中使用存储装载。

先决条件

  • 安装最新版本的 Azure CLI。
  • 使用你有权在其中创建资源并分配 Azure 基于角色的访问控制(Azure RBAC)角色的 Azure 订阅。 若要分配角色,你需要在存储帐户范围内具有 Microsoft.Authorization/roleAssignments/write 权限。

设置环境

以下命令定义环境变量,并确保容器应用扩展是最新的。

  1. 登录 Azure CLI。

    az cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    
  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
    
  5. 注册 Azure Monitor Log Analytics 工作区的 Microsoft.OperationalInsights 提供程序(如果以前尚未使用它)。

    az provider register --namespace Microsoft.OperationalInsights
    

创建环境

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

  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" \
      --mi-system-assigned \
      --query "properties.provisioningState"
    

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

    使用该 --mi-system-assigned 标志启用环境的系统分配托管标识。 在后续步骤中,你会授予该身份对文件共享的访问权限。

    存储装载与容器应用环境相关联,并在单个容器应用中进行配置。

设置存储帐户

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

  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 \
      --enable-smb-oauth true \
      --query provisioningState
    

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

    该 --enable-smb-oauth true 标志在存储账户上启用用于 SMB 的托管标识(SMBOAuth)。 如果你使用已有的存储账户,在创建挂载前请启用此设置。 有关说明,请参见 在你的存储账户上配置托管标识的访问属性。

    存储账户的SMB安全设置也必须允许Kerberos认证。 如果你使用自定义的SMB安全配置文件,请查看 SMB安全设置。

  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_MOUNT_NAME="mystoragemount"
    

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

授予托管身份访问权限

在存储账户范围内将 存储文件数据SMB MI管理员 角色分配给环境的托管标识。 该角色授权身份访问SMB共享中的文件和目录。

ENVIRONMENT_PRINCIPAL_ID=$(az containerapp env show \
  --name $ENVIRONMENT_NAME \
  --resource-group $RESOURCE_GROUP \
  --query identity.principalId \
  --output tsv)

STORAGE_ACCOUNT_ID=$(az storage account show \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --query id \
  --output tsv)

az role assignment create \
  --assignee-object-id "$ENVIRONMENT_PRINCIPAL_ID" \
  --assignee-principal-type ServicePrincipal \
  --role "Storage File Data SMB MI Admin" \
  --scope "$STORAGE_ACCOUNT_ID"

在创建存储挂载前,等待角色分配生效。 要在 Azure 门户中分配该角色,请参见“为托管身份分配内置 RBAC 角色”。

创建存储装载

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

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

    az containerapp env storage set \
      --access-mode ReadWrite \
      --storage-type AzureFile \
      --azure-file-account-name $STORAGE_ACCOUNT_NAME \
      --azure-file-identity system \
      --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 命令创建的文件共享之间建立链接。 该--azure-file-identity system选项通过使用环境的系统分配托管标识对 Azure 文件存储 进行身份验证。

    对于用户分配的托管标识,将该标识分配给环境,并使用其完整的资源 ID,而非 system。 存储账户密钥认证仍被支持作为替代方案。 不要将 --azure-file-identity 与 --azure-file-account-key 或 --azure-file-key-vault-secret-url 组合使用。 示例请参见 Azure 容器应用 中使用存储挂载。

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

  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 节,并且机密保持不变。 或者,如果需要更改机密的值,请确保在尝试更新应用之前同时为文件中的每一个机密提供name和value。 省略 secrets 节中的机密会删除机密。

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

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

    template:
      containers:
      - image: nginx
        imageType: ContainerImage
        name: my-container-app
        resources:
          cpu: 0.5
          ephemeralStorage: 2Gi
          memory: 1Gi
        volumeMounts:
        - volumeName: my-azure-file-volume
          mountPath: /var/log/nginx
      initContainers: null
      revisionSuffix: ''
      scale:
        cooldownPeriod: 300
        maxReplicas: 1
        minReplicas: 1
        pollingInterval: 30
        rules: null
      serviceBinds: null
      terminationGracePeriodSeconds: null
      volumes:
      - name: my-azure-file-volume
        storageName: mystoragemount
        storageType: AzureFile
    

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

    资产 DESCRIPTION
    name 该值标识应用级卷,并在容器的卷挂载中由 volumeName 引用。
    storageName 该值与调用 az containerapp env storage set 命令创建的存储定义名称相匹配。
    storageType 此值决定了环境中定义的存储卷类型。 在这种情况下,声明了 Azure 文件存储装载。

    volumes 节用于在应用层级定义存储卷,应用容器或挎斗容器可通过关联容器的 volumeMounts 节引用这些存储卷。

    托管身份认证不会改变应用层的卷配置。 继续使用 storageType: AzureFile 进行 SMB 挂载。

  8. 将 volumeMounts 节添加到 nginx 节中的 containers 容器中。

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

    新 volumeMounts 部分包含以下属性:

    资产 DESCRIPTION
    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 准备就绪后,可以通过文件系统命令与存储装载进行交互。 有关详细信息,请参阅 “连接到 Azure 容器应用中的容器控制台”。

  2. 更改为 nginx /var/log/nginx 文件夹。

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

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

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

    ls
    

    请注意 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. 选择 myfileshare 查看 access.log 和 error.log 文件。

清理资源

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

az group delete \
  --name $RESOURCE_GROUP

后续步骤