概括
我有一个运行自定义容器的 Azure 应用服务。当我将路径绑定到 Azure 文件共享时,我的容器停止工作。查看日志Container Issues
,我看到错误:[BYOS] Custom storage volume(s) failed to initialize: [/var/LWASFiles/Sites/my-app/a3484543-39f9-45a3-816b-9524640dfd50]
。
细节
我的自定义容器有一个定义的卷
/var/www/html/v3/uploads
。我试图将其映射到 Azure 文件共享,该共享位于与托管 ASE 位于同一 vnet 中的存储帐户上,并且规则允许 ASE 子网与端口 137、138、138 和 445 上的文件共享之间的流量。
托管 ASE 配置有内部负载均衡器(即,它是一个私有 ASE)。
存储帐户已配置专用终结点。
该卷在应用服务的设置 > 配置 > 路径映射下进行映射,使用有效密钥和与容器上的卷路径匹配的挂载路径。
在添加路径映射之前,应用服务按预期运行。
添加路径映射后,容器无法启动/我能找到的唯一异常信息来自日志
Container Issues
,如上面的摘要所示。如果我删除路径映射,即使强制重启,问题仍然存在。解决问题的唯一方法是删除并重新部署应用服务。
它通过私有端点成功连接到 MySql DB(用于 MySQL 服务器的 Azure 数据库)。
使用
dig {privateEndpointFqdn}
我可以证明存储帐户的私有端点已正确解析(就像 MySQL 一样;正如您所期望的那样)使用
tcptraceroute {privateEndpointFqdn} {destinationPort}
我可以证明我可以连接到端口 445 上的存储帐户(以及端口 3306 上的 MySQL DB)。注意:我无法连接到端口 137、138 或 139 上的存储帐户,尽管这些端口通过 NSG 允许使用与上述 445 相同的入站和出站规则;但我怀疑这些端口不再需要用于 CIFS(我只是在第一次遇到该问题后以防万一添加了这些端口,以防它们在某些帖子中提到过它们)。
我通过 SSH 进入容器来运行上述测试,因此命令是从其上下文中运行的。注意:由于添加路径映射后无法启动容器,因此这些测试是在创建应用服务之后但在添加路径映射之前执行的。
我已经将
WEBSITES_CONTAINER_START_TIME_LIMIT
其增加到最大值:1800
我的容器公开端口 80(即 App Service 为容器支持的默认端口之一);当路径映射不存在时,网站可以正常工作,因此这应该不是问题。我还设置
WEBSITES_PORT
为80
,只是为了保险起见。WEBSITES_ENABLE_APP_SERVICE_STORAGE
设置为false
(尽管我也尝试过将其设置为true
,以防万一 / 它没有什么区别所以我恢复为false
)。我的文件共享有几 GB 的数据。我尝试创建一个没有内容的相同文件共享并映射到该文件共享(在重新创建应用服务并证明其有效之后立即进行;以确保我的测试不会受到较大文件共享的影响)。这会产生与较大文件共享相同的问题。
我的容器的图像正在从 Azure 容器存储库加载。
该图像基于
ubuntu:21.04
我已经包含了
azure-cli
和cifs-utils
包(我认为这仅在从容器执行挂载操作时才需要,而不是从 AppService 的配置执行;但我想涵盖所有假设)托管 ASE 位于该区域内
UK South
(存储帐户/所有资源也是如此)。
注意:这是我第一次在 App Service 中运行容器;所以 PEBKAC 绝对是可能的。
任何建议或故障排除建议都将不胜感激。谢谢。
答案1
我通过将存储帐户的网络selected networks
(我已将其列入 ASE 的 VNet 和 Web 应用程序的出站 IP 白名单)更改为all networks
通过门户解决了该问题:
https://portal.azure.com/#@<myTentantName>.onmicrosoft.com/resource/subscriptions/<mySubscrption>/resourceGroups/<myStorageAccountsResourceGroup>/providers/Microsoft.Storage/storageAccounts/<myStorageAccountName>/networking
然后我重新启动了我的应用程序(包括删除并重新添加挂载点……不确定是否有必要,但为了安全起见):
# stop the web app
az webapp stop \
--subscription <sub id> \
-g <resourcegroup> \
-n <sitename>
# drop the existing path mapping
az webapp config storage-account delete \
--subscription <sub id> \
-g <resourcegroup> \
-n <sitename> \
--custom-id <path-mapping-name> \
# re-add the path mapping
az webapp config storage-account add \
--subscription <sub id> \
-g <resourcegroup> \
-n <sitename> \
--custom-id <path-mapping-name> \
--storage-type AzureFiles \
--account-name [Azure storage account name] \
--share-name [Azure storage share name] \
--access-key [storage access key] \
--mount-path [/path/to/mount within the container]
# restart the web app
az webapp start \
--subscription <sub id> \
-g <resourcegroup> \
-n <sitename>