在本教程中,你会在 Azure 应用服务中将 OpenTelemetry 收集器作为边车容器添加到 Linux 自定义容器应用。 有关自带代码的 Linux 应用,请参阅教程:在 Azure 应用服务中为 Linux 应用配置边车容器。
如果没有 Azure 帐户,请在开始前创建一个免费帐户。
什么是 sidecar 容器?
在 Azure 应用服务中,可以为每个 Linux 应用添加最多 9 个边车容器。 使用 Sidecar 容器可将额外的服务和功能部署到 Linux 应用,而无需将它们紧密耦合到主容器(内置或自定义)。 例如,可以将监视、日志记录、配置和网络服务添加为挎斗容器。 OpenTelemetry 收集器挎斗就是一个类似的监视例子。
sidecar 容器与同一应用服务计划中的主要应用程序容器一起运行。
1.设置所需的资源
首先创建本教程使用的资源。 它们用于此特定方案,挎斗容器通常不需要它们。
在 Azure Cloud Shell 中运行以下命令:
git clone https://github.com/Azure-Samples/app-service-sidecar-tutorial-prereqs cd app-service-sidecar-tutorial-prereqs azd env new my-sidecar-env azd provision
出现提示时,请提供所需的订阅和区域。 例如:
- 订阅:你的订阅。
- 区域:(欧洲)西欧。
部署完成后,应会看到以下输出:
APPLICATIONINSIGHTS_CONNECTION_STRING = InstrumentationKey=...;IngestionEndpoint=...;LiveEndpoint=... Open resource group in the portal: https://portal.azure.com/#@/resource/subscriptions/.../resourceGroups/...
在浏览器选项卡中打开资源组链接。你稍后需要使用该连接字符串。
注意
azd provision
使用包含的模板创建以下 Azure 资源:- 名为 my-sidecar-env_group 的资源组。
- 部署了两个映像的容器注册表:
- 具有 OpenTelemetry 模块的 Nginx 映像。
- OpenTelemetry 收集器映像,配置为导出到 Azure Monitor。
- Log Analytics 工作区
- Application Insights 组件
2.创建启用挎斗的应用
在资源组的管理页中,选择“创建”。
搜索“Web 应用”,然后选择“创建”上的向下箭头并选择“Web 应用”。
配置“基本信息”面板,如下所示:
- “名称”:唯一名称
- 发布:容器
- 操作系统:Linux
- 区域:与你对
azd provision
所选区域相同 - Linux 计划:新的应用服务计划
选择“容器”。 配置“容器”面板,如下所示:
- 挎斗支持:启用
- 映像源:Azure 容器注册表
- 注册表:由
azd provision
创建的注册表 - 映像:nginx
- 标记:最新
- 端口:80
注意
这些设置在启用挎斗的应用中以不同的方式进行配置。 有关详细信息,请参阅已启用 sidecar 的自定义容器有何区别?。
依次选择“查看 + 创建”、“创建”。
部署完成后,请选择“转到资源”。
在新的浏览器选项卡中,导航到
https://<app-name>.azurewebsites.net
并查看默认的 Nginx 页面。
3.添加挎斗容器
在本部分中,你将一个挎斗容器添加到你的自定义容器应用。
在应用的管理页的左侧菜单中,选择“部署中心”。
部署中心会显示应用中的所有容器。 现在,它只有主容器。
选择“添加”并配置新容器,如下所示:
- 名称:otel-collector
- 映像源:Azure 容器注册表
- 注册表:由
azd provision
创建的注册表 - 映像:otel-collector
- 标记:最新
选择“应用”。
现在,你应在部署中心看到两个容器。 主容器标记为“Main”,挎斗容器标记为“Sidecar”。 每个应用必须有一个主容器,但可以有多个挎斗容器。
4.配置环境变量
在示例方案中,otel-collector 挎斗配置为将 OpenTelemetry 数据导出到 Azure Monitor,但它需要连接字符串作为环境变量(请参阅 otel-collector 映像的 OpenTelemetry 配置文件)。
通过配置应用设置来为容器(如任何应用服务应用)配置环境变量。 应用设置可供应用中的所有容器访问。
在应用的管理页的左侧菜单中,选择“环境变量”。
通过选择“添加”来添加应用设置,并按如下所示对其进行配置:
- 名称: APPLICATIONINSIGHTS_CONNECTION_STRING
- 值:
azd provision
的输出中的连接字符串。 如果丢失了 Cloud Shell 会话,还可以在 Application Insight 资源“概述”页面的“连接字符串”下找到它。
选择“应用”,然后选择“应用”和“确认”。
注意
某些应用设置不适用于启用挎斗的应用。 有关详细信息,请参阅已启用 sidecar 的自定义容器有何区别?
5.在 Application Insights 中验证
otel-collector 挎斗现在应将数据导出到 Application Insights。
返回到
https://<app-name>.azurewebsites.net
的浏览器选项卡,多次刷新页面以生成一些 Web 请求。返回到资源组概述页面,然后选择 Application Insights 资源。 你现在应该会在默认图表中看到一些数据。
注意
在此非常常见的监视方案中,Application Insights 只是你可以使用的 OpenTelemetry 目标之一,例如 Jaeger、Prometheus 和 Zipkin。
清理资源
当你不再需要该环境时,可以删除资源组、应用服务和所有相关资源。 只需在克隆的存储库中用 Cloud Shell 运行以下命令:
azd down
常见问题
已启用 sidecar 的自定义容器有何区别?
配置启用挎斗的应用的方式与配置未启用挎斗的应用的方式不同。
未启用 sidecar
- 容器名称和类型可以通过
LinuxFxVersion=DOCKER|<image-details>
直接配置(请参阅 az webapp config set --linux-fx-version)。 - 主容器配置了应用设置,例如:
DOCKER_REGISTRY_SERVER_URL
DOCKER_REGISTRY_SERVER_USERNAME
DOCKER_REGISTRY_SERVER_PASSWORD
WEBSITES_PORT
已启用 Sidecar
- 已启用 sidecar 的应用由
LinuxFxVersion=sitecontainers
(请参阅 az webapp config set --linux-fx-version)指定。 - 主容器配置了 sitecontainers 资源。 这些设置不适用于启用 Sidecar 的应用程序
DOCKER_REGISTRY_SERVER_URL
DOCKER_REGISTRY_SERVER_USERNAME
DOCKER_REGISTRY_SERVER_PASSWORD
WEBSITES_PORT
边车容器如何处理内部通信?
边车容器将与主容器共享相同的网络主机,因此主容器(和其他边车容器)可以通过 localhost:<port>
到达边车上的任何端口。 示例 startup.sh 使用 访问 otel-collector 边车上的端口 4318。localhost:4318
在“编辑容器”对话框中,应用服务当前未使用“端口”框。 你可以将其用作边车元数据的一部分,例如指示边车将要侦听的端口。
sidecar 容器是否可以接收 Internet 请求?
否。 应用服务仅将 Internet 请求路由到主容器。 对于基于代码的 Linux 应用,内置 Linux 容器是主容器,任何 sidecar 容器(sitecontainers)都应使用IsMain=false
进行添加。 对于自定义容器,除了一个 sitecontainers 中,其他所有容器都应具有 IsMain=false
。
有关配置 IsMain
的详细信息,请参阅 Microsoft.Web sites/sitecontainers。
如何使用卷装载?
使用卷装载功能,可以在 Web 应用中的容器之间共享非永久性文件和目录。
卷子路径:这是自动创建的逻辑目录路径,它未在容器中引用。 使用同一卷子路径配置的容器可以彼此共享文件和目录。
容器装载路径: 这对应于在容器中引用的目录路径。 容器装载路径映射到卷子路径。
例如,假设配置了以下卷装载:
挎斗名称 | 卷子路径 | 容器装载路径 | 只读 |
---|---|---|---|
容器1 | /directory1/directory2 | /container1Vol | 假 |
Container2 | /directory1/directory2 | /container2Vol | 真 实 |
容器3 | /directory1/directory2/directory3 | /container3Vol | 假 |
容器4 | /directory4 | /container1Vol | 假 |
根据这些设置,以下条件适用:
- 如果 Container1 创建 /container1Vol/myfile.txt,则 Container2 可以通过 /container2Vol/myfile.txt读取文件。
- 如果 Container1 创建 /container1Vol/directory3/myfile.txt,Container2 可以通过 /container2Vol/directory3/myfile.txt读取文件,Container3 可以通过 /container3Vol/myfile.txt读取和写入文件。
- Container4 不与其他任何容器共享卷装载。
注意
对于基于代码的 Linux 应用,内置 Linux 容器无法使用卷装载。