メインコンテンツへ移動

オブジェクトストレージの連携(MinIO/COS)

ログ(Loki)とトレース(Tempo)は、デフォルトではローカルボリュームに保存されます。データ量が多い場合や、ノード間で共有する場合は、オブジェクトストレージに変更できます。

対象となる構成
  • 単一サーバー構成:オブジェクトストレージの検討対象はログ(Loki)のみです。分散トレーシングに対応しておらず、トレースデータは生成されません。ops-tempo にオブジェクトストレージを設定する必要はなく、設定も推奨しません。
  • クラスター構成:ログとトレースの両方に利用できます。必ず別々のバケットを使用してください。

1. MinIO を準備する​

MinIO またはクラウドのオブジェクトストレージを用意済みの場合は、手順 2に進んでください。

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 を開き、上記の認証情報でログインします。

2. バケットを作成する​

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 を使用します。

3. アクセスキー(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"

4. 設定を入力する​

単一サーバー構成(ops.yaml)​

ops-loki サービスにのみ、次の環境変数を追加します。

ops-loki:
environment:
ENV_S3_ENDPOINT: 192.168.1.10:9000 # MinIO の S3 API アドレス。http:// を付けず host:port で指定
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 エラーで再起動を繰り返します。

5. 接続アドレスの指定方法(重要)​

ENV_S3_ENDPOINT には、コンソールではなく MinIO の S3 API アドレスを指定します。192.168.1.10:9000 または http://192.168.1.10:9000 のように、http:// の有無はどちらでも構いません。Tempo が使用する minio-go は host:port のみを受け付けるため、運用プラットフォームが Tempo の起動時にスキームを自動除去します。Loki 側は HTTP 接続に固定されています(設定で insecure: true を指定)。このため、⚠️ HTTPS のみを提供するオブジェクトストレージには現在対応していません。

構成endpoint に指定する値
MinIO と運用プラットフォームが同じ Compose ネットワーク内minio:9000 などのコンテナー名
MinIO が別の Compose 構成またはホスト上で稼働ホスト IP + ホスト側のマッピングポート。例:192.168.1.10:9011
MinIO が同じ Kubernetes クラスター内Service DNS。例:minio.default.svc.cluster.local:9000
クラウドのオブジェクトストレージプロバイダーが指定するエンドポイントのドメイン名
別のスタックのコンテナー名は指定しないでください

同じ Compose ネットワークに属していない場合、コンテナー名を名前解決できません。ops-loki が起動に失敗し、次のエラーが出力されます。

dial tcp: lookup minio: no such host

この場合はホスト IP を使用します。ホスト側のマッピングポートは 9000 とは限りません。docker ps の実際の表示を確認してください。たとえば 9011:9000 なら、9011 を指定します。

アドレス形式​

オブジェクトストレージENV_S3_FORCE_PATH_STYLE
MinIOtrue
Tencent Cloud COSfalse(virtual-hosted 形式のみ対応。true では失敗します)
UCloud US3true

6. 動作確認​

コンテナーの再作成後、ログとバケットを確認します。

# 1. コンテナーが起動し、S3 エラーがないことを確認
docker logs <lokiコンテナー> 2>&1 | grep -iE "error|fail" | head

# 2. ログを書き込んだ後、バケットにオブジェクトが作成されていることを確認
docker run --rm --network host --entrypoint sh minio/mc -c "
mc alias set local http://<MinIOのホストIP>:9000 mdis '<SK>' &&
mc ls -r local/mdis-loki | head"

fake/ または index/ で始まるオブジェクトがあれば正常です。Loki はバッチ書き込み後にアップロードするため、設定後は数分かかることがあります。

7. よくあるエラー​

ログのエラー原因
dial tcp: lookup xxx: no such hostコンテナーネットワークから名前解決できない endpoint を指定しています。手順 5を参照してください
connection refusedポートが誤っています。docker ps の実際のマッピングを確認してください
SignatureDoesNotMatchAK/SK が誤っています
AccessDeniedAK/SK は正しいものの、対象バケットへの権限がありません。ユーザーポリシーを確認してください
NoSuchBucketバケットが未作成、またはバケット名が誤っています
ストレージを切り替えても既存ログは移行されません

Loki のバックエンドを変更しても、既存データは移行されず、元のローカルボリュームに残ります。新しいバックエンドでログを確認するには、切り替え後にログを生成する必要があります。既存ログが表示されないことは、設定の失敗を意味しません。