Skip to content

Commit 250ecac

Browse files
committed
Adds fleet-event-monitor
`fleet-event-monitor` is a separate binary, Docker image, and Helm chart containing **read-only monitoring controllers**. These controllers: - Mirror the exact watch configuration of Fleet's production controllers (same `SetupWithManager` logic) - Log detailed diffs (spec, status, annotations, labels) when controllers are triggered - Perform **no reconciliation or write operations** - Are enabled/disabled per controller via environment variables or Helm values - Use read-only RBAC permissions (only `get`, `list`, `watch` — except leases for leader election) **Problem solved**: Understanding why Fleet controllers are triggered repeatedly or what specific changes cause reconciliation loops, without impacting production workloads. --- ``` fleet/ ├── cmd/fleeteventmonitor/main.go # Entry point ├── internal/cmd/monitor/ │ ├── root.go # CLI / cobra setup, env var parsing │ ├── operator.go # controller-runtime manager, reconciler wiring │ └── reconciler/ │ ├── monitor.go # Shared logging utilities (logSpecChange, logStatusChange, etc.) │ ├── stats.go # EventType constants, StatsTracker, Summary (JSON) │ ├── filter.go # EventTypeFilters struct, ResourceFilter, ShouldLog/ShouldLogTrigger logic │ ├── cache.go # ObjectCache (thread-safe, namespace/name keyed) │ ├── predicate.go # TypedResourceVersionUnchangedPredicate │ ├── bundle_monitor.go # Bundle controller (watches BD + Cluster) │ ├── bundle_query.go # BundleQuery interface + impl (cluster→bundle mapping) │ ├── cluster_monitor.go # Cluster controller (watches BD) │ ├── bundledeployment_monitor.go # BundleDeployment controller │ ├── gitrepo_monitor.go # GitRepo controller (watches Job) │ └── helmop_monitor.go # HelmOp controller ├── package/Dockerfile.event-monitor # Multi-arch Docker image (BCI 15.7, non-root) ├── charts/fleet-event-monitor/ │ ├── Chart.yaml │ ├── values.yaml │ └── templates/ │ ├── _helpers.tpl │ ├── deployment.yaml │ └── rbac.yaml └── .goreleaser.yaml # Build/release config (fleet-event-monitor added) ``` **Original production controllers (for watch pattern reference)**: - `internal/cmd/controller/reconciler/bundle_controller.go` - `internal/cmd/controller/reconciler/cluster_controller.go` - `internal/cmd/controller/reconciler/bundledeployment_controller.go` - `internal/cmd/controller/gitops/reconciler/gitjob_controller.go` - `internal/cmd/controller/helmops/reconciler/helmapp_controller.go` --- Each monitor controller: 1. Copies `SetupWithManager()` from the original controller (identical watches, predicates, event filters) 2. Replaces `Reconcile()` with logging-only logic 3. Uses an in-memory `ObjectCache` to detect changes between events 1. Reconcile triggered by watch event 2. `Get()` current object from Kubernetes API 3. Look up previous version from `ObjectCache` 4. If first time → log "create", cache object, return 5. If seen before → compare and log: spec diff, status diff, annotation/label/resourceVersion changes 6. Update cache with new version | Controller | Primary Watch | Secondary Watches | |---|---|---| | Bundle | Bundle | BundleDeployment (status changes), Cluster (all changes) | | Cluster | Cluster | BundleDeployment (spec/status changes) | | BundleDeployment | BundleDeployment | — | | GitRepo | GitRepo | Job (status changes) | | HelmOp | HelmOp | — | --- Each controller independently operates in one of two modes, controlled by a per-controller `detailed` flag: | Mode | `detailed` value | Behavior | |---|---|---| | **Summary** (default) | `false` | Counts events; prints periodic JSON summaries. No per-event log lines. | | **Detailed** | `true` | Emits a structured log line for every event with diffs included. | The summary printer **always runs** regardless of mode, so you always get aggregate statistics. Setting `detailed=true` adds verbose per-event logs on top. **Default**: all controllers default to `false` (summary only). | Environment Variable | Helm Value | Default | |---|---|---| | `FLEET_EVENT_MONITOR_BUNDLE_DETAILED` | `logging.bundle.detailed` | `false` | | `FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_DETAILED` | `logging.bundleDeployment.detailed` | `false` | | `FLEET_EVENT_MONITOR_CLUSTER_DETAILED` | `logging.cluster.detailed` | `false` | | `FLEET_EVENT_MONITOR_GITREPO_DETAILED` | `logging.gitRepo.detailed` | `false` | | `FLEET_EVENT_MONITOR_HELMOP_DETAILED` | `logging.helmOp.detailed` | `false` | > **Note**: The wrangler command framework does not parse boolean env vars automatically. They are manually parsed in `root.go` using `strconv.ParseBool()`. Valid values: `true`/`false`, `1`/`0`, `True`/`False`, `TRUE`/`FALSE`. | Environment Variable | Helm Value | Default | Description | |---|---|---|---| | `FLEET_EVENT_MONITOR_SUMMARY_INTERVAL` | `logging.summary.interval` | `"30s"` | How often to print the JSON summary | | `FLEET_EVENT_MONITOR_SUMMARY_RESET` | `logging.summary.resetOnPrint` | `false` | Reset counters after each print (false = cumulative) | | Event Type | Env var suffix / Helm key | Description | |---|---|---| | `generation-change` | `GENERATION_CHANGE` / `generationChange` | Spec modifications (generation bump) | | `status-change` | `STATUS_CHANGE` / `statusChange` | Status field updates | | `annotation-change` | `ANNOTATION_CHANGE` / `annotationChange` | Annotation modifications | | `label-change` | `LABEL_CHANGE` / `labelChange` | Label modifications | | `resourceversion-change` | `RESVER_CHANGE` / `resourceVersionChange` | Cache sync / metadata updates (finalizers, ownerRefs, managedFields) | | `triggered-by` | `TRIGGERED_BY` / `triggeredBy` | Trigger source breakdown by resource type | | `deletion` | `DELETION` / `deletion` | Resource being deleted | | `not-found` | `NOT_FOUND` / `notFound` | Resource not found (likely deleted) | | `create` | `CREATE` / `create` | First observation of resource | ```json { "timestamp": "2026-02-09T10:00:30Z", "interval_seconds": 30, "summary": { "Bundle": { "fleet-local/test-bundle": { "generation-change": 5, "status-change": 20, "triggered-by": { "BundleDeployment": 12, "Cluster": 3 }, "total_events": 41 } } }, "totals": { "total_resources_monitored": 3, "total_events": 63 } } ``` ```bash kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | \ grep "Fleet Monitor Summary" | tail -1 | \ jq -r '.summary.Bundle | to_entries[] | select(.value.total_events > 50) | "\(.key): \(.value.total_events) events"' kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | \ grep "Fleet Monitor Summary" | tail -1 | \ jq '.summary.Bundle["fleet-local/test-bundle"]["triggered-by"]' kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | \ grep "Fleet Monitor Summary" | tail -1 | \ jq -r '.summary | to_entries[] | .key as $t | .value | to_entries[] | select(.value["status-change"] > 0) | "\($t)/\(.key): \(.value["status-change"]) status changes"' kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | grep "parsed per-controller" kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | grep "registered monitor controller" ``` --- When a controller is in detailed mode (`detailed=true`), event type filters let you restrict which event types produce a log line. **Statistics are always tracked** regardless of filters — filters only affect the verbosity of the per-event log output. **Default behavior**: if all event filter flags are `false`, **all event types are logged** (backwards compatible). To restrict output, set the specific types you want to `true`. Any `true` flag activates selective filtering. `EventTypeFilters.IsEmpty()` returns true when all fields are false → `ShouldLog()` returns true for every event type. Once any field is set to `true`, only enabled types pass through. The env var pattern is: - Bundle: `FLEET_EVENT_MONITOR_BUNDLE_EVENT_<TYPE>` - BundleDeployment: `FLEET_EVENT_MONITOR_BD_EVENT_<TYPE>` - Cluster: `FLEET_EVENT_MONITOR_CLUSTER_EVENT_<TYPE>` - GitRepo: `FLEET_EVENT_MONITOR_GITREPO_EVENT_<TYPE>` - HelmOp: `FLEET_EVENT_MONITOR_HELMOP_EVENT_<TYPE>` Where `<TYPE>` is one of: `GENERATION_CHANGE`, `STATUS_CHANGE`, `ANNOTATION_CHANGE`, `LABEL_CHANGE`, `RESVER_CHANGE`, `DELETION`, `NOT_FOUND`, `CREATE`, `TRIGGERED_BY`. ```yaml logging: bundle: detailed: true # Must be true for event filters to have any effect eventFilters: generationChange: false # Set true to see spec diffs statusChange: false # Set true to see status diffs annotationChange: false labelChange: false resourceVersionChange: false # Set true to see cache-sync/metadata events deletion: false notFound: false create: false triggeredBy: false # Set true to see which resource triggered reconciliation ``` The same structure applies for `bundleDeployment`, `cluster`, `gitRepo`, and `helmOp`. **Example 1: Only watch generation changes (spec diffs) for Bundle** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true \ --set logging.bundle.eventFilters.generationChange=true ``` **Example 2: Focus on reconciliation trigger sources only** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true \ --set logging.bundle.eventFilters.triggeredBy=true ``` **Example 3: See everything for Bundle (all filters false = log all)** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true ``` **Example 4: Via environment variables** ```bash FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true \ FLEET_EVENT_MONITOR_BUNDLE_EVENT_GENERATION_CHANGE=true \ FLEET_EVENT_MONITOR_BUNDLE_EVENT_TRIGGERED_BY=true \ ./fleeteventmonitor --kubeconfig ~/.kube/config ``` **Example 5: Debug only cache-sync/metadata noise** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.cluster.detailed=true \ --set logging.cluster.eventFilters.resourceVersionChange=true ``` --- Resource filters allow you to restrict monitoring to a specific subset of resources by namespace and/or name. This is useful in large deployments (100+ bundles) where you only care about specific resources and want to reduce log volume. **Filters apply to both detailed logs AND statistics** — filtered-out resources do not appear in the JSON summary either. At the top of each controller's `Reconcile()`, the resource namespace and name are tested against the compiled regex patterns. Resources that do not match are skipped entirely — no logs, no statistics. - Both patterns are **regular expressions** (Go `regexp` syntax) - An **empty pattern matches all** values for that field (backwards compatible) - Patterns are compiled at startup; an **invalid regex causes the binary to exit** with a clear error message - Namespace and name patterns are ANDed — a resource must match both to be monitored - Filters are orthogonal to event type filtering — both can be combined | Controller | Namespace Pattern | Name Pattern | |---|---|---| | Bundle | `FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAMESPACE` | `FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAME` | | BundleDeployment | `FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_RESOURCE_FILTER_NAMESPACE` | `FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_RESOURCE_FILTER_NAME` | | Cluster | `FLEET_EVENT_MONITOR_CLUSTER_RESOURCE_FILTER_NAMESPACE` | `FLEET_EVENT_MONITOR_CLUSTER_RESOURCE_FILTER_NAME` | | GitRepo | `FLEET_EVENT_MONITOR_GITREPO_RESOURCE_FILTER_NAMESPACE` | `FLEET_EVENT_MONITOR_GITREPO_RESOURCE_FILTER_NAME` | | HelmOp | `FLEET_EVENT_MONITOR_HELMOP_RESOURCE_FILTER_NAMESPACE` | `FLEET_EVENT_MONITOR_HELMOP_RESOURCE_FILTER_NAME` | ```yaml logging: bundle: resourceFilter: namespace: "" # Regular expression for namespace matching (e.g., "^fleet-local$") name: "" # Regular expression for name matching (e.g., "^test-.*") ``` The same structure applies for `bundleDeployment`, `cluster`, `gitRepo`, and `helmOp`. **Example 1: Monitor only a specific bundle** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true \ --set "logging.bundle.resourceFilter.namespace=^fleet-local$" \ --set "logging.bundle.resourceFilter.name=^my-app$" ``` **Example 2: Monitor all bundles in a namespace** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true \ --set "logging.bundle.resourceFilter.namespace=^fleet-local$" ``` **Example 3: Monitor bundles matching a name prefix** ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --set logging.bundle.detailed=true \ --set "logging.bundle.resourceFilter.name=^payment-.*" ``` **Example 4: Via environment variables** ```bash FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true \ FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAMESPACE="^fleet-local$" \ FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAME="^my-app$" \ ./fleeteventmonitor --kubeconfig ~/.kube/config ``` **Example 5: Combine resource filter with event type filter** ```bash FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true \ FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAMESPACE="^fleet-local$" \ FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAME="^my-app$" \ FLEET_EVENT_MONITOR_BUNDLE_EVENT_STATUS_CHANGE=true \ ./fleeteventmonitor --kubeconfig ~/.kube/config ``` --- The Bundle monitor's Cluster watch handler queries which bundles are affected by a cluster change, logging the correct bundle name and namespace in trigger events. `internal/cmd/monitor/reconciler/bundle_query.go` — adapted from `internal/cmd/controller/target/`: ```go type BundleQuery interface { BundlesForCluster(context.Context, *fleet.Cluster) ([]*fleet.Bundle, []*fleet.Bundle, error) } ``` Supports: basic targeting, label-based cluster matching, ClusterGroups, BundleNamespaceMapping (cross-namespace), Fleet agent bundles, deduplicated results. **Without the query**: `Bundle reconciliation triggered Bundle= Namespace= Name= TriggeredBy=Cluster:my-cluster:fleet-default` **With the query**: `Bundle reconciliation triggered Bundle=fleet-default/my-app Namespace=fleet-default Name=my-app TriggeredBy=Cluster:my-cluster:fleet-default` --- Full `values.yaml` structure as shipped: ```yaml image: repository: rancher/fleet-event-monitor tag: dev imagePullPolicy: IfNotPresent namespace: cattle-fleet-system controllers: bundle: false bundledeployment: false cluster: false gitrepo: false helmop: false workers: bundle: 5 bundledeployment: 5 cluster: 5 gitrepo: 5 helmop: 5 logFormat: json logLevel: info debug: false debugLevel: 0 shardID: "" nodeSelector: {} tolerations: [] priorityClassName: "" leaderElection: enabled: true leaseDuration: 30s retryPeriod: 10s renewDeadline: 25s resources: limits: cpu: 500m memory: 256Mi requests: cpu: 100m memory: 128Mi securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 extraEnv: [] logging: bundle: detailed: false resourceFilter: namespace: "" name: "" eventFilters: generationChange: false statusChange: false annotationChange: false labelChange: false resourceVersionChange: false deletion: false notFound: false create: false triggeredBy: false bundleDeployment: detailed: false resourceFilter: namespace: "" name: "" eventFilters: generationChange: false statusChange: false annotationChange: false labelChange: false resourceVersionChange: true deletion: false notFound: false create: false triggeredBy: false cluster: detailed: false resourceFilter: namespace: "" name: "" eventFilters: generationChange: false statusChange: false annotationChange: false labelChange: false resourceVersionChange: false deletion: false notFound: false create: false triggeredBy: false gitRepo: detailed: false resourceFilter: namespace: "" name: "" eventFilters: # all false helmOp: detailed: false resourceFilter: namespace: "" name: "" eventFilters: # all false summary: interval: "30s" resetOnPrint: false ``` --- ```bash go build -o bin/fleeteventmonitor ./cmd/fleeteventmonitor ``` Set environment variables before running. At minimum, enable at least one controller: ```bash export ENABLE_BUNDLE_EVENT_MONITOR=true export NAMESPACE=cattle-fleet-system ./bin/fleeteventmonitor --kubeconfig ~/.kube/config ``` For detailed logging with filters: ```bash export ENABLE_BUNDLE_EVENT_MONITOR=true export NAMESPACE=cattle-fleet-system export FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true export FLEET_EVENT_MONITOR_BUNDLE_EVENT_STATUS_CHANGE=true export FLEET_EVENT_MONITOR_BUNDLE_EVENT_TRIGGERED_BY=true ./bin/fleeteventmonitor --kubeconfig ~/.kube/config ``` To narrow down to a specific resource: ```bash export ENABLE_BUNDLE_EVENT_MONITOR=true export NAMESPACE=cattle-fleet-system export FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true export FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAMESPACE="^fleet-local$" export FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAME="^my-app$" ./bin/fleeteventmonitor --kubeconfig ~/.kube/config ``` ```bash helm install fleet-event-monitor ./charts/fleet-event-monitor \ --namespace cattle-fleet-system \ --set controllers.bundle=true \ --set controllers.bundledeployment=true \ --set controllers.cluster=true \ --set controllers.gitrepo=true \ --set controllers.helmop=true helm install fleet-event-monitor ./charts/fleet-event-monitor \ --namespace cattle-fleet-system \ --set controllers.bundle=true \ --set logging.bundle.detailed=true helm install fleet-event-monitor ./charts/fleet-event-monitor \ --namespace cattle-fleet-system \ --set controllers.bundle=true \ --set logging.bundle.detailed=true \ --set logging.bundle.eventFilters.generationChange=true \ --set logging.bundle.eventFilters.triggeredBy=true ``` ```bash helm upgrade fleet-event-monitor ./charts/fleet-event-monitor \ --reuse-values \ --set logging.cluster.detailed=true \ --set logging.cluster.eventFilters.statusChange=true ``` ```bash helm install fleet-event-monitor-shard0 ./charts/fleet-event-monitor --set shardID=shard0 helm install fleet-event-monitor-shard1 ./charts/fleet-event-monitor --set shardID=shard1 ``` --- ClusterRole: `get`, `list`, `watch` on Fleet resources, core resources, RBAC resources, Jobs, Deployments. Role (namespaced): `get`, `list`, `watch`, `create`, `update`, `patch`, `delete` on `coordination.k8s.io/leases` (leader election only). No write access to any Fleet or Kubernetes resources. --- | Limitation | Workaround | |---|---| | Controller-runtime doesn't expose which watch triggered a reconciliation | Log at fan-out mapping functions (Cluster→Bundle handler, BD→Bundle handler) | | `TypedResourceVersionUnchangedPredicate` causes cache-sync noise | Filter using `eventFilters.resourceVersionChange=false` to suppress in detailed mode | --- Several scripts in `dev/` help parse and visualize monitor output. They all read from stdin, a pipe, or a file argument and require `jq`. Parses all `Fleet Monitor Summary` lines from a log stream and renders the last (or cumulative) summary as a human-readable table. Also computes the time range covered if multiple summaries are present. ```bash kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | ./dev/format-monitor-summary.sh ./dev/format-monitor-summary.sh logs.json ``` Output example: ``` ================================================================================ FLEET MONITOR SUMMARY ================================================================================ Timestamp: 2026-02-09T10:00:30Z Interval: 30s Total Resources: 3 Total Events: 63 ================================================================================ ▼ Bundle ------------------------------------------------------------------------------- RESOURCE CREATE DELETE N-FOUND STATUS GEN-CHG ANNOT LABEL RESVER EVENTS ---------------------- ------ -------- ------- -------- ------- ----- ----- ------ ------ fleet-local/my-app 1 0 0 20 5 0 0 0 41 └─ triggered-by: BundleDeployment = 12 └─ triggered-by: Cluster = 3 ================================================================================ Time range: ... ================================================================================ ``` Filters `status-change` events from detailed log output and renders each diff with colour-coded `+`/`-` lines. Requires the controller to be running in detailed mode with `statusChange` enabled: ```bash export FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true export FLEET_EVENT_MONITOR_BUNDLE_EVENT_STATUS_CHANGE=true ``` Usage: ```bash kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | ./dev/parse-status-log.sh ``` Filters `resourceversion-change` events and renders each event with version numbers, change reason, metadata change list, and colour-coded diff output. Useful for identifying which SSA managers or finalizer changes are causing metadata-only reconciliation loops. Requires the controller to be running in detailed mode with `resourceVersionChange` enabled: ```bash export FLEET_EVENT_MONITOR_BUNDLE_DETAILED=true export FLEET_EVENT_MONITOR_BUNDLE_EVENT_RESVER_CHANGE=true ``` Usage: ```bash kubectl logs -n cattle-fleet-system deploy/fleet-event-monitor | ./dev/parse-resourceversion-log.sh ``` The output includes a `Changed:` line listing which metadata fields changed (`finalizers`, `ownerReferences`, `managedFields`) and, for `managedFields`, a manager-level summary (added/removed/changed SSA managers) followed by a field-level diff of their `FieldsV1` entries. Signed-off-by: Xavi Garcia <xavi.garcia@suse.com>
1 parent 7afa158 commit 250ecac

