免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

使用 Nomad 部署 Loki Monolithic 模式:最小依赖、可水平扩展的完整实战指南

使用 Nomad 部署 Loki Monolithic 模式:最小依赖、可水平扩展的完整实战指南 使用 Nomad 部署 Loki Monolithic 模式最小依赖、可水平扩展的完整实战指南【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki导读本文基于仓库 examples/nomad/loki-monolithic 目录下的完整示例系统讲解如何用 HashiCorp Nomad 以Monolithic单体部署模式运行 Loki——一种以最少依赖、使用对象存储S3与 TSDB 索引、并具备水平扩展能力的部署形态。读完本文你将掌握完整的job.nomad.hcl作业定义与config.yml配置逐段解读、nomad job run / scale的启停与扩容操作以及如何结合 Consul、Traefik、Vault 与 Nomad 模板渲染机制在生产环境中加固这套部署。一、Monolithic 模式在 Nomad 上的定位Loki 支持多种部署模式单体、微服务、读写分离等。Monolithic 模式将 Loki 的全部组件——distributor、ingester、querier、compactor、ruler、query-frontend等——打包进同一个进程通过-targetall启动对运维而言只有一个部署单元却能复用底层分布式能力。仓库在 examples/nomad 下提供了三种 Nomad 作业示例方便对比定位loki-monolithic本文主角单体模式 最小依赖Consul S3loki-ha-monolithic高可用单体模式TSDB S3同样支持扩缩容loki-microservices微服务模式将各组件拆分为独立 task。本示例的架构依赖被刻意压到最小Consul用于 KV 存储与 ring 服务发现和S3 兼容对象存储存放数据块与索引。它不依赖 Kafka、不依赖独立的 memcached也不需要单独的存储组件——Nomad 的 ephemeral disk 承担了 WAL、索引与缓存的本地持久化职责。二、部署前置条件根据 examples/nomad/README.md 的说明运行该作业需要硬性要求安装较新版本的 Nomad且 Docker 驱动健康可用在 Nomad 中启用 Consul 集成作业里依赖 Consul 注册服务与 KV可访问 S3 存储用于存放数据块与索引。可选要求集成 Vault 以安全提供 S3 凭据下文给出两种 template 写法配置 Traefik 使用 Consul Catalog Provider以便在多个 Loki 实例之间做负载均衡。生产环境建议来自仓库 README 的 Recommendations用 Consul Connect 保护 HTTP 端点通过 Traefik 的 basicauth 中间件 配置认证用 Vault 的 PKI 引擎 对组件间 GRPC 通信启用 mTLS。三、逐段解析 job.nomad.hcl作业定义文件 job.nomad.hcl 是整套部署的骨架下面按块拆解。3.1 版本变量variable version { type string description Loki version default 3.7.2 }镜像版本被声明为 Nomad 变量默认3.7.2。部署其他版本时无需改动文件直接命令行覆盖即可见 4.2 节。3.2 作业与组定义job loki { datacenters [dc1] group loki { count 1job loki在dc1数据中心运行group loki的count 1是水平扩展的入口——把count调大Nomad 就会调度多个副本详见第五节。3.3 ephemeral_disk本地状态的归宿ephemeral_disk { # Used to store index, cache, WAL # Nomad will try to preserve the disk between job updates size 1000 sticky true }这是本示例最小依赖的关键设计Loki 的WAL、TSDB 索引、缓存都放在 Nomad 分配allocation的临时磁盘上。sticky true表示作业更新时 Nomad 会尽量保留这份磁盘数据避免每次发布都丢失本地状态。3.4 网络端口network { port http { to 3100 static 3100 } port grpc {} }http端口映射到容器内3100Loki 默认 HTTP 端口并指定静态宿主机端口3100便于固定访问入口grpc端口不指定静态端口由 Nomad 动态分配供 Loki 组件间与 ring 通信使用。3.5 task镜像、启动参数与配置文件渲染task loki { driver docker user nobody config { image grafana/loki:${var.version} ports [ http, grpc, ] args [ -targetall, -config.file/local/config.yml, -config.expand-envtrue, ] }关键点逐一说明user nobody以非 root 用户运行容器降低提权风险image grafana/loki:${var.version}镜像标签直接引用 3.1 的变量-targetall这是 Monolithic 模式的本质——启动 Loki 的全部模块。在 pkg/loki/loki.go 中-target参数被注册为可多选的 CSV 标志并提示用-list-targets可打印所有可用 targetmodules.go中的依赖图如 querier/ruler 依赖 ingester 相关模块保证了all模式下组件间自动按依赖顺序初始化-config.file/local/config.yml指定配置文件路径/local是 Nomad 为任务挂载的本地目录-config.expand-envtrue允许在配置文件中展开${VAR}环境变量。该参数在 pkg/loki/config_wrapper.go 中注册官方注释为根据环境变量值展开配置中的${var}——这正是config.yml中${S3_ACCESS_KEY_ID}能被注入的底层机制。配置文件通过 Nomadtemplate渲染进容器template { data file(config.yml) destination local/config.yml }file(config.yml)读取作业同目录下的 Loki 配置文件渲染后落到/local/config.yml。注意Loki 配置本身还嵌套了 Consul Template 语法如{{ env NOMAD_PORT_http }}Nomad 模板引擎会一并解析因此端口、IP 等运行时信息被自动注入。3.6 S3 凭据从占位符到真实密钥template { data -EOH S3_ACCESS_KEY_IDaccess_key S3_SECRET_ACCESS_KEYsecret_access_key EOH destination secrets/s3.env env true }该模板生成secrets/s3.env并设置env true使其内容成为容器环境变量。实际使用前必须把access_key/secret_access_key替换为真实凭据或改用 Vault 动态提供见第七节。3.7 告警规则dynamic template 动态注入dynamic template { for_each fileset(., rules/**) content { data file(template.value) destination local/${template.value} left_delimiter [[ right_delimiter ]] } }这是 Nomad HCL2 的魔法组合fileset(., rules/**)递归列出rules/目录下所有文件file(template.value)读取每个文件内容dynamic template为每个文件生成一个模板块目标路径保持相对结构如local/rules/fake/alerts.ymlleft_delimiter/right_delimiter改为[[ ]]避免与 Loki 规则文件本身的内容如 Prometheus 告警语法中的{{ }}模板冲突。仓库自带的示例规则在 rules/fake/alerts.yml是一个永远触发的测试告警groups: - name: always-firing rules: - alert: fire expr: | 1 0 for: 0m labels: severity: warning annotations: summary: test这些规则最终落入 ruler 的本地规则目录{{ env NOMAD_TASK_DIR }}/rules配合config.yml中ruler.storage.type: local使用。3.8 服务注册与健康检查service { name loki port http # use Traefik to loadbalance between Loki instances tags [ traefik.enabletrue, traefik.http.routers.loki.entrypointshttps, traefik.http.routers.loki.ruleHost(loki.service.consul), ] check { name Loki port http type http path /ready interval 20s timeout 1s initial_status passing } }服务注册名为loki指向http端口Traefik 标签实现反向代理与负载均衡loki.service.consul域名路由到所有 Loki 实例健康检查请求/readyLoki 的就绪端点20 秒一次、1 秒超时初始状态直接设为passing避免启动瞬间被误判。3.9 资源配额resources { # adjust to suite your load cpu 500 memory 256 # requiers memory_oversubscription # https://www.nomadproject.io/api-docs/operator/scheduler#update-scheduler-configuration # memory_max 512 }默认cpu 500MHz、memory 256MiB注释明确要求按实际负载调整。如需突发内存可在 Nomad 开启memory_oversubscription调度器配置后放开memory_max 512默认被注释掉。四、config.ymlLoki 侧的关键配置配置文件 config.yml 与作业文件相互配合全部使用 Nomad 环境变量注入运行时信息。4.1 服务监听与地址通告auth_enabled: false server: log_level: info http_listen_port: {{ env NOMAD_PORT_http }} grpc_listen_port: {{ env NOMAD_PORT_grpc }} common: replication_factor: 1 # Tell Loki which address to advertise instance_addr: {{ env NOMAD_IP_grpc }} ring: # Tell Loki which address to advertise in ring instance_addr: {{ env NOMAD_IP_grpc }} kvstore: store: consul prefix: loki/ consul: host: {{ env attr.unique.network.ip-address }}:8500auth_enabled: false关闭多租户认证单租户场景直接可用监听端口取自 Nomad 动态分配的端口变量避免硬编码冲突replication_factor: 1副本数 1属于单体最小依赖的取舍ring 使用 Consul KVstore: consul前缀loki/Consul 地址为节点 IP 的 8500。instance_addr通告的是分配到的 GRPC 网络 IPNOMAD_IP_grpc。这一点非常关键仓库根 README 明确提到多实例场景下 memberlist 会通告错误地址对应 grafana/loki 的 issue #5610因此这里统一用 Consul ring 做服务发现——使用 Nomad 通常也伴随 Consul不会引入额外运维负担。4.2 WAL 与数据目录ingester: wal: dir: {{ env NOMAD_ALLOC_DIR }}/data/wal flush_on_shutdown: true replay_memory_ceiling: 1GWAL 写入NOMAD_ALLOC_DIR/data/wal即 ephemeral disk配合sticky磁盘实现跨更新保留flush_on_shutdown: true保证优雅停机时 WAL 落盘replay_memory_ceiling: 1G限制 WAL 重放时的内存上限。4.3 存储 schema 与 S3schema_config: configs: - from: 2022-05-15 store: tsdb object_store: s3 schema: v13 index: prefix: index_ period: 24h storage_config: boltdb_shipper: # Nomad ephemeral disk is used to store index and cache # it will try to preserve /alloc/data between job updates active_index_directory: {{ env NOMAD_ALLOC_DIR }}/data/index cache_location: {{ env NOMAD_ALLOC_DIR }}/data/index-cache aws: endpoint: https://s3.endpoint.com bucketnames: loki region: us-west-1 access_key_id: ${S3_ACCESS_KEY_ID} secret_access_key: ${S3_SECRET_ACCESS_KEY} s3forcepathstyle: trueschema 从2022-05-15起使用tsdb索引、v13版本对象存储走s3索引分片周期24hboltdb_shipper的本地索引与缓存同样落在 ephemeral diskaws段即 S3 连接配置endpoint、bucketnames、region需按你的对象存储服务修改access_key_id/secret_access_key使用${S3_ACCESS_KEY_ID}环境变量占位由 3.6 节的模板注入这就是-config.expand-envtrue发挥作用的地方s3forcepathstyle: true适配 MinIO 等路径风格寻址的对象存储。4.4 限制、压缩器与 rulerlimits_config: reject_old_samples: true reject_old_samples_max_age: 168h compactor: working_directory: {{ env NOMAD_ALLOC_DIR }}/compactor compaction_interval: 5m delete_request_store: s3 retention_enabled: true ruler: alertmanager_url: https://alertmanager.service.consul enable_alertmanager_v2: true enable_api: true external_url: https://loki.service.consul rule_path: {{ env NOMAD_ALLOC_DIR }}/tmp/rules storage: type: local local: directory: {{ env NOMAD_TASK_DIR }}/rules wal: dir: {{ env NOMAD_ALLOC_DIR }}/data/ruler限制层面拒绝超过 168 小时7 天的旧样本防止迟到数据污染compactor 每 5 分钟运行一次索引压缩与保留策略删除请求存储于 S3retention_enabled: true开启数据保留ruler 对接alertmanager.service.consul发送告警规则本地存储type: local目录指向 3.7 节模板注入的/local/rules。五、运行与扩缩容操作5.1 运行作业在作业文件所在目录执行nomad run job.nomad.hcl部署前务必先阅读 job.nomad.hcl 与 config.yml把 S3 凭据、endpoint、region、Consul 地址等替换为你自己的环境。5.2 指定版本部署默认版本是3.7.2需要其他版本时既可以修改variable.version的default也可以命令行覆盖nomad job run -varversion3.7.2 job.nomad.hcl5.3 水平扩容方式一改count。修改group loki中的count后重新执行nomad run job.nomad.hcl方式二Nomad 原生 scale 命令无需改文件nomad job scale loki loki count其中第一个loki是 job 名第二个loki是 group 名count为目标实例数。扩容后新增实例通过 Consul ring 自动加入集群Traefik 依据服务标签自动把请求负载均衡到所有实例——这就是示例具备扩展能力的体现。六、负载均衡与认证加固多实例部署时请求必须被负载均衡仓库 examples/nomad/README.md 给出了与 Traefik 的整合方式。6.1 注册到 Traefik作业中的tags已内置 Traefik 路由规则tags [ traefik.enabletrue, traefik.http.routers.loki.entrypointshttps, traefik.http.routers.loki.ruleHost(loki.service.consul), ]Traefik 通过 Consul Catalog Provider 发现这些标签把https://loki.service.consul的流量分发给所有健康实例。6.2 配置 BasicAuth先生成凭据以 httpd 镜像为例docker run --rm httpd:alpine htpasswd -nb promtail password123 # 输出形如promtail:$apr1$Lr55BanK$BV/rE2POaOolkFz8kIfY4/再在服务标签中加入 basicauth 中间件tags [ traefik.enabletrue, traefik.http.routers.loki.entrypointshttps, traefik.http.routers.loki.ruleHost(loki.service.consul), traefik.http.middlewares.loki.basicauth.userspromtail:$apr1$Lr55BanK$BV/rE2POaOolkFz8kIfY4/, traefik.http.routers.loki.middlewareslokiconsulcatalog, ]然后让 Promtail 携带凭据推送日志clients: - url: https://loki.service.consul/loki/api/v1/push basic_auth: username: promtail password_file: password123七、用 Vault 安全提供 S3 凭据不把密钥写死在作业文件里可集成 Vault。静态凭据写法template { data -EOH {{ with secret secret/minio/loki }} S3_ACCESS_KEY_ID{{ .Data.data.access_key }} S3_SECRET_ACCESS_KEY{{ .Data.data.secret_key }} {{- end }} EOH destination secrets/s3.env env true }使用 AWS 时更推荐 AWS Secret Engine 的动态凭据template { data -EOH {{ with secret aws/creds/loki -}} S3_ACCESS_KEY_ID{{ .Data.access_key }} S3_SECRET_ACCESS_KEY{{ .Data.secret_key }} {{- end }} EOH destination secrets/s3.env env true }两种方式都渲染到secrets/s3.env并注入为环境变量与config.yml中的${S3_ACCESS_KEY_ID}/${S3_SECRET_ACCESS_KEY}天然衔接。八、告警规则的分发方式除本示例采用的作业旁本地文件 dynamic template外仓库 README 还提供两种常见做法。1artifact从远程拉取artifact { source git::github.com/someorg/repo//subdirectory_with_loki_rules destination local/rules/ }支持 Git、Mercurial、HTTP、Amazon S3、GCP 等源。2Consul K/V Terraform consul-template先用 Terraform 的 Consul provider 把规则写入 K/Vconfigs/loki-rules/...再在作业中通过safeTree合并渲染template { data -EOF {{- range safeTree configs/loki-rules }} --- {{ .Value | indent 2 }} {{ end -}} EOF destination local/rules/fake/rules.yml change_mode signal change_signal SIGINT }规则在 Consul K/V 中更新后Loki ruler 会自动收到信号并加载新规则。九、生产环境注意事项数据可靠性replication_factor: 1意味着单副本。生产环境可参考 loki-ha-monolithic 示例TSDB S3、支持扩容提升可用性安全基线生产环境建议用 Consul Connect 保护 HTTP、Traefik basicauth 做认证、Vault PKI 为 GRPC 启用 mTLS——具体 HCL 写法见 examples/nomad/loki-microservices/README.md监控指标可让 Prometheus 通过 Consul 服务发现采集loki-compactor、loki-ruler、loki-distributor、loki-ingestor、loki-querier、loki-query-frontend等组件的/metrics并打上component标签便于区分资源规划cpu/memory默认值仅为起步值请结合写入吞吐与查询负载调整必要时开启 Nomad 内存超卖并放开memory_max。结语本示例展示了在 Nomad 上以极低依赖运行 Loki 单体的完整闭环Consul 承载 ring 与 KV、S3 承载数据与索引、Nomad ephemeral disk 承载本地状态、Traefik 承载流量入口、Vault 承载凭据、模板机制承载配置与规则注入。对照 job.nomad.hcl 与 config.yml 两份文件逐步实践即可在几分钟内获得一套可运行、可扩容、可加固的 Loki 日志平台。【免费下载链接】lokiLike Prometheus, but for logs.项目地址: https://gitcode.com/GitHub_Trending/lok/loki创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表