Skip to content

Health Check Layer

The health check layer provides Kubernetes-ready health monitoring endpoints for containerized Nuxt applications. It implements standard health check patterns that enable container orchestration platforms to monitor application health and manage pod lifecycle.

Overview

The health check layer provides three standard endpoints:

  • 🟢 Liveness Probe (api/health/liveness) - Is the application running?
  • 🔵 Readiness Probe (api/health/readiness) - Can the application serve traffic?
  • 🟡 Startup Probe (api/health/startup) - Has the application started successfully?

These endpoints are designed for Kubernetes health checks but work with any container orchestration platform (Docker Swarm, ECS, etc.).

Quick Start

Installation

Add the layer to your nuxt.config.ts:

ts
export default defineNuxtConfig({
  extends: [
    ['github:DCC-BS/nuxt-layers/health_check', { install: true }]
  ]
})

That's it! The health check endpoints are immediately available at:

  • GET api/health/liveness
  • GET api/health/readiness
  • GET api/health/startup

Test the Endpoints

sh
# Start your Nuxt app
npm run dev

# Test liveness endpoint
curl http://localhost:3000/api/health/liveness

# Test readiness endpoint
curl http://localhost:3000/api/health/readiness

# Test startup endpoint
curl http://localhost:3000/api/health/startup

Health Check Endpoints

Liveness Probe

Endpoint: GET api/health/liveness

Purpose: Determines if the application is running and responsive.

When to Use:

  • Kubernetes liveness probes
  • Detecting deadlocks or hung processes
  • Automatic pod restarts when unhealthy

Response:

json
{
  "status": "ok",
  "timestamp": 1234567890
}

HTTP Status Codes:

  • 200 OK - Application is alive
  • 503 Service Unavailable - Application is not responding (should trigger restart)

Kubernetes Configuration:

yaml
livenessProbe:
  httpGet:
    path: api/health/liveness
    port: 3000
  initialDelaySeconds: 30
  periodSeconds: 10
  timeoutSeconds: 5
  failureThreshold: 3
  successThreshold: 1

Readiness Probe

Endpoint: GET api/health/readiness

Purpose: Determines if the application can handle incoming requests.

When to Use:

  • Kubernetes readiness probes
  • Load balancer health checks
  • Determining if pod should receive traffic
  • Rolling deployment coordination

Response:

json
{
  "status": "ready",
  "timestamp": 1234567890,
  "checks": {}
}

HTTP Status Codes:

  • 200 OK - Application is ready to serve traffic
  • 503 Service Unavailable - Application is not ready (remove from load balancer)

Kubernetes Configuration:

yaml
readinessProbe:
  httpGet:
    path: api/health/readiness
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 5
  timeoutSeconds: 3
  failureThreshold: 3
  successThreshold: 1

Startup Probe

Endpoint: GET api/health/startup

Purpose: Indicates that the application has completed its initialization.

When to Use:

  • Kubernetes startup probes
  • Applications with long startup times
  • Preventing premature liveness/readiness checks
  • Initial health verification

Response:

json
{
  "status": "started",
  "timestamp": 1234567890
}

HTTP Status Codes:

  • 200 OK - Application has started successfully
  • 503 Service Unavailable - Application is still starting

Kubernetes Configuration:

yaml
startupProbe:
  httpGet:
    path: api/health/startup
    port: 3000
  initialDelaySeconds: 0
  periodSeconds: 5
  timeoutSeconds: 3
  failureThreshold: 30
  successThreshold: 1

Kubernetes Integration

Complete Deployment Example

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nuxt-app
  labels:
    app: nuxt-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nuxt-app
  template:
    metadata:
      labels:
        app: nuxt-app
    spec:
      containers:
      - name: nuxt-app
        image: your-registry/nuxt-app:latest
        ports:
        - containerPort: 3000
          name: http
        
        # Startup probe - runs first
        startupProbe:
          httpGet:
            path: api/health/startup
            port: 3000
          initialDelaySeconds: 0
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 30  # 30 * 5s = 150s max startup time
          successThreshold: 1
        
        # Liveness probe - restarts pod if fails
        livenessProbe:
          httpGet:
            path: api/health/liveness
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
          timeoutSeconds: 5
          failureThreshold: 3  # Restart after 3 failures
          successThreshold: 1
        
        # Readiness probe - removes from service if fails
        readinessProbe:
          httpGet:
            path: api/health/readiness
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 5
          timeoutSeconds: 3
          failureThreshold: 3  # Remove from service after 3 failures
          successThreshold: 1
        
        resources:
          requests:
            memory: "256Mi"
            cpu: "250m"
          limits:
            memory: "512Mi"
            cpu: "500m"

Probe Execution Order

  1. Startup probe runs first and disables liveness/readiness probes
  2. Once startup succeeds, liveness and readiness probes begin
  3. Liveness probe continues checking if app is alive
  4. Readiness probe continues checking if app can serve traffic
txt
Application Start

Startup Probe (running)
    ├─ Success → Enable other probes
    └─ Failure → Kill and restart pod

Liveness Probe (running)
    ├─ Success → Continue
    └─ Failure → Restart pod

Readiness Probe (running)
    ├─ Success → Add to service endpoints
    └─ Failure → Remove from service endpoints

Application Running

Docker Compose Integration

Health checks work with Docker Compose too:

yml
version: '3.8'

services:
  nuxt-app:
    build: .
    ports:
      - "3000:3000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000api/health/liveness"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s
    restart: unless-stopped
    environment:
      - NODE_ENV=production
      - API_URL=https://api.example.com
    deploy:
      replicas: 2

External Resources

Developed with ❤️ by the DCC. Documentation released under the MIT License.