Helm Diff is the Helm plugin that shows a diff between a live release and a proposed chart upgrade before any changes are applied — the kubectl diff equivalent for Helm releases. In CI/CD pipelines, Helm Diff runs as a mandatory gate: pull requests only merge after a diff has been reviewed and approved. When the CI runner hosting Helm Diff loses connectivity to the Kubernetes API server, diff jobs fail silently and engineers either merge without a preview or block on a broken pipeline with no clear error. When the Kubernetes API server itself becomes unavailable to external CI, diff operations hang indefinitely. Vigilmon gives you external visibility into your CI/CD infrastructure, Kubernetes API reachability, and Helm release state endpoints so you know the moment your deployment preview pipeline breaks down.
What You'll Build
- HTTP monitors on your CI/CD platform's API endpoint to detect runner failures
- A TCP check on the Kubernetes API server port used by Helm Diff
- An HTTP monitor on a lightweight Helm release state endpoint for upgrade failure detection
- SSL certificate monitoring for the Kubernetes API server and any HTTPS endpoints in the diff pipeline
- An alert runbook mapping Vigilmon findings to specific
helmandkubectlremediation commands
Prerequisites
- Helm Diff plugin installed (
helm plugin install https://github.com/databus23/helm-diff) - A CI/CD pipeline (GitHub Actions, GitLab CI, ArgoCD, or Tekton) that runs
helm diff upgradeas a gate - External access to your Kubernetes API server or a CI runner with cluster credentials
- A free account at vigilmon.online
Step 1: Understand Helm Diff's Dependency Chain
Helm Diff does not have its own long-running server process — it is a plugin that runs as a subprocess during CI/CD jobs. Its availability therefore depends on the health of three components:
# Verify the Helm Diff plugin is installed correctly
helm plugin list | grep diff
# Run a test diff against a non-critical release
helm diff upgrade my-release ./my-chart --namespace production --no-color
# Check the current state of releases Helm Diff would inspect
helm list --all-namespaces
# Verify the Kubernetes API server is reachable from your CI environment
kubectl cluster-info
kubectl get nodes --request-timeout=10s
The failure modes Vigilmon catches are:
- CI/CD runner down: Helm Diff jobs never start; pipeline queue fills up.
- Kubernetes API server unreachable:
helm diffhangs waiting for API responses and eventually times out. - Helm release in a bad state: A previous failed upgrade left a release in
FAILEDstatus; Helm Diff on a FAILED release returns an error, blocking the entire pipeline.
Step 2: Monitor the CI/CD Platform API
If your CI/CD platform exposes a status or health endpoint, monitor it directly. Examples for common platforms:
# GitHub Actions — check GitHub's status page API
curl https://www.githubstatus.com/api/v2/status.json | jq '.status.indicator'
# GitLab — check the GitLab instance health endpoint (self-hosted)
curl https://gitlab.example.com/-/health
# Jenkins — check the Jenkins API
curl http://jenkins.example.com/api/json?pretty=true
In Vigilmon:
GitHub Actions (via GitHub status API):
- Add Monitor → HTTP.
- URL:
https://www.githubstatus.com/api/v2/components.json. - Keyword:
Actions(confirms the Actions component is in the response). - Label:
github actions availability. - Click Save.
Self-hosted GitLab:
- Add Monitor → HTTP.
- URL:
https://gitlab.example.com/-/health. - Expected status:
200. - Label:
gitlab ci health. - Click Save.
Step 3: Monitor the Kubernetes API Server Reachability
Helm Diff calls the Kubernetes API to fetch the current release state, render templates, and compute the diff. If the API server is unreachable from your CI network, all diff operations fail. Create a TCP check on the API server port:
# Find your Kubernetes API server address
kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}'
# Example output: https://k8s-api.example.com:6443
In Vigilmon:
- Add Monitor → TCP.
- Host:
k8s-api.example.com. - Port:
6443. - Check interval: 2 minutes.
- Label:
kubernetes api server tcp. - Click Save.
Also add an HTTP monitor for the API server's liveness endpoint:
- Add Monitor → HTTP.
- URL:
https://k8s-api.example.com:6443/livez. - Expected status:
200. - Keyword:
ok. - Label:
kubernetes api server livez. - Click Save.
Why
livezand TCP together: The TCP check confirms the port is accepting connections. The HTTP check on/livezconfirms the API server process itself is healthy — not just that a load balancer is routing to a failed backend.
Step 4: Expose and Monitor Helm Release State
Failed Helm releases block helm diff upgrade with cryptic errors. Build a lightweight monitoring endpoint that reports the state of critical releases:
# Check all release states across namespaces
helm list --all-namespaces --output json | jq '.[] | {name: .name, namespace: .namespace, status: .status}'
# Find any FAILED or PENDING releases
helm list --all-namespaces --filter '.*' | grep -E 'FAILED|PENDING'
Create a CronJob that writes release state to a ConfigMap and exposes it via a simple HTTP server:
# helm-state-reporter.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: helm-state-reporter
namespace: monitoring
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: helm-state-reporter
containers:
- name: reporter
image: alpine/helm:3.14.0
command:
- sh
- -c
- |
FAILED=$(helm list --all-namespaces --output json | jq '[.[] | select(.status=="failed")] | length')
if [ "$FAILED" -gt "0" ]; then
echo "FAILED releases: $FAILED" > /tmp/status
exit 1
fi
echo "all releases healthy" > /tmp/status
restartPolicy: OnFailure
Then create an HTTP endpoint that reports this status, and add a Vigilmon HTTP monitor for it:
- Add Monitor → HTTP.
- URL:
https://helm-state.example.com/status. - Keyword:
healthy. - Label:
helm release state. - Click Save.
Step 5: Detect Upgrade Failures via Diff Pipeline Canary
Create a canary pipeline job that runs helm diff upgrade against a stable, low-risk release on a fixed schedule. A failure of this canary job indicates the entire diff pipeline is broken, not just one specific deployment:
# .github/workflows/helm-diff-canary.yml
name: Helm Diff Canary
on:
schedule:
- cron: '*/15 * * * *'
jobs:
canary-diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup kubectl
uses: azure/setup-kubectl@v3
- name: Setup Helm
uses: azure/setup-helm@v3
- name: Install helm-diff
run: helm plugin install https://github.com/databus23/helm-diff
- name: Run canary diff
run: |
helm diff upgrade canary-release ./charts/canary \
--namespace monitoring \
--no-color \
--context 3
- name: Report to Vigilmon
if: failure()
run: |
curl -X POST https://vigilmon.online/api/heartbeats/YOUR_HEARTBEAT_ID/fail
In Vigilmon, add a Heartbeat monitor that the canary job pings on success:
- Add Monitor → Heartbeat.
- Expected interval: 20 minutes.
- Grace period: 5 minutes.
- Label:
helm diff canary pipeline. - Click Save and use the generated heartbeat URL in the canary job's success step.
Step 6: Monitor SSL Certificates
Helm Diff communicates with the Kubernetes API server over TLS. An expired or misconfigured API server certificate causes helm diff to fail with x509: certificate has expired or not yet valid errors in the CI pipeline:
# Check the Kubernetes API server certificate
openssl s_client -connect k8s-api.example.com:6443 2>/dev/null | \
openssl x509 -noout -dates
# Check any additional TLS endpoints in your diff pipeline
openssl s_client -connect gitlab.example.com:443 2>/dev/null | \
openssl x509 -noout -dates
In Vigilmon:
- Add Monitor → SSL Certificate.
- Domain:
k8s-api.example.com. - Port:
6443. - Alert when expiry is within: 30 days.
- Click Save.
Kubernetes API server certificates rotated by kubeadm or managed Kubernetes services can expire on unexpected schedules — 90-day CA-issued certs from Let's Encrypt are particularly common in self-managed clusters.
Step 7: Configure Alerting
In Vigilmon under Settings → Notifications, configure your alert channels:
| Monitor | Trigger | Immediate Action |
|---|---|---|
| CI/CD platform API | Non-200 or keyword missing | Check CI provider status page; review runner logs for queued jobs |
| Kubernetes API TCP | Connection refused | Check API server pod: kubectl get pods -n kube-system -l component=kube-apiserver |
| Kubernetes API /livez | Non-200 | API server process unhealthy; check kubectl get cs for component status |
| Helm release state | Keyword missing | helm list --all-namespaces | grep FAILED; run helm rollback on failed release |
| SSL certificate | < 30 days to expiry | Rotate API server certificate; check kubeadm cert expiry: kubeadm certs check-expiration |
| Canary pipeline heartbeat | Missed heartbeat | Check CI runner status; review last failed workflow run for error details |
Escalation policy: Helm Diff failures block all production deployments. Route alerts to the platform engineering team with high priority and include the affected cluster name. If the Kubernetes API server is down, escalate to whoever owns cluster operations.
Common Helm Diff Failure Modes and What Vigilmon Catches
| Scenario | Vigilmon monitor |
|---|---|
| CI runner pool exhausted; no runners available | CI platform API health; canary heartbeat misses |
| Kubernetes API server certificate expires | SSL monitor catches 30 days early; API /livez goes down at expiry |
| Failed Helm release blocks diff operations | Helm release state monitor catches FAILED status |
| Network change blocks CI runner → API server traffic | TCP check on port 6443 catches connection refused |
| API server upgrade causes brief unavailability | /livez HTTP monitor detects unhealthy during rollover |
| Helm Diff plugin version mismatch breaks canary | Canary heartbeat misses at next 15-minute check |
| Kubernetes RBAC change removes CI service account permissions | Diff operations fail with 403; canary heartbeat misses |
| etcd disk full causes API server to reject writes | /livez returns non-200; TCP check still succeeds (confusing without both) |
helm diff upgrade is the last line of defense before a Helm chart change lands in production — the review that catches accidental deletions, misconfigured resource limits, and unexpected template changes. When the diff pipeline is broken, engineers either fly blind into production upgrades or block releases waiting for someone to diagnose a silent infrastructure failure. Vigilmon closes this blind spot by monitoring the CI/CD platform, the Kubernetes API reachability, and the canary diff pipeline independently, so you know immediately when your deployment preview gate stops working.
Start monitoring your Helm Diff pipeline in under 5 minutes — register free at vigilmon.online.