Skip to content

simonjday/devops-lab-observability

Repository files navigation

devops-lab-observability

Production-ready observability stack for kind-devops-lab cluster: Loki (log aggregation) + Falco (runtime security).

This repo is separate from the main devops-lab-repo to keep concerns clean and allow reuse across clusters.


🎯 What This Does

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    kind-devops-lab Cluster                  β”‚
β”‚                                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚   All Pods     β”‚         β”‚   All Nodes      β”‚           β”‚
β”‚  β”‚   (all ns)     β”‚         β”‚                  β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚           β”‚                          β”‚                     β”‚
β”‚           β”‚                          β”‚                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”            β”‚
β”‚  β”‚        Promtail DaemonSet                  β”‚            β”‚
β”‚  β”‚  (Scrapes /var/log/pods/*)                β”‚            β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”˜            β”‚
β”‚           β”‚                                 β”‚              β”‚
β”‚           β”‚ Logs (HTTP push)                β”‚              β”‚
β”‚           β”‚                                 β”‚              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”          β”‚
β”‚  β”‚         Loki StatefulSet                     β”‚          β”‚
β”‚  β”‚   β€’ Stores in PVC (5Gi default)             β”‚          β”‚
β”‚  β”‚   β€’ Queryable via LogQL                     β”‚          β”‚
β”‚  β”‚   β€’ Integration with Grafana                β”‚          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”‚            β”‚                          β”‚                    β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚  β”‚   Falco DaemonSet  β”‚   β”‚  Prometheus Scrape β”‚          β”‚
β”‚  β”‚  β€’ Monitors sycallsβ”‚   β”‚  β€’ Loki metrics    β”‚          β”‚
β”‚  β”‚  β€’ Detects anomalies   β”‚  β€’ Falco metrics   β”‚          β”‚
β”‚  β”‚  β€’ System call rules   β”‚                    β”‚          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”‚           β”‚                          β”‚                    β”‚
β”‚           β”‚ Metrics (port 5555)      β”‚                    β”‚
β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚
β”‚                      β”‚                                    β”‚
β”‚           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”‚
β”‚           β”‚  Prometheus          β”‚                       β”‚
β”‚           β”‚  (monitoring ns)     β”‚                       β”‚
β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β”‚
β”‚                      β”‚                                    β”‚
β”‚           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                       β”‚
β”‚           β”‚  Grafana             β”‚                       β”‚
β”‚           β”‚  (monitoring ns)     β”‚                       β”‚
β”‚           β”‚  β€’ Logs (Loki)       β”‚                       β”‚
β”‚           β”‚  β€’ Metrics (Prom)    β”‚                       β”‚
β”‚           β”‚  β€’ Alerts            β”‚                       β”‚
β”‚           β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                       β”‚
β”‚                                                          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Quick Start

Prerequisite

  • kind-devops-lab cluster running
  • ArgoCD installed (or Flux if you prefer)
  • kubectl, kustomize, argocd (or flux) in PATH

Deploy (Choose One)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Deployment Flow                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                              β”‚
β”‚  Option A: ArgoCD (Recommended)              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ $ ./deploy.sh --mode argocd            β”‚  β”‚
β”‚  β”‚                                        β”‚  β”‚
β”‚  β”‚ 1. Creates Loki Application            β”‚  β”‚
β”‚  β”‚ 2. Creates Falco Application           β”‚  β”‚
β”‚  β”‚ 3. ArgoCD watches Git repo             β”‚  β”‚
β”‚  β”‚ 4. Auto-syncs on push                  β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                              β”‚
β”‚  Option B: Flux (Learning)                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚ $ export GITHUB_USER=simonjday         β”‚  β”‚
β”‚  β”‚ $ export GITHUB_TOKEN=ghp_xxx          β”‚  β”‚
β”‚  β”‚ $ ./deploy.sh --mode flux              β”‚  β”‚
β”‚  β”‚                                        β”‚  β”‚
β”‚  β”‚ 1. Bootstraps Flux in flux-system ns   β”‚  β”‚
β”‚  β”‚ 2. Creates GitRepository CR            β”‚  β”‚
β”‚  β”‚ 3. Creates Kustomization CRs           β”‚  β”‚
β”‚  β”‚ 4. Continuous reconciliation           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Verify:

# Check status
argocd app list | grep -E "loki|falco"
kubectl get pods -n observability
kubectl get pods -n falco

# Port-forward and query
kubectl port-forward -n observability svc/loki 3100:3100 &
curl http://localhost:3100/loki/api/v1/labels

πŸ“ Structure

devops-lab-observability/
β”‚
β”œβ”€β”€ observability/loki/               # Log aggregation
β”‚   β”œβ”€β”€ loki-stack.yaml               #   βœ“ Loki StatefulSet
β”‚   └── kustomization.yaml            #   βœ“ Promtail DaemonSet
β”‚
β”œβ”€β”€ security/falco/                   # Runtime security
β”‚   β”œβ”€β”€ falco.yaml                    #   βœ“ Falco DaemonSet
β”‚   └── kustomization.yaml            #   βœ“ Custom rules
β”‚
β”œβ”€β”€ overlays/                         # Environment configs
β”‚   β”œβ”€β”€ dev/                          #   β€’ 2Gi, 256Mi, 3 days
β”‚   β”‚   └── kustomization.yaml
β”‚   β”œβ”€β”€ staging/                      #   β€’ 10Gi, 512Mi, 7 days
β”‚   β”‚   └── kustomization.yaml
β”‚   └── prod/                         #   β€’ 50Gi, 2Gi, 30 days (HA)
β”‚       └── kustomization.yaml
β”‚
β”œβ”€β”€ flux-system/                      # Flux CD config (optional)
β”‚   └── flux-config.yaml              #   GitRepository + Kustomizations
β”‚
β”œβ”€β”€ kustomization.yaml                # Root orchestrator
β”œβ”€β”€ deploy.sh                         # Deployment script
β”œβ”€β”€ README.md                         # This file
└── docs/                             # Documentation
    β”œβ”€β”€ GITOPS_INTEGRATION_GUIDE.md
    β”œβ”€β”€ QUICK_REFERENCE.md
    β”œβ”€β”€ SETUP_INSTRUCTIONS.md
    └── ...

πŸ”„ Data Flow

Pod Logs              System Calls
    β”‚                      β”‚
    β–Ό                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Promtail   β”‚      β”‚    Falco     β”‚
β”‚  DaemonSet  β”‚      β”‚  DaemonSet   β”‚
β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜
       β”‚                     β”‚
       β”‚ HTTP Push           β”‚ Metrics (5555)
       β”‚                     β”‚
       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚      Loki      β”‚
          β”‚  StatefulSet   β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                  β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚                    β”‚
   Metrics            LogQL Queries
        β”‚                    β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚  Prometheus      β”‚
          β”‚  Grafana         β”‚
          β”‚  AlertManager    β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“Š Environment Comparison

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Aspect    β”‚   Dev    β”‚   Staging    β”‚   Prod   β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Storage     β”‚   2Gi    β”‚    10Gi      β”‚  50Gi    β”‚
β”‚ Memory      β”‚  256Mi   β”‚    512Mi     β”‚   2Gi    β”‚
β”‚ CPU         β”‚  100m    β”‚    200m      β”‚  500m    β”‚
β”‚ Retention   β”‚ 3 days   β”‚   7 days     β”‚ 30 days  β”‚
β”‚ Log Level   β”‚  debug   β”‚    info      β”‚  warn    β”‚
β”‚ Replicas    β”‚    1     β”‚      1       β”‚    3     β”‚
β”‚ HA Mode     β”‚   No     β”‚     No       β”‚   Yes    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ” Loki Usage

Port-Forward & Query

# Start port-forward
kubectl port-forward -n observability svc/loki 3100:3100 &

# Query labels
curl http://localhost:3100/loki/api/v1/labels

# Query logs (all from default namespace)
curl -G -s http://localhost:3100/loki/api/v1/query_range \
  --data-urlencode 'query={namespace="default"}' \
  --data-urlencode 'start=0' \
  --data-urlencode 'end=9999999999' | jq .

Add to Grafana

Grafana β†’ Configuration β†’ Data Sources β†’ Add Loki
URL: http://loki.observability.svc.cluster.local:3100
                            ↓
                    Explore β†’ select Loki
                            ↓
                      Query Logs (LogQL)

πŸ›‘οΈ Falco Usage

System Calls ──(eBPF)──→ Falco ──(Rules)──→ βœ“ Allowed / βœ— Alert
                       (DaemonSet)
                            β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚                β”‚
              Logs (stdout)    Metrics (5555)
                    β”‚                β”‚
              kubectl logs    Prometheus
                             ↓
                        Alertmanager

πŸ§ͺ Testing

Test Loki

# 1. Deploy test app
kubectl create deployment test-app --image=busybox \
  -- sh -c "while true; do echo 'test'; sleep 1; done"

# 2. Wait for logs
sleep 30

# 3. Query in Loki
curl -G -s http://localhost:3100/loki/api/v1/query_range \
  --data-urlencode 'query={pod="test-app-xxx"}' \
  --data-urlencode 'start=0' \
  --data-urlencode 'end=9999999999' | jq '.data.result | length'

# 4. Cleanup
kubectl delete deployment test-app

Test Falco

# 1. Trigger shell (test rule)
kubectl exec -it <pod> -n <ns> -- /bin/bash

# 2. Check logs
kubectl logs -n falco -l app=falco -f | grep -i "shell"

# 3. Check metrics
curl http://localhost:5555/metrics | grep falco_alerts_total

πŸ”„ Flux vs ArgoCD

                  Git Push
                     β”‚
         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚                       β”‚
    β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”           β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”
    β”‚  ArgoCD   β”‚           β”‚   Flux   β”‚
    β”‚           β”‚           β”‚          β”‚
    β”‚ β€’ Web UI  β”‚           β”‚ β€’ CLI    β”‚
    β”‚ β€’ Fast    β”‚           β”‚ β€’ GitOps β”‚
    β”‚ β€’ Pull    β”‚           β”‚ β€’ Push   β”‚
    β”‚ β€’ Easy    β”‚           β”‚ β€’ Complexβ”‚
    β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜           β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
         β”‚                       β”‚
         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚
          kubectl apply / sync
                     β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚                                   β”‚
β”Œβ”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”                  β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”
β”‚    Loki   β”‚                  β”‚  Falco   β”‚
β”‚ + Promtailβ”‚                  β”‚  (DaemonSet)
β”‚(StatefulSet)                 β”‚          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

🚨 Alert Flow

Falco DaemonSet          Prometheus         AlertManager
    β”‚                         β”‚                    β”‚
    β”œβ”€ System Call Alert      β”‚                    β”‚
    β”‚  (CRITICAL)             β”‚                    β”‚
    β”‚                         β”‚                    β”‚
    └─→ Metrics (5555)        β”‚                    β”‚
             β”‚                β”‚                    β”‚
             └─→ Scrape ──────→ Query              β”‚
                                β”‚                  β”‚
                                β”œβ”€ Rule Match      β”‚
                                β”‚  (CRITICAL > 0)  β”‚
                                β”‚                  β”‚
                                └─→ Fire Alert ───→ Slack / PagerDuty / Email
                                                    β”‚
                                                    βœ“ On-Call Notified

πŸ“š Documentation Map

START HERE
    β”‚
    β”œβ”€β†’ SETUP_INSTRUCTIONS.md
    β”‚   (Step-by-step for your repos)
    β”‚
    β”œβ”€β†’ REPO_STRUCTURE.md
    β”‚   (What files go where)
    β”‚
    β”œβ”€β†’ AUTOMATED_SETUP_GUIDE.md
    β”‚   (Using setup-repo.sh)
    β”‚
    β”œβ”€β†’ GITOPS_INTEGRATION_GUIDE.md
    β”‚   (Full technical reference)
    β”‚
    β”œβ”€β†’ KUSTOMIZATION_GUIDE.md
    β”‚   (Kustomize deep dive)
    β”‚
    └─→ QUICK_REFERENCE.md
        (Commands cheat sheet)

🎯 Next Steps

  1. Set it up: ./setup-repo.sh . or manual copy of files
  2. Deploy: ./deploy.sh --mode argocd
  3. Verify: kubectl get pods -n observability -n falco
  4. Customize: Edit overlays for your environment
  5. Integrate: Add Loki datasource to Grafana
  6. Alert: Route Falco alerts to Slack/PagerDuty

πŸ“– Learn More

See documentation in this repo for comprehensive guides:

  • GITOPS_INTEGRATION_GUIDE.md β€” Full technical reference
  • KUSTOMIZATION_GUIDE.md β€” Kustomize deep dive
  • QUICK_REFERENCE.md β€” Commands cheat sheet

🀝 Related Repos


Questions? Check the documentation files or see repo About section.

About

Observability and security stack (Loki + Falco) with Kustomize overlays and GitOps support (ArgoCD/Flux).

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages