controller: type: 'deployment' tolerations: - key: "infra.limbosolutions.com/dedicated" operator: "Exists" effect: "NoSchedule" nodeSelector: kubernetes.io/hostname: casa-minion-01 alloy: # https://grafana.com/docs/alloy/latest/collect/logs-in-kubernetes/ configMap: content: | // ============================================ // LOKI WRITE TARGET // ============================================ loki.write "loki_srv" { endpoint { url = env("LOKI_URL") } } // ============================================ // POD LOGS: DISCOVERY + RELABEL // ============================================ // Discover Kubernetes pods discovery.kubernetes "pod_logs" { role = "pod" } discovery.relabel "pod_logs" { targets = discovery.kubernetes.pod_logs.targets rule { source_labels = ["__meta_kubernetes_namespace"] target_label = "namespace" } rule { source_labels = ["__meta_kubernetes_pod_name"] regex = "^(.+?)-[0-9a-zA-Z]{4,16}(?:-[0-9a-zA-Z]{4,16})?$" replacement = "$1" target_label = "pod" } rule { source_labels = ["__meta_kubernetes_pod_container_name"] target_label = "container" } rule { source_labels = ["__meta_kubernetes_node_name"] target_label = "node_name" } rule { source_labels = [ "__meta_kubernetes_pod_controller_name", ] regex = "([0-9a-z-.]+?)(-[0-9a-f]{8,10})?" target_label = "controller_name" } rule { source_labels = [ "__meta_kubernetes_pod_label_app_kubernetes_io_name", "__meta_kubernetes_pod_label_app", "controller_name", "__meta_kubernetes_pod_name", ] regex = "^;*([^;]+)(;.*)?$" target_label = "app" } rule { source_labels = [ "__meta_kubernetes_pod_label_app_kubernetes_io_component", "__meta_kubernetes_pod_label_component", ] regex = "^;*([^;]+)(;.*)?$" target_label = "component" } rule { source_labels = ["namespace", "app"] separator = "/" target_label = "job" } rule { source_labels = ["job", "container"] separator = ":" target_label = "instance" } rule { source_labels = ["__meta_kubernetes_pod_node_name"] separator = ":" target_label = "host" } } // ============================================ // POD LOGS: SOURCE → PROCESS → WRITE // ============================================ // Tail logs from Kubernetes pods loki.source.kubernetes "pod_logs" { // targets = discovery.kubernetes.pod_logs.targets targets = discovery.relabel.pod_logs.output forward_to = [loki.process.pod_logs.receiver] } // Add static labels and forward logs to Loki loki.process "pod_logs" { stage.static_labels { values = { cluster = env("CLUSTER_NAME"), zone = env("ZONE"), } } forward_to = [loki.write.loki_srv.receiver] } // ============================================ // KUBERNETES EVENTS // ============================================ // Tail Kubernetes events and convert them to log entries loki.source.kubernetes_events "cluster_events" { job_name = "integrations/kubernetes/eventhandler" log_format = "logfmt" forward_to = [ loki.process.cluster_events.receiver, ] } // Add static labels and forward events to Loki loki.process "cluster_events" { forward_to = [loki.write.loki_srv.receiver] stage.static_labels { values = { cluster = env("CLUSTER_NAME"), host = "casa-kube", job = "cluster_events", zone = env("ZONE"), } } // stage.labels { // values = { // kubernetes_cluster_events = "job", // } // } } extraEnv: - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: CLUSTER_NAME value: casa - name: ZONE value: casa-vlan - name: LOKI_URL valueFrom: secretKeyRef: name: alloy-global key: loki_url