对象存储接入(MinIO/COS)
日志(Loki)和链路(Tempo)默认存本地卷。数据量大或要跨节点共享时,可改为对象存储。
适用范围
- 单机部署:只有**日志(Loki)**需要考虑对象存储。单机不具备链路追踪能力、不产生链路数据,
ops-tempo无需也不建议配置对象存储。 - 集群部署:日志和链路都可以用对象存储,且必须用两个不同的桶。
一、准备 MinIO
已有 MinIO 或云对象存储可跳至第二步。
docker run -d --name minio \
-p 9000:9000 -p 9001:9001 \
-e MINIO_ROOT_USER=minioadmin \
-e MINIO_ROOT_PASSWORD='<强随机密码>' \
-v /data/minio:/data \
--restart always \
minio/minio server /data --console-address ":9001"
9000是 S3 API 端口(运维平台连接),9001是 Web 控制台。- 生产请把
MINIO_ROOT_PASSWORD换成强随机串,并只在内网暴露 9000。
浏览器打开 http://MinIO主机IP:9001,用上面的账号密码登录。
二、创建桶
Loki 和 Tempo 必须用不同的桶,共用会互相覆盖元数据。
控制台 Buckets → Create Bucket,或用命令行:
docker run --rm --network host --entrypoint sh minio/mc -c "
mc alias set local http://<MinIO主机IP>:9000 minioadmin '<密码>' &&
mc mb local/mdis-loki &&
mc mb local/mdis-tempo &&
mc ls local"
命名没有强制要求,本文用 mdis-loki/mdis-tempo。
三、创建访问密钥(AK/SK)
不要直接用 root 账号。控制台 Access Keys → Create access key,保存生成的 Access Key 与 Secret Key(Secret Key 只显示一次)。
命令行方式(建一个专用用户并授权到这两个桶):
docker run --rm --network host --entrypoint sh minio/mc -c "
mc alias set local http://<MinIO主机IP>:9000 minioadmin '<密码>' &&
mc admin user add local mdis '<SK,8位以上>' &&
mc admin policy attach local readwrite --user mdis"
四、填写配置
单机(ops.yaml)
只给 ops-loki 服务加环境变量:
ops-loki:
environment:
ENV_S3_ENDPOINT: 192.168.1.10:9000 # MinIO 的 S3 API 地址,填 host:port,不要带 http://
ENV_S3_BUCKET_LOKI: mdis-loki # 需提前在 MinIO 中创建该桶
ENV_S3_ACCESS_KEY: mdis
ENV_S3_SECRET_KEY: '<SK>'
ENV_S3_FORCE_PATH_STYLE: 'true'
改完 docker compose -f ops.yaml up -d ops-loki 重建该容器。
集群(10-secret.yaml)
stringData:
ENV_S3_ENDPOINT: "minio.default.svc.cluster.local:9000"
ENV_S3_ACCESS_KEY: "mdis"
ENV_S3_SECRET_KEY: "<SK>"
ENV_S3_FORCE_PATH_STYLE: "true"
桶名不在 Secret 里,而且两个组件各用各的
30-stateful.yaml 里给 ops-loki 配 ENV_S3_BUCKET_LOKI、给 ops-tempo 配
ENV_S3_BUCKET_TEMPO,两个桶必须不同。
不要把桶名写进共用的 Secret,也不要用旧的通用变量 ENV_S3_BUCKET——它会同时传给两个
组件,Loki 先写入占了目录结构后,Tempo 初始化就会失败、进入 CrashLoopBackOff。
(ENV_S3_BUCKET 仅为兼容存量部署保留。)
⚠️ 两个桶都要在部署前先建好。桶不存在时 Loki 报 NoSuchBucket 会反复重启。