30 files changed

Lines changed: 5863 additions & 0 deletions

EVENT-MONITOR.md

Lines changed: 682 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: v2
2+
name: fleet-event-monitor
3+
version: 0.0.0
4+
appVersion: 0.0.0
5+
description: Fleet Event Monitor - Read-only monitoring for Fleet controllers
6+
icon: https://charts.rancher.io/assets/logos/fleet.svg
7+
annotations:
8+
catalog.cattle.io/namespace: cattle-fleet-system
9+
catalog.cattle.io/kube-version: '>= 1.28.0-0 < 1.35.0-0'
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{{- define "fleet-event-monitor.name" -}}
2+
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
3+
{{- end }}
4+
5+
{{- define "fleet-event-monitor.fullname" -}}
6+
{{- if .Values.fullnameOverride }}
7+
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
8+
{{- else }}
9+
{{- $name := default .Chart.Name .Values.nameOverride }}
10+
{{- if contains $name .Release.Name }}
11+
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
12+
{{- else }}
13+
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
14+
{{- end }}
15+
{{- end }}
16+
{{- end }}
17+
18+
{{- define "fleet-event-monitor.chart" -}}
19+
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
20+
{{- end }}
21+
22+
{{- define "fleet-event-monitor.labels" -}}
23+
helm.sh/chart: {{ include "fleet-event-monitor.chart" . }}
24+
{{ include "fleet-event-monitor.selectorLabels" . }}
25+
{{- if .Chart.AppVersion }}
26+
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
27+
{{- end }}
28+
app.kubernetes.io/managed-by: {{ .Release.Service }}
29+
{{- end }}
30+
31+
{{- define "fleet-event-monitor.selectorLabels" -}}
32+
app.kubernetes.io/name: {{ include "fleet-event-monitor.name" . }}
33+
app.kubernetes.io/instance: {{ .Release.Name }}
34+
{{- end }}
Lines changed: 243 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
name: fleet-event-monitor{{- if .Values.shardID }}-shard-{{ .Values.shardID }}{{- end }}
5+
namespace: {{ .Release.Namespace }}
6+
labels:
7+
{{- include "fleet-event-monitor.labels" . | nindent 4 }}
8+
{{- if .Values.shardID }}
9+
fleet.cattle.io/shard-id: {{ .Values.shardID }}
10+
{{- end }}
11+
spec:
12+
replicas: 1
13+
selector:
14+
matchLabels:
15+
{{- include "fleet-event-monitor.selectorLabels" . | nindent 6 }}
16+
{{- if .Values.shardID }}
17+
fleet.cattle.io/shard-id: {{ .Values.shardID }}
18+
{{- end }}
19+
template:
20+
metadata:
21+
labels:
22+
{{- include "fleet-event-monitor.selectorLabels" . | nindent 8 }}
23+
{{- if .Values.shardID }}
24+
fleet.cattle.io/shard-id: {{ .Values.shardID }}
25+
{{- end }}
26+
spec:
27+
serviceAccountName: fleet-event-monitor
28+
{{- with .Values.securityContext }}
29+
securityContext:
30+
{{- toYaml . | nindent 8 }}
31+
{{- end }}
32+
containers:
33+
- name: fleet-event-monitor
34+
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
35+
imagePullPolicy: {{ .Values.image.imagePullPolicy }}
36+
command:
37+
- fleeteventmonitor
38+
{{- if .Values.shardID }}
39+
- --shard-id={{ .Values.shardID }}
40+
{{- end }}
41+
{{- if .Values.debug }}
42+
- --debug
43+
- --debug-level={{ .Values.debugLevel }}
44+
{{- end }}
45+
env:
46+
- name: NAMESPACE
47+
value: {{ .Values.namespace | quote }}
48+
- name: ENABLE_BUNDLE_EVENT_MONITOR
49+
value: {{ .Values.controllers.bundle | quote }}
50+
- name: ENABLE_BUNDLEDEPLOYMENT_EVENT_MONITOR
51+
value: {{ .Values.controllers.bundledeployment | quote }}
52+
- name: ENABLE_CLUSTER_EVENT_MONITOR
53+
value: {{ .Values.controllers.cluster | quote }}
54+
- name: ENABLE_GITREPO_EVENT_MONITOR
55+
value: {{ .Values.controllers.gitrepo | quote }}
56+
- name: ENABLE_HELMOP_EVENT_MONITOR
57+
value: {{ .Values.controllers.helmop | quote }}
58+
- name: BUNDLE_RECONCILER_WORKERS
59+
value: {{ .Values.workers.bundle | quote }}
60+
- name: BUNDLEDEPLOYMENT_RECONCILER_WORKERS
61+
value: {{ .Values.workers.bundledeployment | quote }}
62+
- name: CLUSTER_RECONCILER_WORKERS
63+
value: {{ .Values.workers.cluster | quote }}
64+
- name: GITREPO_RECONCILER_WORKERS
65+
value: {{ .Values.workers.gitrepo | quote }}
66+
- name: HELMOP_RECONCILER_WORKERS
67+
value: {{ .Values.workers.helmop | quote }}
68+
{{- if .Values.debug }}
69+
- name: CATTLE_DEV_MODE
70+
value: "true"
71+
{{- end }}
72+
{{- if .Values.leaderElection.enabled }}
73+
- name: CATTLE_ELECTION_LEASE_DURATION
74+
value: {{ .Values.leaderElection.leaseDuration | quote }}
75+
- name: CATTLE_ELECTION_RETRY_PERIOD
76+
value: {{ .Values.leaderElection.retryPeriod | quote }}
77+
- name: CATTLE_ELECTION_RENEW_DEADLINE
78+
value: {{ .Values.leaderElection.renewDeadline | quote }}
79+
{{- end }}
80+
# Per-controller detailed logging flags
81+
- name: FLEET_EVENT_MONITOR_BUNDLE_DETAILED
82+
value: {{ .Values.logging.bundle.detailed | quote }}
83+
- name: FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_DETAILED
84+
value: {{ .Values.logging.bundleDeployment.detailed | quote }}
85+
- name: FLEET_EVENT_MONITOR_CLUSTER_DETAILED
86+
value: {{ .Values.logging.cluster.detailed | quote }}
87+
- name: FLEET_EVENT_MONITOR_GITREPO_DETAILED
88+
value: {{ .Values.logging.gitRepo.detailed | quote }}
89+
- name: FLEET_EVENT_MONITOR_HELMOP_DETAILED
90+
value: {{ .Values.logging.helmOp.detailed | quote }}
91+
# Bundle resource filters
92+
- name: FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAMESPACE
93+
value: {{ .Values.logging.bundle.resourceFilter.namespace | quote }}
94+
- name: FLEET_EVENT_MONITOR_BUNDLE_RESOURCE_FILTER_NAME
95+
value: {{ .Values.logging.bundle.resourceFilter.name | quote }}
96+
# Bundle event filters
97+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_GENERATION_CHANGE
98+
value: {{ .Values.logging.bundle.eventFilters.generationChange | quote }}
99+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_STATUS_CHANGE
100+
value: {{ .Values.logging.bundle.eventFilters.statusChange | quote }}
101+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_ANNOTATION_CHANGE
102+
value: {{ .Values.logging.bundle.eventFilters.annotationChange | quote }}
103+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_LABEL_CHANGE
104+
value: {{ .Values.logging.bundle.eventFilters.labelChange | quote }}
105+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_RESVER_CHANGE
106+
value: {{ .Values.logging.bundle.eventFilters.resourceVersionChange | quote }}
107+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_DELETION
108+
value: {{ .Values.logging.bundle.eventFilters.deletion | quote }}
109+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_NOT_FOUND
110+
value: {{ .Values.logging.bundle.eventFilters.notFound | quote }}
111+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_CREATE
112+
value: {{ .Values.logging.bundle.eventFilters.create | quote }}
113+
- name: FLEET_EVENT_MONITOR_BUNDLE_EVENT_TRIGGERED_BY
114+
value: {{ .Values.logging.bundle.eventFilters.triggeredBy | quote }}
115+
# BundleDeployment resource filters
116+
- name: FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_RESOURCE_FILTER_NAMESPACE
117+
value: {{ .Values.logging.bundleDeployment.resourceFilter.namespace | quote }}
118+
- name: FLEET_EVENT_MONITOR_BUNDLEDEPLOYMENT_RESOURCE_FILTER_NAME
119+
value: {{ .Values.logging.bundleDeployment.resourceFilter.name | quote }}
120+
# BundleDeployment event filters
121+
- name: FLEET_EVENT_MONITOR_BD_EVENT_GENERATION_CHANGE
122+
value: {{ .Values.logging.bundleDeployment.eventFilters.generationChange | quote }}
123+
- name: FLEET_EVENT_MONITOR_BD_EVENT_STATUS_CHANGE
124+
value: {{ .Values.logging.bundleDeployment.eventFilters.statusChange | quote }}
125+
- name: FLEET_EVENT_MONITOR_BD_EVENT_ANNOTATION_CHANGE
126+
value: {{ .Values.logging.bundleDeployment.eventFilters.annotationChange | quote }}
127+
- name: FLEET_EVENT_MONITOR_BD_EVENT_LABEL_CHANGE
128+
value: {{ .Values.logging.bundleDeployment.eventFilters.labelChange | quote }}
129+
- name: FLEET_EVENT_MONITOR_BD_EVENT_RESVER_CHANGE
130+
value: {{ .Values.logging.bundleDeployment.eventFilters.resourceVersionChange | quote }}
131+
- name: FLEET_EVENT_MONITOR_BD_EVENT_DELETION
132+
value: {{ .Values.logging.bundleDeployment.eventFilters.deletion | quote }}
133+
- name: FLEET_EVENT_MONITOR_BD_EVENT_NOT_FOUND
134+
value: {{ .Values.logging.bundleDeployment.eventFilters.notFound | quote }}
135+
- name: FLEET_EVENT_MONITOR_BD_EVENT_CREATE
136+
value: {{ .Values.logging.bundleDeployment.eventFilters.create | quote }}
137+
- name: FLEET_EVENT_MONITOR_BD_EVENT_TRIGGERED_BY
138+
value: {{ .Values.logging.bundleDeployment.eventFilters.triggeredBy | quote }}
139+
# Cluster resource filters
140+
- name: FLEET_EVENT_MONITOR_CLUSTER_RESOURCE_FILTER_NAMESPACE
141+
value: {{ .Values.logging.cluster.resourceFilter.namespace | quote }}
142+
- name: FLEET_EVENT_MONITOR_CLUSTER_RESOURCE_FILTER_NAME
143+
value: {{ .Values.logging.cluster.resourceFilter.name | quote }}
144+
# Cluster event filters
145+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_GENERATION_CHANGE
146+
value: {{ .Values.logging.cluster.eventFilters.generationChange | quote }}
147+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_STATUS_CHANGE
148+
value: {{ .Values.logging.cluster.eventFilters.statusChange | quote }}
149+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_ANNOTATION_CHANGE
150+
value: {{ .Values.logging.cluster.eventFilters.annotationChange | quote }}
151+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_LABEL_CHANGE
152+
value: {{ .Values.logging.cluster.eventFilters.labelChange | quote }}
153+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_RESVER_CHANGE
154+
value: {{ .Values.logging.cluster.eventFilters.resourceVersionChange | quote }}
155+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_DELETION
156+
value: {{ .Values.logging.cluster.eventFilters.deletion | quote }}
157+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_NOT_FOUND
158+
value: {{ .Values.logging.cluster.eventFilters.notFound | quote }}
159+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_CREATE
160+
value: {{ .Values.logging.cluster.eventFilters.create | quote }}
161+
- name: FLEET_EVENT_MONITOR_CLUSTER_EVENT_TRIGGERED_BY
162+
value: {{ .Values.logging.cluster.eventFilters.triggeredBy | quote }}
163+
# GitRepo resource filters
164+
- name: FLEET_EVENT_MONITOR_GITREPO_RESOURCE_FILTER_NAMESPACE
165+
value: {{ .Values.logging.gitRepo.resourceFilter.namespace | quote }}
166+
- name: FLEET_EVENT_MONITOR_GITREPO_RESOURCE_FILTER_NAME
167+
value: {{ .Values.logging.gitRepo.resourceFilter.name | quote }}
168+
# GitRepo event filters
169+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_GENERATION_CHANGE
170+
value: {{ .Values.logging.gitRepo.eventFilters.generationChange | quote }}
171+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_STATUS_CHANGE
172+
value: {{ .Values.logging.gitRepo.eventFilters.statusChange | quote }}
173+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_ANNOTATION_CHANGE
174+
value: {{ .Values.logging.gitRepo.eventFilters.annotationChange | quote }}
175+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_LABEL_CHANGE
176+
value: {{ .Values.logging.gitRepo.eventFilters.labelChange | quote }}
177+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_RESVER_CHANGE
178+
value: {{ .Values.logging.gitRepo.eventFilters.resourceVersionChange | quote }}
179+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_DELETION
180+
value: {{ .Values.logging.gitRepo.eventFilters.deletion | quote }}
181+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_NOT_FOUND
182+
value: {{ .Values.logging.gitRepo.eventFilters.notFound | quote }}
183+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_CREATE
184+
value: {{ .Values.logging.gitRepo.eventFilters.create | quote }}
185+
- name: FLEET_EVENT_MONITOR_GITREPO_EVENT_TRIGGERED_BY
186+
value: {{ .Values.logging.gitRepo.eventFilters.triggeredBy | quote }}
187+
# HelmOp resource filters
188+
- name: FLEET_EVENT_MONITOR_HELMOP_RESOURCE_FILTER_NAMESPACE
189+
value: {{ .Values.logging.helmOp.resourceFilter.namespace | quote }}
190+
- name: FLEET_EVENT_MONITOR_HELMOP_RESOURCE_FILTER_NAME
191+
value: {{ .Values.logging.helmOp.resourceFilter.name | quote }}
192+
# HelmOp event filters
193+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_GENERATION_CHANGE
194+
value: {{ .Values.logging.helmOp.eventFilters.generationChange | quote }}
195+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_STATUS_CHANGE
196+
value: {{ .Values.logging.helmOp.eventFilters.statusChange | quote }}
197+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_ANNOTATION_CHANGE
198+
value: {{ .Values.logging.helmOp.eventFilters.annotationChange | quote }}
199+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_LABEL_CHANGE
200+
value: {{ .Values.logging.helmOp.eventFilters.labelChange | quote }}
201+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_RESVER_CHANGE
202+
value: {{ .Values.logging.helmOp.eventFilters.resourceVersionChange | quote }}
203+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_DELETION
204+
value: {{ .Values.logging.helmOp.eventFilters.deletion | quote }}
205+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_NOT_FOUND
206+
value: {{ .Values.logging.helmOp.eventFilters.notFound | quote }}
207+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_CREATE
208+
value: {{ .Values.logging.helmOp.eventFilters.create | quote }}
209+
- name: FLEET_EVENT_MONITOR_HELMOP_EVENT_TRIGGERED_BY
210+
value: {{ .Values.logging.helmOp.eventFilters.triggeredBy | quote }}
211+
# Summary configuration
212+
- name: FLEET_EVENT_MONITOR_SUMMARY_INTERVAL
213+
value: {{ .Values.logging.summary.interval | quote }}
214+
- name: FLEET_EVENT_MONITOR_SUMMARY_RESET
215+
value: {{ .Values.logging.summary.resetOnPrint | quote }}
216+
{{- with .Values.extraEnv }}
217+
{{- toYaml . | nindent 8 }}
218+
{{- end }}
219+
securityContext:
220+
allowPrivilegeEscalation: false
221+
readOnlyRootFilesystem: true
222+
capabilities:
223+
drop:
224+
- ALL
225+
resources:
226+
{{- toYaml .Values.resources | nindent 10 }}
227+
volumeMounts:
228+
- name: tmp
229+
mountPath: /tmp
230+
volumes:
231+
- name: tmp
232+
emptyDir: {}
233+
{{- with .Values.nodeSelector }}
234+
nodeSelector:
235+
{{- toYaml . | nindent 8 }}
236+
{{- end }}
237+
{{- with .Values.tolerations }}
238+
tolerations:
239+
{{- toYaml . | nindent 8 }}
240+
{{- end }}
241+
{{- with .Values.priorityClassName }}
242+
priorityClassName: {{ . }}
243+
{{- end }}

0 commit comments

Comments
 (0)