External S3 support for loki

What does this MR do and why?

Closes: #2195 (closed)

This MR enables the option to configure an external S3 endpoint for Loki .

Tested with localstack-s3 :

values.yaml:

logging:
  loki:
    storageConfig:
      bucketNames:
        chunks: "loki-chunks"
        ruler: "loki-ruler"
        admin: "loki-admin"
      s3:
        endpoint: "172.18.0.2:4566"
        accessKeyId: "test"
        secretAccessKey: "test"
        region: "us-east-1"
        s3ForcePathStyle: true
        insecure: true

cluster resources:

root@dev:/opt/sylva-core (loki-s3)# kubectl get pods -A | grep -E "loki|minio-logging"
loki                                loki-backend-0                                                    2/2     Running            0                92m
loki                                loki-chunks-cache-0                                               2/2     Running            0                130m
loki                                loki-gateway-9c6465cf4-fmw7z                                      1/1     Running            0                130m
loki                                loki-read-55c9f8f854-8t5xm                                        1/1     Running            0                92m
loki                                loki-results-cache-0                                              2/2     Running            0                130m
loki                                loki-write-0                                                      1/1     Running            0                87m
root@dev:/opt/sylva-core (loki-s3)# kubectl get kustomization -n sylva-system | grep -E "minio-logging"

root@dev:/opt/sylva-core (loki-s3)# kubectl get helmrelease -n sylva-system loki -o jsonpath='{.spec.values.loki.storage}' | jq .
{
  "bucketNames": {
    "admin": "loki-admin",
    "chunks": "loki-chunks",
    "ruler": "loki-ruler"
  },
  "s3": {
    "accessKeyId": "test",
    "endpoint": "172.18.0.2:4566",
    "insecure": true,
    "region": "us-east-1",
    "s3ForcePathStyle": true,
    "secretAccessKey": "test"
  }
}
root@dev:/opt/sylva-core (loki-s3)#  docker exec test-localstack-s3 awslocal s3 ls
2026-02-02 14:50:07 loki-chunks
2026-02-02 14:50:07 loki-ruler
2026-02-02 14:50:08 loki-admin

root@dev:/opt/sylva-core (loki-s3)# docker exec test-localstack-s3 awslocal s3 ls s3://loki-chunks --recursive | head -20
2026-02-02 15:00:30        135 index/delete_requests/delete_requests.gz
2026-02-02 16:01:30       4893 index/loki_index_20486/1770047130-loki-write-0-1770041863731932653.tsdb.gz
2026-02-02 16:16:30       3999 index/loki_index_20486/1770048030-loki-write-0-1770041863731932653.tsdb.gz
2026-02-02 15:55:36      19174 index/loki_index_20486/management-cluster/1770047736246427051-compactor-1770042251278-1770045265840-15004964.tsdb.gz
2026-02-02 15:50:59       1345 management-cluster/1027ff3c1451d479/19c1ef0fb13:19c1ef0fb14:f5b77d96
2026-02-02 15:37:44       6296 management-cluster/108aa4f2644ae1e4/19c1ec0b6d4:19c1ee4a17a:1f292031
2026-02-02 16:26:42       6116 management-cluster/11841d843dbc3ba8/19c1ebde07f:19c1f2d1342:7fffb845
2026-02-02 15:18:49       1339 management-cluster/120627c10bb8472e/19c1ebdee0f:19c1ed39914:a91b3770
2026-02-02 15:34:09       3247 management-cluster/12dc49d5efd67799/19c1eda07f6:19c1edaa481:1dbe6a11
2026-02-02 15:42:30       1678 management-cluster/13938f70bee44db6/19c1ec01ebf:19c1ee9524e:6b925bc3
2026-02-02 15:30:54       2199 management-cluster/13a2b265056ee4ad/19c1ed762ab:19c1ed76374:a0671e73
2026-02-02 15:36:36       2881 management-cluster/1408378e5da5eae2/19c1ebd63db:19c1ee406e0:5cb29ec9
2026-02-02 15:01:07       1324 management-cluster/1512d1166a7d12ed/19c1ebec59d:19c1ebec59e:fd01f505
2026-02-02 15:34:43       1286 management-cluster/167cb66e2f5849c1/19c1ede6e63:19c1ede6e64:7d5db0fa
2026-02-02 15:01:10       2390 management-cluster/171bee94639400bc/19c1ebe0969:19c1ebe096a:4bff7e6d
2026-02-02 15:03:11       1398 management-cluster/18649e548faad75a/19c1ebfaf3a:19c1ec52d7b:ec047300
2026-02-02 16:02:56       1331 management-cluster/18649e548faad75a/19c1efc1bfa:19c1efc1bfb:4d60c675
2026-02-02 16:26:18       5208 management-cluster/187c7fa49722e63b/19c1ebdacc4:19c1f2cbce7:5492c0aa
2026-02-02 16:17:27       1263 management-cluster/18fc8821c05adc8/19c1f0948e6:19c1f0948e7:8e88de21
2026-02-02 15:04:42       1543 management-cluster/19651c0b78ab4165/19c1ec6d2df:19c1ec6d2e1:bc6d3a3d

