了解如何使用 Azure 文件存储装载写入容器应用中的永久存储。 有关存储装载的详细信息,请参阅 在 Azure 容器应用中使用存储装载。
本教程中,您将学习如何:
- 创建容器应用环境
- 创建 Azure 存储帐户
- 在存储帐户中定义文件共享
- 授予环境的托管标识对文件共享的访问权限
- 将环境链接到存储文件共享
- 在单个容器中装载存储共享
- 通过查看网站访问日志来验证存储装载
注释
Azure 容器应用支持使用 SMB 和 NFS 协议装载文件共享。 本教程演示如何使用 SMB 协议装载 Azure 文件共享。 若要详细了解如何装载 NFS 共享,请参阅 在 Azure 容器应用中使用存储装载。
先决条件
- 安装最新版本的 Azure CLI。
- 使用你有权在其中创建资源并分配 Azure 基于角色的访问控制(Azure RBAC)角色的 Azure 订阅。 若要分配角色,你需要在存储帐户范围内具有
Microsoft.Authorization/roleAssignments/write权限。
设置环境
以下命令定义环境变量,并确保容器应用扩展是最新的。
登录 Azure CLI。
az cloud set -n AzureChinaCloud az login # az cloud set -n AzureCloud //means return to Public Azure.设置用于后续各种命令的环境变量。
RESOURCE_GROUP="my-container-apps-group" ENVIRONMENT_NAME="my-storage-environment" LOCATION="canadacentral"确保拥有最新版本的容器应用 Azure CLI 扩展。
az extension add -n containerapp --upgrade注册
Microsoft.App命名空间。az provider register --namespace Microsoft.App注册 Azure Monitor Log Analytics 工作区的
Microsoft.OperationalInsights提供程序(如果以前尚未使用它)。az provider register --namespace Microsoft.OperationalInsights
创建环境
以下步骤创建资源组和容器应用环境。
创建资源组。
az group create \ --name $RESOURCE_GROUP \ --location $LOCATION \ --query "properties.provisioningState"创建后,命令会返回“已成功”消息。
在本教程结束时,可以删除资源组以删除本文中创建的所有服务。
创建容器应用环境。
az containerapp env create \ --name $ENVIRONMENT_NAME \ --resource-group $RESOURCE_GROUP \ --location "$LOCATION" \ --mi-system-assigned \ --query "properties.provisioningState"创建后,命令会返回“已成功”消息。
使用该
--mi-system-assigned标志启用环境的系统分配托管标识。 在后续步骤中,你会授予该身份对文件共享的访问权限。存储装载与容器应用环境相关联,并在单个容器应用中进行配置。
设置存储帐户
接下来,创建存储帐户并建立要装载到容器应用的文件共享。
定义存储帐户名称。
此命令将生成存储帐户名称的随机后缀,以确保唯一性。
STORAGE_ACCOUNT_NAME="myacastorageaccount$RANDOM"创建 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安全设置。
定义文件共享名称。
STORAGE_SHARE_NAME="myfileshare"创建 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定义存储挂载点名称。
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 角色”。
创建存储装载
现在可以更新容器应用配置以支持存储装载。
在环境中创建存储链接。
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 容器应用 中使用存储挂载。现在存储帐户和环境已链接,可以创建使用存储装载的容器应用。
定义容器应用名称。
CONTAINER_APP_NAME="my-container-app"创建容器应用。
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。
复制 URL 并将其粘贴到 Web 浏览器中以导航到网站。
页面加载后,你将看到“欢迎使用 nginx!” 消息。 将此浏览器选项卡保持打开状态。 在存储装载验证步骤中,你将返回到网站。
确认容器应用已配置后,可以使用存储装载定义来更新应用程序。
导出容器应用的配置。
az containerapp show \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP \ --output yaml > app.yaml注释
虽然此应用程序没有机密,但许多应用都具有功能机密。 默认情况下,导出应用配置时,生成的 YAML 中不包含机密的值。
如果不需要更改机密值,则可以删除该
secrets节,并且机密保持不变。 或者,如果需要更改机密的值,请确保在尝试更新应用之前同时为文件中的每一个机密提供name和value。 省略secrets节中的机密会删除机密。在代码编辑器中打开 app.yaml 。
将
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 挂载。将
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此值定义容器中装载存储的路径。 使用新的存储装载配置更新容器应用。
az containerapp update \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP \ --yaml app.yaml \ --output table
验证存储装载
建立存储装载后,可以从容器中操作 Azure 存储中的文件。 使用以下命令观察工作中的存储装载。
在容器应用中打开交互式 shell,以在正在运行的容器内执行命令。
az containerapp exec \ --name $CONTAINER_APP_NAME \ --resource-group $RESOURCE_GROUP此命令可能需要一些时间才能打开远程 shell。 shell 准备就绪后,可以通过文件系统命令与存储装载进行交互。 有关详细信息,请参阅 “连接到 Azure 容器应用中的容器控制台”。
更改为 nginx /var/log/nginx 文件夹。
cd /var/log/nginx返回到浏览器并导航到网站并刷新页面几次。
向网站发出的请求将创建一系列日志流条目。
返回到终端并列出
/var/log/nginx文件夹的值。ls请注意 access.log 和 error.log 文件在此文件夹中的显示方式。 这些文件将被写入到在前面步骤中创建的 Azure 存储共享中的 Azure 文件存储 挂载点。
查看 access.log 文件的内容。
cat access.log退出容器的交互式 shell 以返回到本地终端会话。
exit现在,可以查看 Azure 门户中的文件,以验证它们是否存在于 Azure 存储帐户中。 打印随机生成的存储帐户的名称。
echo $STORAGE_ACCOUNT_NAME导航到 Azure 门户并打开在此过程中创建的存储帐户。
在 “数据存储 ”下,选择 “文件共享”。
选择 myfileshare 查看 access.log 和 error.log 文件。
清理资源
如果不打算继续使用此应用程序,请运行以下命令以删除资源组以及本文中创建的所有资源。
az group delete \
--name $RESOURCE_GROUP