Higress is a cloud-native API gateway and service mesh gateway open-sourced by Alibaba, built on Envoy and designed to unify Kubernetes Ingress, service mesh traffic management, and API gateway functionality in a single control plane. It supports WASM plugins for custom routing logic, integrates with Istio for mesh traffic, and provides HTTP route management through Higress Ingress resources and McpBridge configurations. When the Higress controller crashes or its gateway pods fail, all inbound API traffic is silently dropped — not with error responses, but with connection refused or timeouts — while the workload pods behind the gateway continue to show Running and pass their readiness probes. Because Higress unifies multiple traffic layers, a single control-plane failure can affect both external API traffic and internal mesh routing simultaneously.
In this tutorial you'll set up comprehensive uptime monitoring for your Higress deployment using Vigilmon — free tier, no credit card required.
Why Higress deployments need external monitoring
Higress introduces failure modes that Kubernetes pod health cannot surface:
- Higress controller crash — the controller that reconciles Higress Ingress and McpBridge resources and pushes configuration to Envoy gateway pods exits; existing connections continue on stale routing config but new Ingress rules are never applied; the gateway pods stay
Runningwhile routing for newly deployed services silently fails - Gateway pod OOMKill or crash — the Higress gateway pod that actually terminates inbound connections exits or gets stuck; all API traffic returns connection refused; backend pods are healthy but unreachable; Kubernetes reschedules the pod but there is a gap that users experience as downtime
- WASM plugin load failure — a custom WASM plugin built into a Higress route fails to load or panics during request processing; affected routes return 500 errors while the gateway pod continues running; standard health checks never catch plugin-level failures
- McpBridge configuration error — a misconfigured McpBridge resource prevents Higress from discovering backend services in a service registry (Nacos, Consul, Eureka, or Kubernetes); routes that target those services return 503 while the Higress controller and gateway pods report healthy
- Certificate rotation failure — Higress manages TLS certificates for HTTPS routes; if cert-manager or a manual certificate secret rotation fails, HTTPS routes begin returning TLS handshake errors while HTTP routes continue to work, making the failure appear intermittent
These failures share a pattern: the Higress process is running and passes pod-level checks, but actual traffic is broken. External monitoring from Vigilmon probes the real traffic path and surfaces these failures before users do.
What you'll need
- A Kubernetes cluster with Higress installed (via Helm or the Higress CLI)
- A workload service exposed through a Higress Ingress resource
- A free Vigilmon account (sign up takes 30 seconds)
Step 1: Expose a health endpoint through Higress
Deploy a probe service and expose it through a Higress Ingress resource so the full Higress data path is validated.
First, verify your Higress deployment is running:
# Check Higress pods
kubectl get pods -n higress-system
# NAME READY STATUS RESTARTS AGE
# higress-controller-6d7f8b9c4-vr2mn 2/2 Running 0 2d
# higress-gateway-5b8c9d6f4-tn3pk 1/1 Running 0 2d
# Check Higress gateway service
kubectl get svc -n higress-system higress-gateway
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# higress-gateway LoadBalancer 10.96.44.200 203.0.113.80 80:30080/TCP,443:30443/TCP
# Check Higress ingress resources
kubectl get ingress -A
Deploy a probe service in a target namespace:
# higress-probe.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: higress-probe
namespace: my-app
spec:
replicas: 1
selector:
matchLabels:
app: higress-probe
template:
metadata:
labels:
app: higress-probe
spec:
containers:
- name: probe
image: nginx:alpine
ports:
- containerPort: 8080
volumeMounts:
- name: config
mountPath: /etc/nginx/conf.d
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
volumes:
- name: config
configMap:
name: higress-probe-nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
name: higress-probe-nginx
namespace: my-app
data:
default.conf: |
server {
listen 8080;
location /healthz {
return 200 '{"status":"ok","component":"higress-probe","gateway":"higress"}';
add_header Content-Type application/json;
}
}
---
apiVersion: v1
kind: Service
metadata:
name: higress-probe
namespace: my-app
spec:
selector:
app: higress-probe
ports:
- port: 8080
targetPort: 8080
name: http
Create a Higress Ingress resource to route traffic through the gateway:
# higress-probe-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: higress-probe
namespace: my-app
annotations:
higress.io/enable-cors: "false"
spec:
ingressClassName: higress
rules:
- host: higress-probe.your-cluster.example.com
http:
paths:
- path: /healthz
pathType: Exact
backend:
service:
name: higress-probe
port:
number: 8080
tls:
- hosts:
- higress-probe.your-cluster.example.com
secretName: higress-probe-tls
kubectl apply -f higress-probe.yaml
kubectl apply -f higress-probe-ingress.yaml
# Get the gateway external IP
kubectl get svc -n higress-system higress-gateway
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
# higress-gateway LoadBalancer 10.96.44.200 203.0.113.80 80:30080/TCP,443:30443/TCP
# Add DNS: higress-probe.your-cluster.example.com -> 203.0.113.80
# Then confirm the health endpoint responds
curl https://higress-probe.your-cluster.example.com/healthz
# {"status":"ok","component":"higress-probe","gateway":"higress"}
# Or test by IP using Host header
curl -H "Host: higress-probe.your-cluster.example.com" http://203.0.113.80/healthz
# {"status":"ok","component":"higress-probe","gateway":"higress"}
Step 2: Set up HTTP monitoring in Vigilmon
With the probe endpoint reachable through Higress, add it to Vigilmon:
- Log in to vigilmon.online and go to Monitors → New Monitor
- Choose HTTP / HTTPS as the type
- Set the URL to your probe endpoint:
https://higress-probe.your-cluster.example.com/healthz - Set the check interval to 1 minute
- Under Expected response, set:
- Status code:
200 - Response body contains:
"status":"ok"
- Status code:
- Save the monitor
This monitor validates the complete Higress data path: the Higress controller must be reconciling Ingress resources, the gateway pod must be running and forwarding traffic, the Envoy routing config must be correct, and the backend service must be healthy. Any failure in this chain causes the monitor to alert.
Why external monitoring catches what Kubernetes misses
Higress gateway pods pass their readiness probes by checking that the Envoy process is listening on port 80, not that it's correctly routing requests. A gateway pod can show Ready: 1/1 while returning 503 for all routes because the Higress controller failed to push updated xDS config. Vigilmon's external HTTP probe validates the actual routing result — the response body and status code — not just the port-open check. Its multi-region consensus prevents false positives from transient network blips.
Step 3: Monitor the Higress gateway TCP ports
Add TCP monitors to detect network-level failures before HTTP routing is even attempted:
Gateway HTTPS port:
- Go to Monitors → New Monitor
- Choose TCP Port
- Enter: Host
203.0.113.80, Port443 - Save the monitor
Gateway HTTP port:
- Go to Monitors → New Monitor
- Choose TCP Port
- Enter: Host
203.0.113.80, Port80 - Save the monitor
Higress controller health endpoint:
Higress controller exposes a readiness endpoint. Expose it externally for monitoring:
# higress-controller-health-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: higress-controller-health
namespace: higress-system
spec:
type: NodePort
selector:
app: higress-controller
ports:
- port: 8888
targetPort: 8888
nodePort: 30888
name: health
kubectl apply -f higress-controller-health-svc.yaml
# Verify the controller health endpoint
curl http://<node-ip>:30888/ready
# OK
Add an HTTP monitor in Vigilmon for http://<node-ip>:30888/ready expecting status 200.
Step 4: Configure alert channels
Higress is the entry point for all inbound API traffic. A gateway failure means every external API call fails immediately.
Email alerts
- In Vigilmon, go to Alert Channels → Add Channel → Email
- Enter your platform team's on-call email
- Assign the channel to all Higress monitors
Webhook alerts (Slack, PagerDuty, etc.)
- Go to Alert Channels → Add Channel → Webhook
- Enter your webhook URL
- Assign the channel to your monitors
Example payload when the Higress gateway goes down:
{
"monitor_name": "Higress Gateway Health",
"status": "down",
"url": "https://higress-probe.your-cluster.example.com/healthz",
"started_at": "2024-01-15T18:00:00Z",
"duration_seconds": 90
}
Run these diagnostics immediately when an alert fires:
# Check Higress pod status
kubectl get pods -n higress-system
# Check gateway pod logs for routing errors
kubectl logs -n higress-system deploy/higress-gateway --tail=200 | grep -E "error|503|404|upstream"
# Check controller logs for reconciliation errors
kubectl logs -n higress-system deploy/higress-controller -c higress-core --tail=200 | grep -E "error|failed|reconcil"
# Check if Ingress resource is registered
kubectl get ingress -n my-app higress-probe -o yaml | grep -A10 status
# Check xDS config sync from Higress controller
kubectl logs -n higress-system deploy/higress-controller -c discovery --tail=100 | grep -E "error|xds|LDS|RDS"
# Check McpBridge status (if using service registries)
kubectl get mcpbridge -n higress-system -o yaml | grep -A5 status
# Check Higress gateway Envoy admin interface
kubectl port-forward -n higress-system deploy/higress-gateway 15000:15000 &
curl http://localhost:15000/clusters | grep -i probe
# Check certificate secrets
kubectl get secret -n my-app higress-probe-tls -o yaml | grep -A2 tls.crt
# Check recent events
kubectl get events -n higress-system --sort-by='.lastTimestamp' | tail -20
Step 5: Create a public status page
Higress serves as the API gateway for multiple downstream consumers. A public status page gives them visibility into gateway health.
- In Vigilmon, go to Status Pages → New Status Page
- Give it a name: "Higress API Gateway Status"
- Add your monitors: Higress Probe HTTP, Controller Health HTTP, Gateway TCP 443, Gateway TCP 80
- Group them: API Gateway, Control Plane, Network
- Publish the page
Share this URL with API consumers and internal teams whose services depend on inbound routing through Higress.
Putting it all together
Here's a summary of the monitors to create for a Higress deployment:
| Monitor | Type | What it catches |
|---------|------|-----------------|
| https://higress-probe.your-cluster.example.com/healthz | HTTP | Gateway routing, Ingress config, Envoy xDS sync, backend health |
| http://<node-ip>:30888/ready | HTTP | Higress controller readiness |
| 203.0.113.80:443 | TCP | HTTPS gateway port reachability |
| 203.0.113.80:80 | TCP | HTTP gateway port reachability |
And the Higress diagnostics to run when an alert fires:
# Quick triage: gateway pod or controller issue?
kubectl get pods -n higress-system
kubectl get ingress -A
# Check Envoy routing config on gateway pod
kubectl exec -n higress-system deploy/higress-gateway -- curl -s localhost:15000/routes | python3 -m json.tool | grep -A5 higress-probe
# Check gateway access log for upstream errors
kubectl logs -n higress-system deploy/higress-gateway | grep "NR\|UH\|UF\|UC" | tail -20
# Check controller for failed Ingress reconciliation
kubectl logs -n higress-system deploy/higress-controller -c higress-core | grep -E "error|Ingress|reconcil"
# Check WASM plugin status if plugins are configured
kubectl get wasmplugin -n higress-system -o wide
# Verify TLS certificate is valid
echo | openssl s_client -connect higress-probe.your-cluster.example.com:443 -servername higress-probe.your-cluster.example.com 2>/dev/null | openssl x509 -noout -dates
# Check McpBridge for service registry failures
kubectl describe mcpbridge -n higress-system
What's next
- SSL certificate monitoring — add SSL monitors for each HTTPS route managed by Higress to catch certificate expiry before users see TLS errors
- Heartbeat monitoring — deploy a periodic job that calls a key API endpoint through Higress and sends a Vigilmon heartbeat on success, validating the full routing chain including WASM plugin execution
- Per-route coverage — for production APIs with strict SLAs, create a dedicated Vigilmon monitor for each critical route rather than relying on a single probe, so alerts pinpoint which route is degraded rather than just that the gateway is partially broken
Get started free at vigilmon.online — no credit card, monitors start running in under a minute.