Test coverage

CI configuration

Below you can choose test deployment variants to run in this MR's CI.

Click to open to CI configuration

Legend:

Icon Meaning Available values
☁️ Infra Provider capd, capo, capm3
🚀 Bootstrap Provider kubeadm (alias kadm), rke2, okd, ck8s
🐧 Node OS ubuntu, suse, na, leapmicro
🛠️ Deployment Options light-deploy, dev-sources, ha, misc, maxsurge-0, logging, no-logging, cilium
🎬 Pipeline Scenarios Available scenario list and description
🟢 Enabled units Any available units name, by default apply to management and workload cluster. Can be prefixed by mgmt: or wkld: to be applied only to a specific cluster type
🏗️ Target platform Can be used to select specific deployment environment (i.e real-bmh for capm3 )
  • 🎬 preview ☁️ capd 🚀 kadm 🐧 ubuntu
  • 🎬 preview ☁️ capo 🚀 rke2 🐧 suse
  • 🎬 preview ☁️ capm3 🚀 rke2 🐧 ubuntu
  • ☁️ capd 🚀 kadm 🛠️ light-deploy 🐧 ubuntu
  • ☁️ capd 🚀 rke2 🛠️ light-deploy 🐧 suse
  • ☁️ capo 🚀 rke2 🛠️ logging 🐧 suse
  • ☁️ capo 🚀 rke2 🐧 leapmicro
  • ☁️ capo 🚀 kadm 🐧 ubuntu
  • ☁️ capo 🚀 kadm 🐧 ubuntu 🟢 neuvector,mgmt:harbor
  • ☁️ capo 🚀 rke2 🎬 rolling-update 🛠️ ha 🐧 ubuntu
  • ☁️ capo 🚀 kadm 🎬 wkld-k8s-upgrade 🐧 ubuntu
  • ☁️ capo 🚀 rke2 🎬 rolling-update-no-wkld 🛠️ ha 🐧 suse
  • ☁️ capo 🚀 rke2 🎬 sylva-upgrade 🛠️ ha 🐧 ubuntu
  • ☁️ capo 🚀 rke2 🎬 sylva-upgrade-from-1.6.x 🛠️ ha,misc 🐧 ubuntu
  • ☁️ capo 🚀 rke2 🛠️ ha,misc 🐧 ubuntu
  • ☁️ capo 🚀 rke2 🛠️ ha,misc,openbao:penguin: suse
  • ☁️ capo 🚀 rke2 🐧 suse 🎬 upgrade-from-prev-tag
  • ☁️ capm3 🚀 rke2 🛠️ logging 🎬 sylva-upgrade 🐧 suse
  • ☁️ capm3 🚀 kadm 🐧 ubuntu
  • ☁️ capm3 🚀 ck8s 🐧 ubuntu
  • ☁️ capm3 🚀 kadm 🎬 rolling-update-no-wkld 🛠️ ha,misc 🐧 ubuntu
  • ☁️ capm3 🚀 rke2 🎬 wkld-k8s-upgrade 🛠️ ha 🐧 suse
  • ☁️ capm3 🚀 kadm 🎬 rolling-update 🛠️ ha 🐧 ubuntu
  • ☁️ capm3 🚀 rke2 🎬 upgrade-from-prev-release-branch 🛠️ ha 🐧 suse
  • ☁️ capm3 🚀 rke2 🛠️ misc,ha 🐧 suse
  • ☁️ capm3 🚀 rke2 🎬 sylva-upgrade 🛠️ ha,misc 🐧 suse
  • ☁️ capm3 🚀 kadm 🎬 rolling-update 🛠️ ha 🐧 suse
  • ☁️ capm3 🚀 ck8s 🎬 rolling-update 🛠️ ha 🐧 ubuntu
  • ☁️ capm3 🚀 rke2|okd 🎬 no-update 🐧 ubuntu|na
  • ☁️ capm3 🚀 rke2 🐧 suse 🎬 upgrade-from-release-1.5
  • ☁️ capm3 🚀 rke2 🐧 suse 🎬 upgrade-to-main

Global config for deployment pipelines

  • autorun pipelines

  • allow failure on pipelines

  • record sylvactl events

Notes:

  • Enabling autorun will make deployment pipelines to be run automatically without human interaction
  • Disabling allow failure will make deployment pipelines mandatory for pipeline success.
  • if both autorun and allow failure are disabled, deployment pipelines will need manual triggering but will be blocking the pipeline

Be aware: after configuration change, pipeline is not triggered automatically. Please run it manually (by clicking the run pipeline button in Pipelines tab) or push new code.

Edited by Thomas Morin

Merge request reports

Loading