cAdvisor Web UI 使用与认证配置指南:容器实时监控页面与 HTTP Basic/Digest 认证实战
【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor
cAdvisor(Container Advisor)在运行时会暴露一个内置的 Web UI,用于实时查看宿主机上所有容器的资源使用情况。本篇指南以 cAdvisor 仓库中的 docs/web.md 为核心,围绕 Web UI 的访问方式、/containers监控页面的数据结构,以及 HTTP Basic / Digest 两种认证方案的配置方法展开,并结合仓库源码说明认证的生效范围、优先级与安全边界。读完本文,你将能够独立为 cAdvisor 的 Web 页面开启访问控制,并正确评估/api、/metrics等端点暴露的风险。
Web UI 概览:从端口到容器监控页面
cAdvisor 启动后会监听一个 HTTP 端口(默认端口为8080,见 cmd/cadvisor.go 中的port参数定义),Web UI 的访问地址为:
http://<hostname>:<port>/例如本地默认端口即为http://localhost:8080/。从源码看,根路径/本身并不直接渲染页面,而是通过 cmd/internal/http/handlers.go 中的http.RedirectHandler以307 Temporary Redirect重定向到/containers/页面。
该 UI 的核心资源是/containers,它导出宿主机上所有容器的实时信息。其页面路径常量定义于 cmd/internal/pages/containers.go:
const ContainersPage = "/containers/"当浏览器访问/containers/<容器名>时,服务端会依次做以下事情(对应 serveContainersPage 的实现):
- 从 URL 路径中解析容器名称;
- 通过
manager.GetContainerInfo()拉取该容器的信息,请求中显式指定NumStats: 60,即默认展示最近 60 个采样点的统计数据; - 通过
manager.GetMachineInfo()获取宿主机(Machine)的硬件信息; - 组装父容器面包屑导航(parent containers)与子容器链接(subcontainers)列表;
- 将数据渲染进 containers.html 模板。
页面上的"无限内存"被定义为maxMemorySize = uint64(1 << 62),超过该阈值的内存限制在页面上显示为unlimited(见 containers.go 的printSize/printUnit),这与内核在 cgroup 中"无上限"的表示方式保持一致。CPU 信息则通过printCores(毫核转核数)、printMask(CPU 亲和性掩码可视化)等模板函数渲染。
除/containers/外,Web UI 还提供另外两个同级别的页面,同样以"容器运行时"维度组织:
/docker/:Docker 容器列表页,常量定义于 cmd/internal/pages/docker.go;/podman/:Podman 容器列表页,常量定义于 cmd/internal/pages/podman.go。
页面的静态资源(jQuery、Bootstrap、containers.js 等)通过/static/路径提供,由 cmd/internal/pages/static/static.go 中的StaticResource常量注册,资源内容以go:embed风格内嵌进二进制(见 assets.go),部署时无需额外拷贝静态文件。
为 Web UI 开启认证:两种方案与核心参数
cAdvisor 为 Web UI 提供了两种认证方式,你可以任选其一:
- HTTP Basic 认证(基于
htpasswd生成的密码文件) - HTTP Digest 认证(基于
htdigest生成的密码文件)
四个相关命令行参数定义在 cmd/cadvisor.go,并通过 docs/runtime_options.md 同步记录:
| 参数 | 默认值 | 说明 |
|---|---|---|
--http_auth_file | ""(空) | HTTP Basic 认证使用的密码文件路径(由htpasswd生成) |
--http_auth_realm | localhost | HTTP Basic 认证的 realm 名称 |
--http_digest_file | ""(空) | HTTP Digest 认证使用的密码文件路径(由htdigest生成) |
--http_digest_realm | localhost | HTTP Digest 认证的 realm 名称 |
注意:两种认证的 realm 默认值都是localhost。对于 Digest 认证,realm 必须与密码文件中记录的 realm 一致(详见下文),因此不指定 realm 时,密码文件也应以localhost作为 realm 生成。
重要安全提示:认证保护范围有限
官方文档(docs/web.md)明确指出:
Web UI 的认证只保护
/containers端点,并不保护 cAdvisor 的其他 HTTP 端点,如/api/...与/metrics。其中部分端点可能暴露敏感信息,因此不建议将这些端点公开暴露。
结合源码可以看到,/api/路由(cmd/internal/api/handler.go 中apiResource = "/api/")与/metricsPrometheus 端点(handlers.go 中的RegisterPrometheusHandler)都独立于认证逻辑注册,不经过任何鉴权包装。这意味着:认证只能防止未授权用户查看 HTML 监控页面,但无法阻止其通过 API 拉取容器数据或抓取指标。在公网或非可信网络部署时,应结合防火墙、反向代理鉴权或网络策略保护整个端口。
HTTP Basic 认证配置实战
1. 生成密码文件
使用 Apachehtpasswd工具生成密码文件:
htpasswd -c test.htpasswd admin执行后会提示输入密码。-c表示创建新文件。仓库中已附带一个测试用密码文件 test.htpasswd,其内容为:
admin:$apr1$WVO0Bsre$VrmWGDbcBV1fdAkvgQwdk0该文件预置了用户名admin、密码password1,其中密码以$apr1$前缀的 Apache MD5 变体(APR1)格式哈希存储,仅供测试使用,生产环境请自行生成并使用更安全的哈希格式(如htpasswd -B生成 bcrypt 哈希)。
2. 启动 cAdvisor 并启用认证
./cadvisor --http_auth_file test.htpasswd --http_auth_realm localhost--http_auth_file指定密码文件路径;--http_auth_realm指定 realm(可选,默认即localhost)。
3. 验证访问
带凭据访问:
curl -u admin:password1 http://localhost:8080/containers/不带凭据访问将收到401 Unauthorized响应;凭据错误同理。浏览器首次访问时也会弹出系统级的用户名/密码输入框。
HTTP Digest 认证配置实战
1. 生成密码文件
Digest 认证的密码文件由 Apachehtdigest工具生成,且文件内容与 realm 绑定:
htdigest -c test.htdigest localhost admin第三个参数localhost即 realm,必须与启动参数--http_digest_realm保持一致。仓库中附带的 test.htdigest 内容为:
admin:localhost:70f2631dded4ce5ad0ebbea5faa6ad6e格式为用户名:realm:MD5(用户名:realm:密码),同样预置了admin:password1(realm 为localhost)。
2. 启动 cAdvisor 并启用认证
./cadvisor --http_digest_file test.htdigest --http_digest_realm localhost--http_digest_file指定 Digest 密码文件路径;--http_digest_realm指定 realm(默认localhost)。
Digest 认证相比 Basic 认证的优势在于密码不会以明文(Base64)形式在网络上传输,而是使用挑战-响应机制基于摘要值完成校验。
两种认证的优先级与源码实现
官方文档特别注明:两种认证只能启用其一。如果你在启动参数中同时传入了两个密码文件,只有 HTTP Basic 认证会被启用。这一行为在 cmd/internal/http/handlers.go 的RegisterHandlers中由明确的分支逻辑实现:
// Setup the authenticator object if httpAuthFile != "" { // ... 使用 auth.HtpasswdFileProvider 创建 Basic 认证器并注册处理器 authenticated = true } if httpAuthFile == "" && httpDigestFile != "" { // ... 使用 auth.HtdigestFileProvider 创建 Digest 认证器并注册处理器 authenticated = true }即:http_auth_file一旦非空,Basic 认证立即生效,Digest 分支被httpAuthFile == ""条件短路;只有 Basic 未配置时才考虑 Digest。认证实现基于github.com/abbot/go-http-auth库,Basic 使用auth.HtpasswdFileProvider+auth.NewBasicAuthenticator,Digest 使用auth.HtdigestFileProvider+auth.NewDigestAuthenticator(见 handlers.go)。
另外,从源码结构看,认证包裹的范围比文档字面描述更广一些:启用认证后,不仅/containers/页面被authenticator.Wrap(...)包裹,/docker/、/podman/两个页面以及/static/静态资源同样会经过认证(见 handlers.go 与 cmd/internal/pages/pages.go 中的RegisterHandlersBasic/RegisterHandlersDigest)。但无论如何,/api/...与/metrics始终不受保护,这一点务必牢记。
生产部署建议与安全边界总结
- 不要将 cAdvisor 端口直接暴露到公网:即使开启了 Web UI 认证,
/api/v1.3/...(包含完整的容器规格、状态与历史统计)与/metrics(Prometheus 指标)仍然匿名可访问,这些数据可能泄露容器镜像、标签、环境变量级信息。 - 通过反向代理统一鉴权:cAdvisor 提供了
--url_base_prefix参数(见 cmd/cadvisor.go),可为所有路径添加统一前缀以适配反向代理路径转发;结合网关层的认证/授权策略是更稳妥的做法。 - 认证文件权限管理:
htpasswd/htdigest文件包含口令哈希,应限制为运行 cAdvisor 的用户可读(例如chmod 600),并妥善保管。 - 测试凭据不可用于生产:仓库自带的
test.htpasswd与test.htdigest中的admin:password1是公开的,仅用于本地验证认证链路是否工作。
总结来说,cAdvisor 的 Web UI 是一个开箱即用的容器监控入口,/containers页面承载了全部容器的实时状态;通过--http_auth_file/--http_digest_file两个参数即可快速为页面加上访问控制。但请始终记住其安全边界——页面认证无法覆盖 API 与指标端点,合理的网络隔离与代理策略才是完整防护的关键。
【免费下载链接】cadvisorAnalyzes resource usage and performance characteristics of running containers.项目地址: https://gitcode.com/gh_mirrors/ca/cadvisor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考