概括
我有一个运行自定义容器的 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(Azure Database for MySQL 服务器)。
使用
dig {privateEndpointFqdn}
我能够证明存储帐户的私有端点已正确解析(与 MySQL 一样;如您所料)使用
tcptraceroute {privateEndpointFqdn} {destinationPort}
我能够证明我可以连接到端口 445 上的存储帐户(以及端口 3306 上的 MySQL 数据库)。注意:我无法连接到端口 137、138 或 139 上的存储帐户,尽管通过 NSG 允许使用与上述 445 相同的入站和出站规则;尽管我怀疑 CIFS 不再需要这些端口(我只是在第一次遇到问题后才将这些端口作为以防万一的措施添加,以防它们在某些帖子中提到它们以某种方式相关)。
我通过 SSH 进入容器来运行上述测试,因此命令是从其上下文中运行的。注意:因为添加路径映射后无法启动容器,所以这些测试是在创建应用服务之后添加路径映射之前执行的。
我已经增加到
WEBSITES_CONTAINER_START_TIME_LIMIT
它的最大值:1800
我的容器暴露了 80 端口(即容器应用服务支持的默认端口之一);并且网站在路径映射不存在时工作,所以这不应该是问题。我也设置
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绝对是一种可能。
任何建议或故障排除建议将不胜感激。谢谢。
我通过将存储帐户的网络从
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
然后我重新启动了我的应用程序(包括删除和重新添加安装......不确定是否需要,但为了好的措施):