Skip to content

Kubernetes exporter

Watches Deployment rollouts (and optionally ConfigMap / Secret changes) and pushes Evidence Events to the Evitrus ingest API. Runs in your cluster with read-only RBAC — no application code changes.

Prerequisites

  • A tenant ingest API key (evt_live_…)
  • Helm 3
  • Cluster access to install into a namespace you control

Install with Helm

From the exporter repository k8s/chart (path may vary by release — use the chart shipped with the exporter):

bash
helm install evitrus-k8s-exporter ./chart \
  --namespace evitrus --create-namespace \
  --set ingest.url=https://api.evitrus.dev/ingest \
  --set ingest.apiKey=<your-tenant-key>
ValuePurpose
ingest.urlhttps://api.evitrus.dev/ingest (dev)
ingest.apiKeyTenant key (prefer a Kubernetes Secret ref)
watch.configMapstrue by default
watch.secretsfalse by default — enable only if needed

Secret values are never emitted. Only key names and hashes are recorded.

What it emits

Types are platform-agnostic (deploy.* / operate.config.*). Kubernetes is recorded only as source: kubernetes plus metadata (kind, namespace, revision) — never as k8s.* event types.

Observed signalEvent type
Completed Deployment rolloutdeploy.succeeded
ConfigMap data changeoperate.config.changed (action in metadata)
Secret data change (if enabled)operate.config.changed (action in metadata)

Canonical deploy vocabulary (same types for ECS, Lambda, ACA, bare metal, …): deploy.started, deploy.progressed, deploy.succeeded, deploy.failed, deploy.rolled_back, deploy.blocked. This exporter currently emits deploy.succeeded on completed rollouts.

Correlation fields:

  • serviceevitrus.dev/service annotation → app.kubernetes.io/name → Deployment name
  • environmentevitrus.dev/environmentenv label → --environment-map namespace alias → namespace
  • commitShaevitrus.dev/commit → version label → hex image tag
  • Image digest on the primary container artifact (load-bearing for Change identity)

Annotations

yaml
metadata:
  annotations:
    evitrus.dev/service: payments-api
    evitrus.dev/environment: prod
    evitrus.dev/commit: a1b2c3d4e5f6
    # Skip this resource entirely:
    # evitrus.dev/ignore: "true"

Silence noisy resources

In the product UI under Integrations, add tenant ignore rules (event type plus optional tags, same matcher as controls: exact or deploy.*). Every customer-hosted exporter polls GET /ingest/config and skips matching events before POST; ingest still refuses them with 422 {ignored:true}. Keep evitrus.dev/ignore: "true" as a local skip for a single Kubernetes resource.

Verify

bash
kubectl -n evitrus logs deploy/evitrus-k8s-exporter -f

Roll a Deployment and confirm a deploy.succeeded event for that service in Changelog. To gate annotated workloads, install the Kubernetes evaluator as a separate Deployment.

Evitrus — observability for auditability