ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Grafana Loki 调试镜像(Debug Images)构建、部署与远程调试实战指南

Grafana Loki 调试镜像(Debug Images)构建、部署与远程调试实战指南 Grafana Loki 调试镜像Debug Images构建、部署与远程调试实战指南【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki导读本指南以 debug/README.md 为骨架系统讲解 Loki 项目专用调试镜像*-debug的构建原理、docker-compose本地联调环境以及 Promtail / Loki 在 Kubernetes 中的调试部署方式。读完本文你将掌握如何用dlvDelve对 Loki 进行断点级远程调试理解调试二进制与生产二进制的编译差异并能独立搭建Loki Promtail Grafana的可调试日志栈。一、为什么需要 Debug 镜像Loki 官方镜像基于gcr.io/distroless精简基础镜像构建既没有 shell、也没有符号表与调试信息不适合作为断点调试的目标。为此项目单独维护了一套*-debug镜像如grafana/loki-debug、grafana/promtail-debug它们具备以下特性保留符号信息使用-gcflags all-N -l编译禁用编译器优化与函数内联使断点、单步、变量查看与源码逐行对应内置 Delve 调试器镜像内携带dlv可执行文件以 headless 模式监听调试端口供 IDE 或调试客户端远程连接打开额外端口除服务自身端口Loki 的3100外额外暴露40000供 delve 监听。这套机制在 cmd/loki/Dockerfile.debug 中有完整体现下文逐一拆解。二、构建 Debug 镜像2.1 一键构建按照 debug/README.md 的说明在仓库根目录执行make debug即可构建整套调试镜像。此外当前仓库 Makefile 中保留了更细粒度的镜像构建目标loki-debug-image: ## build the loki debug docker image $(OCI_BUILD) -t $(LOKI_IMAGE)-debug -f cmd/loki/Dockerfile.debug .它使用$(OCI_BUILD)docker或podman等 OCI 兼容构建工具将镜像打上$(LOKI_IMAGE)-debug标签即默认的grafana/loki-debug。如需自定义镜像前缀可通过IMAGE_PREFIX变量覆盖见 Makefile 中IMAGE_PREFIX ? grafana。2.2 调试二进制的编译差异源码级解析普通镜像与调试镜像的差异根源在编译参数。在 Makefile 中可以看到# Per some websites Ive seen to add -gcflags all-N -l, the gcflags seem poorly if at all documented # the best I could dig up is -N disables optimizations and -l disables inlining which should make debugging match source better. # Also remove the -s and -w flags present in the normal build which strip the symbol table and the DWARF symbol table. DEBUG_GO_FLAGS : -gcflags all-N -l -ldflags -extldflags \-static\ $(GO_LDFLAGS) -tags netgo对照普通构建的GO_FLAGS : -ldflags -s -w ...关键区别有三点参数普通构建Debug 构建作用-gcflags all-N -l无有-N禁用编译器优化-l禁用函数内联保证断点行为与源码一致-ldflags -s -w有剥离符号表与 DWARF 调试信息无Debug 构建保留完整符号表与 DWARF 信息dlv才能解析源码位置与变量-extldflags -static有有静态链接便于在最小化基础镜像中运行而loki-debug二进制的构建目标定义在 Makefile.PHONY: cmd/loki/loki cmd/loki/loki-debug loki: cmd/loki/loki ## build loki executable loki-debug: cmd/loki/loki-debug ## build loki debug executable cmd/loki/loki-debug: CGO_ENABLED0 go build $(DEBUG_GO_FLAGS) -o $ ./$(D)即CGO_ENABLED0 go build -gcflags all-N -l ... -o cmd/loki/loki-debug ./cmd/loki。镜像构建阶段正是通过make BUILD_IN_CONTAINERfalse loki-debug产出该二进制见 cmd/loki/Dockerfile.debug。2.3 Dockerfile.debug 剖析cmd/loki/Dockerfile.debug 是理解调试镜像的关键文件其构建分为三个阶段工具准备阶段以golang:${GO_VERSION}为基础执行go install github.com/go-delve/delve/cmd/dlvlatest安装最新版 delve并导出目标平台的GOARCH/GOARM编译阶段COPY . /src/loki后将整个仓库拷入容器运行make BUILD_IN_CONTAINERfalse loki-debug编译出cmd/loki/loki-debug运行阶段基于gcr.io/distroless/base-nossl:debugdistroless 的 debug 变体附带 busybox shell 便于排查拷入loki-debug二进制、dlv以及本地配置cmd/loki/loki-docker-config.yaml并EXPOSE 3100Loki HTTP 端口与EXPOSE 40000delve 端口。其入口cmd/loki/Dockerfile.debug值得逐参数解读ENTRYPOINT [/usr/bin/dlv, --listen:40000, --headlesstrue, --log, --continue, --accept-multiclient , --api-version2, exec, /usr/bin/loki-debug, --] CMD [-config.file/etc/loki/local-config.yaml]参数含义--listen:40000delve 在容器内40000端口监听调试请求--headlesstrue以无界面headless模式运行等待外部调试客户端VS Code、Goland、dlv CLI连接--log输出 delve 自身的运行日志--continue启动后立即继续执行被调试程序避免在main入口处阻塞等待--accept-multiclient允许多个调试客户端同时连接便于 IDE 与 CLI 混用--api-version2使用 delve v2 APIVS Code Go 插件等客户端均基于该版本exec /usr/bin/loki-debug --加载并执行loki-debug--之后的所有内容作为参数传给被调试程序CMD中的-config.file/etc/loki/local-config.yaml正是被调试程序Loki收到的启动参数该配置文件即 cmd/loki/loki-docker-config.yaml单机 filesystem 存储、TSDB 索引的本地开发配置。若要在 Kubernetes 中部署该镜像可直接通过 Pod 的args追加额外参数——--分隔符的存在正是为此设计Dockerfile.debug 注释。三、用 docker-compose 启动本地可调试环境debug/README.md 指出可以直接使用 debug/docker-compose.yaml 一键拉起三组调试服务。其完整内容如下version: 3 networks: loki: services: loki: # this is required according to the VS Code Go debugging on Linux/docker documentation security_opt: - seccomp:unconfined image: grafana/loki-debug:latest ports: - 40000:40000 - 3100:3100 command: -config.file/etc/loki/local-config.yaml networks: - loki promtail: security_opt: - seccomp:unconfined image: grafana/promtail-debug:latest ports: - 40100:40000 volumes: - /var/log:/var/log command: -config.file/etc/promtail/docker-config.yaml networks: - loki grafana: image: grafana/grafana:master ports: - 3000:3000 networks: - loki启动方式docker compose -f debug/docker-compose.yaml up3.1 三个服务逐一说明lokigrafana/loki-debug:latest调试版 Loki 单体。映射两个端口40000:40000供 delve 远程调试3100:3100暴露 Loki 的 HTTP API写入、查询。启动参数-config.file/etc/loki/local-config.yaml指向镜像内置的 loki-docker-config.yaml使用 filesystem 存储无需任何外部依赖即可启动。promtailgrafana/promtail-debug:latest调试版日志采集端。将宿主机/var/log挂载进容器供采集调试端口映射为40100:40000避免与 loki 的40000冲突因此在同一宿主机上可以同时调试 Loki 与 Promtail 两个进程。其配置/etc/promtail/docker-config.yaml来自 Promtail 项目自身本仓库 production/docker/docker-compose.yaml 中普通 Promtail 服务同样以-config.file/etc/promtail/promtail.yaml方式挂载配置镜像与配置随 Promtail 独立演进。grafanagrafana/grafana:masterGrafana 前端映射3000:3000用于在浏览器中通过 Loki 数据源查询、可视化由 Promtail 采集到的日志形成完整的可观测闭环。3.2 为什么需要seccomp:unconfinedLoki 与 Promtail 两个服务都配置了security_opt: - seccomp:unconfined这是因为 delve 在被调试进程上执行ptrace等系统调用时Docker 默认的 seccomp 安全配置文件会加以拦截导致调试器无法附着。该做法在 VS Code Go 官方文档的 Debugging Go code using VS Code on Linux/docker 一节中有明确说明docker-compose.yaml 注释。注意该选项仅建议在本地开发调试环境使用不应带入生产部署。3.3 远程调试实操以 VS Code 为例启动 compose 后Loki 的 delve 服务监听在本机40000端口。以 VS Code 为例在调试配置.vscode/launch.json中新增一个 Go Remote 类型的调试会话{ version: 0.2.0, configurations: [ { name: Attach to Loki (dlv), type: go, request: attach, mode: remote, remotePath: /src/loki, port: 40000, host: 127.0.0.1 } ] }关键点是remotePath必须指向容器内的源码路径/src/loki与 Dockerfile.debug 中的WORKDIR /src/loki一致这样本地的断点才能映射回容器内编译时的源码。连接后即可在 Loki 的任意处理逻辑如cmd/loki/main.go启动流程、distributor / querier 等模块中下断点配合--continue参数直接命中运行中的请求。同理将port改为40100即可附着到容器内的 Promtail 进程。四、在 Kubernetes 中调试 Promtailksonnet 方案debug/README.md 给出了作者在 Kubernetes 中使用 ksonnet 部署调试版 Promtail 的完整实践。ksonnet 是一套基于 Jsonnet 的应用配置管理工具配合 jsonnet-bundlerjb管理依赖。完整步骤如下ks init promtail cd promtail ks env add promtail jb init jb install github.com/grafana/loki/production/ksonnet/promtail vi environments/promtail/main.jsonnet然后编辑environments/promtail/main.jsonnet将内容替换为local promtail import promtail/promtail.libsonnet; promtail { _images:: { promtail: grafana/promtail-debug:latest, }, _config:: { namespace: default, promtail_config: { external_labels: { cluster: some_cluster_name, }, scheme: https, hostname: hostname, username: username, password: password, }, }, }该配置的核心思路通过_images:: { promtail: grafana/promtail-debug:latest }将镜像替换为调试版其余部署逻辑DaemonSet、ServiceAccount、ConfigMap 等完全复用 ksonnet 包的默认定义通过_config::覆盖配置项namespace指定部署命名空间promtail_config::中external_labels::为所有采集日志附加clustersome_cluster_name标签而scheme、hostname、username、password用于配置 Promtail 向 Loki 推送日志时的认证信息。按 debug/README.md 的提示应用前需要做两处修改将some_cluster_name替换为有意义的集群标识便于在 Loki 中按cluster标签快速定位本集群的日志将hostname、username、password更新为你的 Loki 实例地址与认证凭据。说明当前仓库的 production/ksonnet 目录仅包含enterprise-logs、loki、loki-canary三个包Promtail 的 ksonnet 包已不在该目录内调试镜像grafana/promtail-debug的配置随 Promtail 仓库独立维护。原 README 中的jb install步骤指向的是当时版本仓库中的包路径读者在实际操作时请以所用版本实际存在的包路径为准。Loki 自身的 ksonnet 配置如 production/ksonnet/loki/config.libsonnet仍保留在仓库中可作参考。五、在 Kubernetes 中调试 Lokidebug/README.md 对 Loki 的 Kubernetes 调试只留下了一句话说明Havent tried this yet, it works from docker-compose so it should run in kubernetes just fine also.作者尚未实际尝试但既然 docker-compose 下运行正常理论上在 Kubernetes 中同样可行。结合 cmd/loki/Dockerfile.debug 的实现细节可以推断其在 Kubernetes 中运行是具备前提条件的镜像入口以--结尾专门用于在 Kubernetes 的 Podargs中透传 Loki 启动参数Dockerfile.debug 注释——这是镜像设计时即考虑到的 Kubernetes 使用场景delve 以--listen:40000监听容器内端口配合--accept-multiclient可通过kubectl port-forward将调试端口映射到本地后像本地调试一样附着kubectl port-forward loki-debug-pod 40000:40000随后即可在 VS Code 中以host: 127.0.0.1, port: 40000附着调试。由于 delve 监听的是容器内所有地址:40000port-forward 后无需额外网络配置。若要在 Kubernetes 中自定义调试镜像的启动参数可直接在 Pod 或 Deployment 的args中追加--之后的部分会作为 Loki 的参数例如args: - -config.file/etc/loki/local-config.yaml - -server.http-listen-port3100六、常见问题与排错提示dlv无法 attach / 断点不命中首先确认容器是否以*-debug镜像启动docker inspect检查Entrypoint是否包含dlv其次确认编译参数未启用优化普通镜像不带-N -l无法正确断点。seccomp 拦截报错确保在 compose 或 Kubernetes 的securityContext中放行调试所需的系统调用本地调试环境使用seccomp: unconfined。VS Code 无法解析源码检查remotePath是否与镜像内的/src/loki一致本地 Go 插件需与 delve v2 API 匹配镜像已固定--api-version2。端口冲突同机调试多个-debug容器时将宿主侧端口分别映射如本仓库 compose 中 Promtail 用40100映射容器40000避免多个 delve 抢占同一宿主端口。七、小结围绕 debug/README.md本文完整还原了 Loki 调试镜像的构建make debug/loki-debug-image、编译原理Makefile 的-N -l与符号表保留、Dockerfile.debug 的 delve 入口设计、docker-compose 三服务联调以及 Promtail 在 Kubernetes 中的 ksonnet 部署方式。调试镜像的价值在于让开发者可以在与生产几乎一致的分发物上用 IDE 断点直击 Loki / Promtail 的真实执行路径从而高效定位采集、推送、存储与查询链路中的疑难问题。【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表