Skaffold handles the repetitive parts of Kubernetes development — it watches your source files, rebuilds container images, pushes them to a registry, and redeploys to your cluster. Whether you're running skaffold dev in a local loop or skaffold run in CI, Skaffold keeps your cluster synchronized with your code.
But Skaffold stops at deployment. Once your service is running, you need to know that it actually works — that the endpoint returns 200, that latency is within bounds, and that the build-deploy cycle didn't introduce a silent regression. Vigilmon provides external monitoring that runs independently of your Skaffold workflow and catches failures that Skaffold has no visibility into.
What Skaffold Cannot Tell You
Skaffold reports build success, push success, and deployment success. What it cannot report:
- Whether the deployed container is serving HTTP traffic on the expected path
- Whether external DNS resolves correctly after redeployment
- Whether a new container image introduced a startup failure that only manifests under real traffic
- Whether the Kubernetes Ingress is routing correctly after a profile switch
- Whether response times degraded after a dependency update
These gaps are where monitoring lives. Skaffold and Vigilmon are complementary: Skaffold manages the inner loop, Vigilmon watches the outer edge.
What You'll Set Up
- HTTP monitor for your Skaffold-deployed service endpoint
- Heartbeat monitor to detect failed or stalled Skaffold pipelines in CI
- Container health endpoint wired into your application
- Alert routing to Slack or your preferred channel
You'll need a free Vigilmon account — no credit card required.
Step 1: Add a Health Endpoint to Your Application
Before Vigilmon can monitor your service, your application needs a health endpoint. This endpoint should verify real dependencies, not just that the process started.
# app.py — FastAPI example
from fastapi import FastAPI
from fastapi.responses import JSONResponse
import time
import os
app = FastAPI()
start_time = time.time()
@app.get("/health")
async def health():
uptime = time.time() - start_time
# Check any real dependencies here (DB, cache, etc.)
return JSONResponse({
"status": "ok",
"uptime_seconds": round(uptime, 2),
"version": os.getenv("APP_VERSION", "unknown")
})
If you're using Skaffold profiles, inject the version via environment variable so you can confirm which build is actually running:
# skaffold.yaml
apiVersion: skaffold/v4beta11
kind: Config
build:
artifacts:
- image: my-api
docker:
dockerfile: Dockerfile
deploy:
kubectl:
manifests:
- k8s/deployment.yaml
profiles:
- name: staging
deploy:
kubectl:
manifests:
- k8s/deployment-staging.yaml
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-api
spec:
replicas: 1
selector:
matchLabels:
app: my-api
template:
metadata:
labels:
app: my-api
spec:
containers:
- name: my-api
image: my-api
env:
- name: APP_VERSION
value: "{{.IMAGE_TAG}}"
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
Using {{.IMAGE_TAG}} as the version value means your health response always reflects the exact image deployed by Skaffold, making it trivial to correlate Vigilmon alerts with specific builds.
Step 2: Monitor Your Deployed Endpoint
Once your service is exposed via a Kubernetes Ingress or LoadBalancer, set up an HTTP monitor in Vigilmon:
- Log in to vigilmon.online and go to Monitors → New Monitor
- Choose HTTP / HTTPS
- Set the URL to your service's external endpoint:
https://staging-api.yourdomain.com/health - Set the check interval to 1 minute
- Under Expected response, configure:
- Status code:
200 - Response body contains:
"status":"ok" - Response time threshold:
3000ms
- Status code:
- Save the monitor
Vigilmon probes from multiple independent geographic regions and requires consensus across locations before opening an incident. A transient network blip in one region won't wake your on-call — but a real service failure will.
Monitoring Multiple Skaffold Profiles
If you use Skaffold profiles for staging and production, create a separate monitor for each:
| Monitor Name | URL | Profile |
|---|---|---|
| [dev] my-api /health | https://dev-api.yourdomain.com/health | dev |
| [staging] my-api /health | https://staging-api.yourdomain.com/health | staging |
| [prod] my-api /health | https://api.yourdomain.com/health | production |
Grouping them in Vigilmon lets you see at a glance which environment is affected during an incident.
Step 3: Heartbeat Monitoring for Skaffold CI Pipelines
When running skaffold run in CI, a failed pipeline is a deployment gap. If your CI job exits non-zero, Skaffold stopped deploying — but nothing external knows that. Heartbeat monitoring flips the model: your pipeline reports in on success, and Vigilmon alerts if it goes silent.
Create the Heartbeat Monitor
- In Vigilmon, go to Monitors → New Monitor → Heartbeat
- Name it:
skaffold-ci-deploy - Set the expected interval: 1 day (or your actual deploy cadence)
- Set the grace period: 2 hours
- Save — you'll receive a unique URL like
https://vigilmon.online/heartbeat/abc123xyz
Store the URL as a CI secret named VIGILMON_HEARTBEAT_URL.
Wire Into Your CI Pipeline
# .github/workflows/deploy.yml
name: Deploy via Skaffold
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up kubectl
uses: azure/setup-kubectl@v3
- name: Configure kubeconfig
run: echo "${{ secrets.KUBECONFIG }}" | base64 -d > $HOME/.kube/config
- name: Install Skaffold
run: |
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold && sudo mv skaffold /usr/local/bin/
- name: Deploy with Skaffold
run: skaffold run --profile=production
- name: Notify Vigilmon heartbeat
if: success()
run: curl -fsS "${{ secrets.VIGILMON_HEARTBEAT_URL }}" > /dev/null
The heartbeat ping only fires on success(), so any failed Skaffold step — build error, push failure, deployment timeout — prevents the ping and triggers a Vigilmon alert after the grace period expires.
Step 4: Container Health Monitoring
Kubernetes readiness probes track pod health inside the cluster network. External monitoring tracks what external clients see. Both are necessary and check different things.
Add a Vigilmon SSL/TLS monitor alongside your HTTP monitor to catch certificate issues that Skaffold's --tls-verify flag doesn't cover post-deployment:
- In Vigilmon, go to Monitors → New Monitor
- Choose SSL Certificate
- Enter your domain:
staging-api.yourdomain.com - Set the expiry alert threshold: 30 days
- Save
A certificate that was valid at deploy time can expire during a sprint. Skaffold won't tell you — Vigilmon will.
Step 5: Alert Configuration
Slack Integration
- Create a Slack incoming webhook for your
#deploymentschannel - In Vigilmon, go to Alert Channels → New Channel → Webhook
- Paste the Slack webhook URL
- Assign the alert channel to all your Skaffold service monitors
A Vigilmon downtime alert sends a payload you can act on immediately:
{
"monitor_name": "[staging] my-api /health",
"status": "down",
"url": "https://staging-api.yourdomain.com/health",
"started_at": "2026-07-01T09:12:00Z",
"duration_seconds": 0,
"regions_failing": ["us-east", "eu-west"]
}
When this fires after a Skaffold deploy, you know immediately that the new image didn't come up cleanly.
Correlating Alerts With Builds
Add Skaffold's image tag to a custom response header in your health endpoint:
@app.get("/health")
async def health(response: Response):
response.headers["X-Build-Version"] = os.getenv("APP_VERSION", "unknown")
return {"status": "ok"}
Vigilmon's response body check captures this indirectly — if the version header changes after a Skaffold deploy and the service goes down, you have an exact build to roll back to.
Summary
Skaffold automates deployment; Vigilmon monitors what was deployed. Together they give you confidence in the full cycle — from code change to running service to confirmed availability.
| Concern | Tool | Coverage | |---|---|---| | Build success | Skaffold | Image build and push | | Deployment success | Skaffold | Pod rollout status | | External reachability | Vigilmon HTTP monitor | Full external path | | TLS certificate health | Vigilmon SSL monitor | Certificate expiry | | CI pipeline heartbeat | Vigilmon heartbeat | Deploy cadence | | Latency regression | Vigilmon response time threshold | External latency |
Start monitoring your Skaffold deployments for free at vigilmon.online — setup takes under five minutes and gives you immediate visibility into every deploy.