Flux Operator is a Kubernetes operator that declaratively manages Flux CD instances. Instead of running flux bootstrap manually, you create a FluxInstance custom resource describing your desired Flux configuration, and the operator handles installation, upgrades, and reconciliation — continuously ensuring your Flux CD deployment matches the spec.
This GitOps-on-GitOps approach is elegant. It also introduces new failure modes: if Flux Operator itself is degraded, your entire GitOps bootstrap pipeline stalls silently. Workloads that depend on Flux CD for deployment can fall behind without triggering any Kubernetes alert.
This tutorial covers how to monitor Flux Operator-managed environments with Vigilmon — free tier, no credit card required.
Why Flux Operator environments need external monitoring
Flux Operator ensures Flux CD runs and stays configured. But neither the operator nor Flux CD monitors whether the applications Flux deploys are actually reachable and healthy:
- Flux Operator reconciliation loop fails — a
FluxInstanceupdate is rejected; your Flux CD configuration drifts from the desired state - Flux CD falls behind on GitOps sync — source controller loses connectivity to your Git repository; resources stop reconciling but existing deployments still look healthy
- Kustomization or HelmRelease fails to apply — a broken manifest is pushed to Git; Flux applies it, breaks the deployment, and reports
Applied revision: main/abc123even while the service is down - Flux Operator upgrade causes Flux CD restart — during upgrade, Flux stops reconciling briefly; any Git changes during that window don't get applied
- Network policy pushed via Flux blocks ingress — a Flux-managed NetworkPolicy change cuts off external access; Kubernetes probes (running inside the cluster) still pass
The only way to catch these failures is to probe your services from outside the cluster the same way users do. Vigilmon does exactly that.
What you'll need
- A Kubernetes cluster with Flux Operator and Flux CD installed
- At least one Flux-managed workload exposed via HTTP/HTTPS externally
- A free Vigilmon account
Step 1: Verify your Flux-managed service is reachable
Check Flux Operator status:
kubectl get fluxinstance -A
# NAMESPACE NAME READY STATUS AGE
# flux-system flux True Reconciled 7d
Check that Flux CD is running:
kubectl get pods -n flux-system
# NAME READY STATUS RESTARTS AGE
# source-controller-5d8f7c9b4-xkp2m 1/1 Running 0 7d
# kustomize-controller-6c9b8d5c4-jrt8l 1/1 Running 0 7d
# helm-controller-7d9c5e4f3-lnp3q 1/1 Running 0 7d
# notification-controller-8e0d6f5g4-mnr4t 1/1 Running 0 7d
Verify a Flux-managed application is reachable:
# Get the service endpoint
kubectl get svc my-app -n production
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# my-app LoadBalancer 10.100.0.20 203.0.113.40 80:30080/TCP
curl http://203.0.113.40/health
# {"status":"ok","git_revision":"main/abc123"}
Step 2: Add HTTP monitoring in Vigilmon
- Log in to vigilmon.online and go to Monitors → New Monitor
- Select HTTP / HTTPS
- Enter your service URL:
https://app.example.com/health - Set check interval to 1 minute
- Configure Expected response:
- Status code:
200 - (Optional) Body contains:
"status":"ok"
- Status code:
- Save the monitor
Vigilmon now probes your Flux-managed application from multiple geographic regions. If a bad GitOps commit breaks the app and Flux applies it to the cluster, Vigilmon catches the downtime — even if flux get kustomizations shows the revision was applied successfully.
Why "Applied" ≠ "Healthy"
This is the core gap in GitOps observability. Flux can report:
✔ applied revision: main/abc1234
…while the deployment is actually crashing because the new image tag doesn't exist, a secret was deleted, or a config change broke the app. Vigilmon's HTTP monitor is the only check that verifies the application is actually serving traffic after a GitOps update.
Step 3: Monitor Flux Operator and Flux CD health
Flux Operator's FluxInstance exposes a Ready condition. You can check this programmatically:
kubectl get fluxinstance flux -n flux-system -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
# True
For Flux CD's source controller, kustomize controller, and helm controller — they all expose a /healthz endpoint. To reach these from outside the cluster, you'd need to expose them via a Service. Alternatively, monitor them indirectly:
Monitoring Flux indirectly via your workloads is the most practical approach. When Flux stops reconciling, new commits don't get applied. You can detect this by including the current Git revision in your health endpoint response:
{
"status": "ok",
"git_revision": "main/abc1234",
"reconciled_at": "2026-07-12T03:00:00Z"
}
If Flux stops reconciling, this revision stops updating even as Git advances. Your Vigilmon monitor's response body check will catch this drift if you update the expected revision hash.
For a simpler approach, use Vigilmon's body contains check to assert the timestamp isn't stale — though this requires your app to embed reconciliation timestamps.
Step 4: Add a TCP monitor for Flux CD API access
If your cluster exposes the Flux notification controller webhook endpoint, add a TCP monitor to verify it's reachable:
kubectl get svc -n flux-system
# notification-controller ClusterIP 10.100.0.30 <none> 9292/TCP
If exposed via NodePort or LoadBalancer, add it to Vigilmon:
- Go to Monitors → New Monitor → TCP Port
- Enter the host and port
- Save the monitor
A down notification controller means Flux won't receive Git push webhooks, causing sync delays.
Step 5: Track GitOps deployment outcomes with monitoring
Structure your CI/CD pipeline to verify Vigilmon shows green after each Flux reconciliation:
# After pushing a commit, wait for Flux to reconcile
flux reconcile kustomization my-app --with-source --timeout=5m
# Then verify the service is up
curl -f https://app.example.com/health || echo "ALERT: health check failed after reconciliation"
For automated pipelines, you can also poll Vigilmon's public status page or use the Vigilmon API to confirm your monitor shows green before marking a deployment complete.
Step 6: Configure alert channels for GitOps failures
- In Vigilmon, go to Alert Channels → Add Channel
- Choose Webhook to integrate with Slack, PagerDuty, or your incident management system
- Assign channels to your Flux-related monitors
When a Vigilmon alert fires immediately after a GitOps commit, the correlation is clear: check the commit, check Flux reconciliation status, and roll back if needed:
# See what Flux applied
flux get kustomizations
flux get helmreleases -A
# Check for reconciliation errors
kubectl get events -n flux-system --sort-by='.lastTimestamp' | grep -i error
# If needed, suspend reconciliation while you investigate
flux suspend kustomization my-app
Step 7: Create a GitOps deployment status page
- In Vigilmon, go to Status Pages → New Status Page
- Name it "GitOps Fleet" or your environment name
- Add all monitors for Flux-managed workloads, grouped by environment (staging, production)
- Publish the page
When your team is pushing GitOps changes, the status page gives real-time visibility into whether deployed services are healthy across environments.
Monitoring summary
| Monitor | Type | What it catches |
|---------|------|-----------------|
| https://app.example.com/health | HTTP | App health after Flux reconciliation |
| Per-service HTTP monitors | HTTP | Independent service health |
| Flux notification controller | TCP | Webhook receiver reachability |
| Response body revision check | HTTP | Flux reconciliation lag detection |
What's next
- Heartbeat monitoring — use Vigilmon heartbeats for Flux-managed CronJob workloads; detect when batch jobs stop running without error
- SSL certificate monitoring — track TLS cert expiry for services managed by Flux; especially important if cert-manager is itself a Flux HelmRelease
- Multi-environment monitoring — create separate monitors for staging and production Flux environments and use response body checks to verify the correct commit is deployed in each
Start monitoring your Flux Operator-managed fleet today at vigilmon.online — free tier, no credit card required.