资讯动态

在 Kubernetes 上部署 Grafana Tempo:Bitnami Helm Chart 实战指南

发布时间:2026/10/3 13:35:14 来源:尧图企业网站定制
云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载Grafana Tempo 是一个与 Grafana 原生集成、高度可扩展的分布式链路追踪系统支持 Jaeger、OpenTelemetry、Zipkin 等多种主流追踪协议。本指南以 Bitnami grafana-tempo Helm Chart 为对象系统讲解其在 Kubernetes 集群上的安装、配置、监控集成与持久化方案读者读完可独立完成一套生产可用的 Tempo 分布式追踪平台的搭建与调优。一、Chart 概览与前置条件1.1 这个 Chart 做了什么Bitnami 的 grafana-tempo Chart 通过 Helm 包管理器在 Kubernetes 集群中引导一个完整的 Grafana Tempo 部署。从 Chart 元数据Chart.yaml可以看到它当前对应应用版本2.8.2Chart 版本为5.0.1并声明了两个子 Chart 依赖memcached7.x.x默认随 Chart 一起部署为 Tempo 提供 bloom 过滤器与 trace-id 索引缓存common2.x.x提供标签、affinity、securityContext 渲染等公共模板能力。Chart 的关键字keywords为grafana、tracing、metrics、infrastructure定位非常明确基础设施层的链路追踪与指标一体化组件。1.2 前置条件在开始安装前需要满足以下环境要求Kubernetes 1.23Helm 3.8.0底层基础设施支持 PVPersistent Volume供应因为 ingester 默认开启持久化二、快速安装2.1 最简单的方式TL;DRhelm install my-release oci://registry-1.docker.io/bitnamicharts/grafana-tempo2.2 通过自定义 Registry 安装如果从私有 Registry 或镜像仓库安装需要替换占位符REGISTRY_NAME和REPOSITORY_NAMEhelm install my-release oci://REGISTRY_NAME/REPOSITORY_NAME/grafana-tempo例如 Bitnami 官方仓库的对应值为REGISTRY_NAMEregistry-1.docker.io、REPOSITORY_NAMEbitnamicharts。安装完成后可以使用helm list查看已部署的所有 release。默认配置即可完成一次可用的部署。如需调整参数可参考下文 Parameters 章节列出的全部可配置项。2.3 使用--set指定参数每个参数都可以通过helm install的--set keyvalue[,keyvalue]参数指定。例如启用 Jaeger GRPC 追踪接入helm install my-release \ --set tempo.traces.jaeger.grpctrue \ oci://REGISTRY_NAME/REPOSITORY_NAME/grafana-tempo2.4 使用 values 文件更推荐的方式是将参数写入 YAML 文件通过-f传入helm install my-release -f values.yaml oci://REGISTRY_NAME/REPOSITORY_NAME/grafana-tempoChart 仓库中的默认 values.yaml共 3352 行可作为自定义配置的起点模板。三、Tempo 组件架构与配置原理3.1 组件级Component拆分部署从模板目录 templates 的结构可以看出这个 Chart 将 Tempo 拆分为 6 个核心工作负载每个组件以-targetxxx启动参数运行见各组件模板中的args组件Workload 类型启动参数模板位置compactorDeployment-targetcompactordeployment.yamldistributorDeployment-targetdistributordeployment.yamlingesterStatefulSet-targetingesterstatefulset.yamlquerierDeployment-targetquerierdeployment.yamlqueryFrontendDeployment-targetquery-frontenddeployment.yamlmetricsGeneratorStatefulSet-targetmetrics-generatorstatefulset.yaml从源码结构可以推断所有组件共享同一份tempo.yaml配置与同一套镜像区别只在于-target指定了该进程扮演的角色。这与 Tempo 官方单二进制多 target的设计一脉相承。此外还有一个附加工作负载vulturedeployment.yamlTempo 官方自带的负载测试工具默认启用vulture.enabledtrue用于向集群持续注入合成追踪数据以验证链路。3.2 端口规划所有 Tempo 组件统一使用以下端口由tempo.containerPorts定义见 values.yamlwebHTTP3200提供/ready就绪探针等 HTTP 端点grpc9095组件间及查询的 gRPC 通信gossipRing7946memberlist gossip 协议端口用于组件间发现与 ring 同步。vulture 组件额外使用8080vulture.containerPorts.httpquery-frontend 的 tempo-query sidecar 使用7777queryFrontend.query.containerPorts.grpcJaeger暴露给 Jaeger query 的 gRPC 端口。3.3 配置共享机制Chart 通过两个 ConfigMap 向所有组件下发配置tempo-configmaptempo-configmap.yaml生成tempo.yaml内容来自tempo.configurationoverrides-configmapoverrides-configmap.yaml生成overrides.yamlper-tenant override内容来自tempo.overridesConfiguration。各组件的 Pod 模板中通过checksum/config注解对 tempo-configmap 内容做 sha256 校验如 compactor deployment.yaml配置变更会触发滚动更新确保配置与进程始终一致。configmap 以 subPath 方式挂载到/bitnami/grafana-tempo/conf/tempo.yaml与/bitnami/grafana-tempo/conf/overrides.yaml。query-frontend 额外使用 query-configmap.yaml 生成 tempo-query 的tempo-query.yaml配置。3.4 默认配置内容解读Chart 内置的默认tempo.configuration见 values.yaml涵盖了生产所需的核心骨架值得逐段理解multitenancy_enabled: false默认关闭多租户cache使用随 Chart 部署的 memcached 作为 bloom 过滤器与 trace-id-index 的缓存后端compactorblock 保留策略48hring 的 kvstore 使用memberlistdistributor根据tempo.traces.*开关动态生成各协议的 receiver 端点Jaeger gRPC0.0.0.0:14250Jaeger thrift_compact0.0.0.0:6831thrift_binary0.0.0.0:6832Jaeger thrift_http0.0.0.0:14268Zipkin0.0.0.0:9411OTLP HTTP0.0.0.0:4318OTLP gRPC0.0.0.0:4317OpenCensus0.0.0.0:55678querierfrontend_worker指向 query-frontend 的 headless 服务实现查询结果回传ingesterlifecycler.ring使用 memberlisttokens_file_path位于tempo.dataDirmetrics_generatorWAL 路径为{dataDir}/walremote_write来自metricsGenerator.remoteWritememberlistbind 到 gossipRing 端口7946并自动加入 gossip-ring headless 服务完成集群成员发现serverhttp_listen_port3200、grpc_listen_port9095storage.trace本地后端WAL 路径{dataDir}/wal、trace 数据路径{dataDir}/traces。注意配置内容支持 Go 模板渲染include common.tplvalues.render这意味着你可以在tempo.configuration中引用 Chart 内计算出的服务名等动态值。3.5 追踪协议开关在tempo.traces下Chart 提供了细粒度的协议开关默认值见下表用于决定 distributor 监听哪些 receiver参数说明默认tempo.traces.jaeger.grpc启用 Jaeger GRPC 追踪truetempo.traces.jaeger.thriftBinary启用 Jaeger Thrift Binaryfalsetempo.traces.jaeger.thriftCompact启用 Jaeger Thrift Compactfalsetempo.traces.jaeger.thriftHttp启用 Jaeger Thrift HTTPtruetempo.traces.otlp.http启用 OpenTelemetry HTTPfalsetempo.traces.otlp.grpc启用 OpenTelemetry gRPCfalsetempo.traces.opencensus启用 OpenCensusfalsetempo.traces.zipkin启用 Zipkinfalse从 values.yaml 的模板逻辑可以看出每个开关对应的 receiver 端点只有在对应开关为 true 时才会被渲染进tempo.yaml。四、配置与安装细节4.1 资源请求与限制Chart 允许为所有容器设置resourcesCPU、内存请求与限制这对生产工作负载至关重要且应针对实际场景调整。为了简化这一过程Chart 提供了resourcesPreset预设值可自动填充resources段合法取值为none、nano、micro、small、medium、large、xlarge、2xlarge预设定义复用自 bitnami/common chart 的 _resources.tpl。需要说明resourcesPreset适合快速起步但生产环境不建议直接使用预设因为预设无法完全贴合你的具体需求官方推荐显式配置resourcescompactor.resources、ingester.resources等。资源渲染逻辑如 compactor deployment.yaml当resources非空时优先使用resources否则当resourcesPreset ! none时套用预设。4.2 滚动标签Rolling tag与不可变标签Immutable tag生产环境强烈建议使用不可变标签immutable tag。这样可以确保部署不会因为同一 tag 被更新为不同镜像而自动变化。Bitnami 会在主容器发布新版本、发生重大变更或存在严重漏洞时发布新版本 Chart 来更新容器。在 values.yaml 中可以看到当前默认 tag 为2.8.2-debian-12-r1这是带完整版本号的可追溯镜像。也可以使用tempo.image.digest如sha256:aa....锁定镜像摘要注意 digest 一旦设置会覆盖 tag。4.3 附加环境变量若需为某个组件注入额外环境变量如自定义初始化脚本可在各子配置中通过extraEnvVars添加distributor、compactor、ingester、querier、queryFrontend、vulture六个子配置均支持compactor: extraEnvVars: - name: LOG_LEVEL value: error distributor: extraEnvVars: - name: LOG_LEVEL value: error ingester: extraEnvVars: - name: LOG_LEVEL value: error querier: extraEnvVars: - name: LOG_LEVEL value: error queryFrontend: extraEnvVars: - name: LOG_LEVEL value: error vulture: extraEnvVars: - name: LOG_LEVEL value: error也可以改用 ConfigMap 或 Secret 承载环境变量通过各子配置的extraEnvVarsCM或extraEnvVarsSecret引用。在模板中这些值会分别渲染为env列表与envFromconfigMapRef/secretRef见 compactor deployment.yaml。4.4 Sidecar 与 Init Container如果需要在同一 Pod 中附加额外容器如额外的指标或日志导出器可以通过各子配置的sidecars参数定义sidecars: - name: your-image-name image: your-image imagePullPolicy: Always ports: - name: portname containerPort: 1234如果 sidecar 需要暴露额外端口可通过service.extraPorts补充service: extraPorts: - name: extraPort port: 11311 targetPort: 11311两点重要提示Chart 本身已为可用的 Prometheus exporter 内置了 sidecar 容器可通过部署时添加--enable-metricstrue激活因此sidecars参数只应用来添加额外容器。如需 init 容器使用initContainers参数initContainers: - name: your-image-name image: your-image imagePullPolicy: Always ports: - name: portname containerPort: 1234另外Chart 还内置了可选的volumePermissionsinit 容器默认enabled: false用于在启用持久化时修正 PV 挂载点的属主为runAsUser:fsGroup其实现逻辑可参考 ingester statefulset.yaml。4.5 Pod 亲和性AffinityChart 允许通过affinity参数设置自定义亲和性。作为替代也可使用 bitnami/common chart 提供的预设配置podAffinityPreset、podAntiAffinityPreset或nodeAffinityPreset每个组件子配置均支持。从模板实现看如 compactor deployment.yaml当affinity为空时模板会依次渲染podAffinity、podAntiAffinity、nodeAffinity三个预设当显式设置affinity后预设即被忽略。各组件默认podAntiAffinityPresetsoft。4.6 外部 Memcached 支持如果希望 Tempo 连接集群外部的 Memcached例如使用托管缓存服务或让多个应用共享缓存服务器可以通过externalMemcached参数指定连接信息并同时关闭 Chart 自带的 memcached 子 Chartmemcached.enabledfalse externalMemcached.hostmyexternalhost externalMemcached.port11211相关参数包括externalMemcached.host默认与externalMemcached.port默认11211。若保留内置 memcachedmemcached.enabledtrue默认它作为子 Chart 部署默认端口11211支持memcached.auth.enabled认证开关默认 false。4.7 备份与恢复Kubernetes 上备份/恢复 Helm Chart 部署需要备份源部署的持久卷并使用 Velero 等工具将其挂载到新部署中。具体操作请参考 Bitnami 官方 Velero 备份恢复指南。五、持久化PersistenceBitnami 的 grafana-tempo 镜像将 ingester 数据存放在容器/bitnami路径下实际数据目录由tempo.dataDir指定默认/bitnami/grafana-tempo/data。Chart 使用 Persistent Volume ClaimsPVC保证数据跨部署留存ingester.persistence.enabled默认trueingester 是 StatefulSet通过volumeClaimTemplates动态创建 PVC见 ingester statefulset.yamlmetricsGenerator.persistence.enabled默认falsemetrics-generator 的 WAL 持久化默认关闭可按需开启。ingester 的持久化参数如下参数说明默认ingester.persistence.enabled启用持久化trueingester.persistence.existingClaim使用已有 PVC 名称ingester.persistence.storageClassPVC 存储类ingester.persistence.subPath挂载的子目录ingester.persistence.accessModes访问模式[ReadWriteOnce]ingester.persistence.sizePVC 容量8Giingester.persistence.annotations额外 PVC 注解{}ingester.persistence.selector匹配已有 PV 的选择器{}metrics-generator 的持久化参数与 ingester 结构一致metricsGenerator.persistence.*默认8Gi、ReadWriteOnce。六、Prometheus 监控集成6.1 开启原生指标将metrics.enabled设为true后Chart 会在容器与服务中暴露 Grafana Tempo 原生的 Prometheus 端口并为 Service 添加 Prometheus 自动抓取所需的注解。6.2 前置要求集成生效需要集群中已有可用的 Prometheus 或 Prometheus Operator 部署。可以安装 Bitnami 的 prometheus Chart 或 kube-prometheus Chart 快速获得。6.3 与 Prometheus Operator 集成Chart 支持部署ServiceMonitor对象以便与 Prometheus Operator 集成只需设置metrics.serviceMonitor.enabledtrue注意如果集群未安装 Prometheus Operator 的 CustomResourceDefinitions安装会失败并报错no matches for kind ServiceMonitor in version monitoring.coreos.com/v1解决方式是先安装 Bitnami kube-prometheus Chart 以获得必要的 CRD 与 Operator。从模板看各组件目录下都有独立的 servicemonitor.yaml 模板说明每个 Tempo 组件都可被单独监控。七、核心参数速查表7.1 Global 参数名称说明默认global.imageRegistry全局 Docker 镜像仓库global.imagePullSecrets全局镜像拉取 Secret 数组[]global.defaultStorageClass全局默认 StorageClassglobal.storageClass已废弃改用 defaultStorageClassglobal.security.allowInsecureImages跳过镜像校验falseglobal.compatibility.openshift.adaptSecurityContext适配 Openshift restricted-v2 SCC移除 runAsUser/runAsGroup/fsGroup。取值 auto/force/disabledauto7.2 Common 参数名称说明默认kubeVersion覆盖 Kubernetes 版本nameOverride部分覆盖 common.names.fullnamefullnameOverride完全覆盖 fullnamecommonLabels应用到所有对象的标签{}commonAnnotations应用到所有对象的注解{}clusterDomain集群域名cluster.localextraDeploy额外部署的对象数组[]diagnosticMode.enabled诊断模式禁用探针并覆盖命令falsediagnosticMode.command覆盖所有容器的命令[sleep]diagnosticMode.args覆盖所有容器的参数[infinity]7.3 Tempo 公共参数名称说明默认tempo.image.registry/tempo.image.repository镜像仓库与仓库名REGISTRY_NAME/REPOSITORY_NAME/grafana-tempotempo.image.digest镜像摘要设置后覆盖 tagtempo.image.pullPolicy镜像拉取策略IfNotPresenttempo.image.pullSecrets镜像拉取 Secret[]tempo.memBallastSizeMbs各组件内存 ballast 大小MB1024tempo.dataDir数据目录/bitnami/grafana-tempo/datatempo.configurationTempo 组件配置Go 模板可渲染见 3.4 节tempo.existingConfigmap已有 tempo 配置 ConfigMap 名称tempo.overridesConfiguration组件 overrides 配置overrides: {}tempo.existingOverridesConfigmap已有 overrides 配置 ConfigMaptempo.containerPorts.webHTTP 端口3200tempo.containerPorts.grpcgRPC 端口9095tempo.containerPorts.gossipRingGossip Ring 端口7946tempo.gossipRing.service.ports.httpGossip Ring headless 服务端口79467.4 各组件 Deployment 参数结构一致compactor、distributor、ingester、querier、queryFrontend、vulture、metricsGenerator的部署参数结构高度一致核心差异仅在默认值上副本数replicaCount默认均为1探针livenessProbe/readinessProbe默认enabledtrueperiod10s、timeout1s、failureThreshold3、startupProbe默认falsecompactor 的 liveness/readiness 探针 initialDelaySeconds 为80s其余组件为10s也可通过customLivenessProbe/customReadinessProbe/customStartupProbe完全覆盖默认探针资源resourcesPreset默认nano、resources默认{}生产推荐安全上下文podSecurityContext.fsGroup1001containerSecurityContext.runAsUser1001、runAsGroup1001、runAsNonRoottrue、privilegedfalse、readOnlyRootFilesystemtrue、allowPrivilegeEscalationfalse、capabilities.drop[ALL]、seccompProfile.typeRuntimeDefault调度podAffinityPreset、podAntiAffinityPresetsoft、nodeAffinityPreset.*、affinity、nodeSelector、tolerations、topologySpreadConstraints、priorityClassName、schedulerName更新策略updateStrategy.typeRollingUpdate扩展extraVolumes、extraVolumeMounts、sidecars、initContainers、extraEnvVars、extraEnvVarsCM、extraEnvVarsSecret、command、args可用性pdb.createtrueminAvailable与maxUnavailable均空时默认 maxUnavailable1其他lifecycleHooks、automountServiceAccountToken默认 false、hostAliases、podLabels、podAnnotations、enableServiceLinks。组件特有参数补充queryFrontendqueryFrontend.query.enabled默认false仅 Grafana 7.5 的旧版 Jaeger UI 兼容需要、queryFrontend.query.image.*、queryFrontend.query.configuration、queryFrontend.query.existingConfigmap、queryFrontend.query.containerPorts.grpcJaeger7777metricsGeneratormetricsGenerator.remoteWriteremote_write 配置数组vulturevulture.image.repositoryREPOSITORY_NAME/grafana-tempo-vulture、vulture.containerPorts.http8080。7.5 Traffic Exposure流量暴露参数每个组件都有对应的 service 参数块结构一致名称说明默认XXX.service.typeService 类型ClusterIPXXX.service.ports.httpHTTP 端口3200XXX.service.ports.grpcgRPC 端口9095XXX.service.nodePorts.http/nodePorts.grpcNodePortXXX.service.sessionAffinity会话亲和NoneXXX.service.clusterIPCluster IPXXX.service.loadBalancerIPLoadBalancer IPXXX.service.loadBalancerSourceRangesLB 来源网段[]XXX.service.externalTrafficPolicy外部流量策略ClusterXXX.service.annotations额外注解{}XXX.service.extraPorts额外端口[]差异点distributor/ingester/querier的 service 同时暴露nodePorts.grpcqueryFrontend额外暴露queryFrontend.service.ports.grpcJaeger7777供 Jaeger query 集成以及queryFrontend.service.headless.annotationscompactor的 service 只暴露nodePorts.http。7.6 网络策略NetworkPolicy每个组件默认创建 NetworkPolicyXXX.networkPolicy.enabledtrue常用子参数名称说明默认networkPolicy.allowExternal不要求 server 标签即可连接truenetworkPolicy.allowExternalEgress允许访问任意端口与目的地truenetworkPolicy.addExternalClientAccess允许 client 标签为 true 的 Pod 访问allowExternaltrue 时忽略truenetworkPolicy.extraIngress/extraEgress额外入站/出站规则[]networkPolicy.ingressPodMatchLabels/ingressNSMatchLabels/ingressNSPodMatchLabels跨 Pod/跨命名空间的放行标签匹配{}7.7 其他参数ServiceAccount 参数名称说明默认serviceAccount.create创建 ServiceAccounttrueserviceAccount.nameServiceAccount 名称serviceAccount.automountServiceAccountToken自动挂载 SA TokenfalseserviceAccount.annotations额外注解{}Metrics 参数名称说明默认metrics.enabled启用指标falsemetrics.serviceMonitor.enabled创建 ServiceMonitorfalsemetrics.serviceMonitor.namespaceServiceMonitor 命名空间默认 Release 命名空间metrics.serviceMonitor.interval抓取间隔metrics.serviceMonitor.scrapeTimeout抓取超时metrics.serviceMonitor.labels附加标签供 Prometheus 发现{}metrics.serviceMonitor.selectorPrometheus 实例选择器{}metrics.serviceMonitor.relabelings/metricRelabelings抓取前/入库前重新标记[]metrics.serviceMonitor.honorLabelshonorLabels 参数falsemetrics.serviceMonitor.jobLabeljob 名标签VolumePermissions 参数volumePermissions.enabled默认false使用os-shell镜像默认 tag 为12-debian-12-r50volumePermissions.containerSecurityContext.runAsUser0。Memcached 子 Chart 参数memcached.enabledtrue、memcached.auth.enabledfalse、memcached.service.ports.memcached11211、memcached.resourcesPresetnano。八、升级注意事项Chart 的 README.md 记录了多个破坏性升级要点升级前务必对照升级到 5.0.0grafana-tempo-query改为独立的 gRPC 服务不再作为 Jaeger 存储插件工作Jaeger 不再随grafana-tempo-query镜像分发。影响移除 Jaeger 暴露的端口tempo-query暴露的 gRPC 端口已加入 Service 与网络策略以支持与 Jaeger 集成升级到 4.0.0metrics-generator组件由 Deployment 改为 StatefulSet升级到 3.8.0引入镜像校验可通过global.security.allowInsecureImagestrue关闭升级到 3.0.0安全默认值变更包括runAsGroup从0改为1001、readOnlyRootFilesystemtrue、resourcesPreset从none调整为测试可用的最小规格注意resourcesPreset不面向生产、global.compatibility.openshift.adaptSecurityContext从disabled改为auto。这些变更可能影响自定义或 init 脚本如受影响请改回旧默认值升级到 2.0.0移除search_enabled与metrics_generator_enabled配置参数视为始终启用升级到 1.0.0大量参数重命名包括端口参数归入containerPorts与ports映射以及 Memcached 子 Chart 升级到 6.x.x 大版本。九、故障排查遇到 Chart 相关常见错误时可参考 Bitnami 官方的 Helm Chart 故障排查指南面向通用 Bitnami Chart 问题。结合本文已覆盖的源码与配置这里给出几个高频排查切入点ServiceMonitor 报no matches for kind ServiceMonitor确认 Prometheus Operator CRD 已安装见 6.3 节配置未生效确认tempo.configuration修改后 Pod 已因checksum/config注解变化而滚动更新持久化问题确认ingester.persistence.enabled与 StorageClass 配置必要时启用volumePermissions修正 PV 属主组件间发现异常确认 gossip-ring headless 服务存在且各组件带有tempo-gossip-member: true标签由模板自动添加。十、结语Bitnami 的 grafana-tempo Chart 以组件化方式将 Tempo 的 distributor、ingester、querier、compactor、query-frontend、metrics-generator 与 vulture 完整打包到 Kubernetes开箱即用且保留了高度的可定制性从追踪协议开关、memcached 缓存、本地/远程存储、Prometheus 与 ServiceMonitor 监控集成到细粒度的资源、探针、安全上下文与亲和性控制。无论是快速验证还是生产落地这份 Chart 的 values.yaml 与 templates 目录都是可直接上手研读的第一手参考资料。赞分享云原生容器编排【免费下载链接】chartsBitnami Helm Charts项目地址https://gitcode.com/GitHub_Trending/charts30/charts点击查看免费下载相关推荐基于 Helm 在 Kubernetes 上部署 JFrog Artifactoryincubator/artifactory Chart 实战指南基于 Helm 在 Kubernetes 上部署 JFrog Artifactoryincubator/artifactory Chart 实战指南 本文以在 Kubernetes 上使用 Helm Chart 部署 MEAN 应用kubernetes-handbook 中的 mean Chart 实战指南在 Kubernetes 上使用 Helm Chart 部署 MEAN 应用kubernetes handbook 中的 mean Chart 实战指南 导读教程云原生容器编排在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南在 Kubernetes 上部署 Discourse 论坛Bitnami Helm Chart 完整实战指南 Discourse 是一款自带版主与治理机制的开云原生容器编排上一篇Rufus 制作启动盘教程5 步写出可用的系统安装盘下一篇如何快速安装Instaloader从pip到Windows独立可执行文件与Android Termux的5种完整方法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