kubefwd Documentation

Bulk port forwarding Kubernetes services for local development.

RAW Doc

Chapter: getting-started (docs/getting-started.md)

Getting Started

This guide covers installation and your first steps with kubefwd. By the end, you'll have cluster services accessible locally by name.

Prerequisites

  • kubectl configured with access to a Kubernetes cluster
  • Root/sudo access (required for /etc/hosts and network interface modifications)

kubefwd reads your kubeconfig (~/.kube/config or KUBECONFIG environment variable) and connects directly to the Kubernetes API. It does not invoke kubectl.


Installation

=== "macOS"

text
Using [Homebrew](https://brew.sh/):

```bash
brew install kubefwd
```

To upgrade:

```bash
brew update && brew upgrade kubefwd
```

=== "Windows"

text
Using [winget](https://learn.microsoft.com/en-us/windows/package-manager/winget/):

```powershell
winget install txn2.kubefwd
```

Or using [Scoop](https://scoop.sh/):

```powershell
scoop install kubefwd
```

To upgrade:

```powershell
winget upgrade txn2.kubefwd
# or
scoop update kubefwd
```

!!! note "Run as Administrator"
    kubefwd requires elevated privileges on Windows to modify the hosts file. Right-click your terminal and select "Run as Administrator".

=== "Linux (Debian/Ubuntu)"

text
Download the `.deb` package from [GitHub Releases](https://github.com/txn2/kubefwd/releases/latest):

```bash
# Install
sudo dpkg -i kubefwd_*_amd64.deb

# Upgrade (same command)
sudo dpkg -i kubefwd_*_amd64.deb
```

=== "Linux (RHEL/Fedora)"

text
Download the `.rpm` package from [GitHub Releases](https://github.com/txn2/kubefwd/releases/latest):

```bash
# Install
sudo rpm -i kubefwd_*_amd64.rpm

# Upgrade
sudo rpm -U kubefwd_*_amd64.rpm
```

=== "Linux (Manual)"

text
Download and extract the tarball from [GitHub Releases](https://github.com/txn2/kubefwd/releases/latest):

```bash
tar -xzf kubefwd_Linux_amd64.tar.gz
sudo mv kubefwd /usr/local/bin/
sudo chmod +x /usr/local/bin/kubefwd
```

=== "Docker"

text
Run kubefwd in a privileged container:

```bash
docker run -it --rm --privileged \
    -v "$HOME/.kube:/root/.kube:ro" \
    txn2/kubefwd --tui
```

The container needs `--privileged` to modify network interfaces and the hosts file.

Verify installation:

bash
kubefwd version

Operating Modes

kubefwd supports two operating modes depending on how you want to work.

Start kubefwd without specifying namespaces. Add services interactively via TUI or programmatically via API.

bash
sudo -E kubefwd --tui

In Idle Mode:

  • REST API is enabled by default
  • Auto-reconnect is enabled by default
  • Use the TUI to browse namespaces, select services, and forward them
  • Or use the API to add services dynamically

This is the recommended mode for interactive development. You can explore what's available in your cluster and forward exactly what you need.

Classic Mode

Specify namespaces upfront. All services in those namespaces are forwarded immediately.

bash
sudo -E kubefwd svc -n default --tui

Or without TUI for scripting:

bash
sudo -E kubefwd svc -n default

Classic mode is backwards-compatible with all previous kubefwd versions. Add --tui, --api, or -a (auto-reconnect) as needed.


Your First Forward

  1. Start kubefwd in Idle Mode:

    bash
    sudo -E kubefwd --tui
  2. Browse namespaces: Press f to open the service browser, then select a namespace.

  3. Forward services: Select individual services or press a to forward all services in the namespace.

  4. Use your services: They're now accessible by name:

    bash
    curl http://my-api:8080/health
    psql -h postgres -U admin -d mydb
    redis-cli -h redis ping
  5. Quit: Press q to exit. kubefwd cleans up automatically.

Quick Start (Classic Mode)

Forward all services in a namespace immediately:

bash
sudo -E kubefwd svc -n my-namespace --tui

You'll see the TUI with all services from my-namespace being forwarded.


What Happens Under the Hood

When kubefwd forwards a service:

  1. IP Allocation: Each service gets a unique loopback IP (e.g., 127.1.27.1, 127.1.27.2)

  2. Hosts File Update: Service names are added to /etc/hosts:

    text
    127.1.27.1    my-api
    127.1.27.2    postgres
    127.1.27.3    redis
  3. Port Forwarding: kubefwd creates port forwards to pods backing each service

  4. Ready to Use: Your applications can connect using service names, exactly like in-cluster

text
Your App โ†’ postgres:5432
         โ†“
/etc/hosts: postgres = 127.1.27.2
         โ†“
kubefwd listening on 127.1.27.2:5432
         โ†“
Kubernetes API โ†’ Pod in cluster

Unique IPs Solve Port Conflicts

Unlike kubectl port-forward which binds to a single port, kubefwd assigns each service its own IP address. This means:

  • Multiple databases on port 5432? No problem.
  • Multiple web services on port 80? Works fine.
  • Every service uses its real port, just like in-cluster.

Cleanup

When kubefwd exits (via q or Ctrl+C):

  • /etc/hosts entries are removed
  • Network interface aliases are cleaned up
  • All port forward connections are closed

Your original hosts file is backed up to ~/hosts.original for safety.


Why sudo -E?

kubefwd requires root privileges for:

  • Modifying /etc/hosts
  • Creating loopback IP aliases on the network interface
  • Binding to ports below 1024

The -E flag preserves your environment variables, especially KUBECONFIG:

bash
# Correct - preserves KUBECONFIG
sudo -E kubefwd --tui

# Wrong - may fail to find cluster config
sudo kubefwd --tui

Enabling the REST API

The REST API allows programmatic control of kubefwd and enables AI assistant integration via MCP.

Idle Mode (API enabled by default):

bash
sudo -E kubefwd
sudo -E kubefwd --tui

Classic Mode (add --api flag):

bash
sudo -E kubefwd svc -n default --api

The API is available at:

  • http://kubefwd.internal/api - REST endpoints
  • http://kubefwd.internal/docs - Interactive API documentation

See REST API Reference for endpoints and MCP Integration for AI assistant setup.


Common Commands

bash
# Idle mode with TUI (recommended for interactive use)
sudo -E kubefwd --tui

# Forward specific namespace with TUI
sudo -E kubefwd svc -n my-namespace --tui

# Forward multiple namespaces
sudo -E kubefwd svc -n frontend,backend,data --tui

# Forward with label selector
sudo -E kubefwd svc -n default -l app=myapp --tui

# Classic mode (no TUI, for scripts)
sudo -E kubefwd svc -n default

# Enable verbose logging
sudo -E kubefwd svc -n default -v

Next Steps

Chapter: index (docs/index.md)


title: kubefwd
template: home.html
hide:

  • navigation
  • toc
  • footer

Chapter: api-reference (docs/api-reference.md)

REST API

kubefwd's REST API enables programmatic control over port forwarding. Build custom tooling, integrate with CI/CD pipelines, or create dashboards that dynamically manage which services are forwarded. Add and remove namespaces or individual services on the fly, query real-time metrics, stream events via SSE, and diagnose connection issues without restarting kubefwd.

Quick Start

bash
# Idle mode - API enabled by default, add namespaces dynamically
sudo -E kubefwd

# Or forward a namespace with API enabled
sudo -E kubefwd svc -n default --api

# Test the API
curl http://kubefwd.internal/api/health

The API is available at http://kubefwd.internal/api.

Interactive documentation is at http://kubefwd.internal/docs.

Overview

Property Value
Base URL http://kubefwd.internal/api
Authentication Bearer token (all endpoints except /api/health)
Response Format JSON
OpenAPI Spec /openapi.yaml

All responses use this wrapper format:

json
{
  "success": true,
  "data": { ... },
  "error": null
}

Error responses:

json
{
  "success": false,
  "data": null,
  "error": {
    "code": "NOT_FOUND",
    "message": "Service not found"
  }
}

Authentication

Every endpoint except /api/health requires a Bearer token. Send it in the
Authorization header:

bash
curl http://kubefwd.internal/api/services \
  -H "Authorization: Bearer $KUBEFWD_API_KEY"

Requests with a missing or invalid key get 401 Unauthorized:

json
{
  "success": false,
  "data": null,
  "error": {
    "code": "UNAUTHORIZED",
    "message": "API key required. Pass via Authorization: Bearer <key>"
  }
}

Getting the key

kubefwd resolves the key at startup from the KUBEFWD_API_KEY environment
variable. If that variable is unset, it generates a random 32-character hex key
and prints the full key to the console when the server starts (this is the
only way to learn a generated key):

text
API key (generated): 8f3c2a1b9d4e6f70a1b2c3d4e5f60718
Set KUBEFWD_API_KEY to pin your own key instead.

To pin a known key โ€” recommended for automation, CI, or the MCP bridge โ€”
set the variable before launching:

bash
export KUBEFWD_API_KEY=my-known-key
sudo -E kubefwd --api

When you supply the key this way, kubefwd does not echo it to the console โ€”
it only logs that the key was read from KUBEFWD_API_KEY, since you already
know its value:

text
API key: using KUBEFWD_API_KEY from environment

The API binds to a loopback address (127.2.27.1) and is only reachable from
localhost, but the token is still required: any local process could otherwise
drive kubefwd against your kubeconfig (it runs as root via sudo -E).

Note: The curl examples below omit the Authorization header for
readability. Add -H "Authorization: Bearer $KUBEFWD_API_KEY" to every
request except /api/health.


Health & Info

GET /api/health

Health check endpoint.

bash
curl http://kubefwd.internal/api/health
json
{
  "status": "healthy",
  "timestamp": "2025-01-15T10:30:00Z"
}

GET /api/info

Server information and version.

bash
curl http://kubefwd.internal/api/info
json
{
  "version": "1.26.0",
  "uptime": "2h15m30s",
  "startedAt": "2025-01-15T08:15:00Z"
}

Services

GET /api/v1/services

List all forwarded services.

Query Parameters:

Parameter Type Description
namespace string Filter by namespace
context string Filter by context
status string Filter by status (active, error)
bash
# List all services
curl http://kubefwd.internal/api/v1/services

# Filter by namespace
curl http://kubefwd.internal/api/v1/services?namespace=default

GET /api/v1/services/:key

Get a specific service. Key format: service-name.namespace.context

bash
curl http://kubefwd.internal/api/v1/services/api-gateway.default.minikube

POST /api/v1/services

Add a new service to forward.

bash
curl -X POST http://kubefwd.internal/api/v1/services \
  -H "Content-Type: application/json" \
  -d '{
    "namespace": "default",
    "service_name": "my-service",
    "context": "minikube"
  }'

DELETE /api/v1/services/:key

Stop forwarding a service.

bash
curl -X DELETE http://kubefwd.internal/api/v1/services/my-service.default.minikube

POST /api/v1/services/:key/reconnect

Reconnect a specific service.

bash
curl -X POST http://kubefwd.internal/api/v1/services/api-gateway.default.minikube/reconnect

POST /api/v1/services/:key/sync

Sync service with Kubernetes (refresh pods).

bash
curl -X POST http://kubefwd.internal/api/v1/services/api-gateway.default.minikube/sync

POST /api/v1/services/reconnect

Reconnect all services (or all errored services).

bash
# Reconnect all errored services
curl -X POST http://kubefwd.internal/api/v1/services/reconnect

# Force reconnect all services
curl -X POST "http://kubefwd.internal/api/v1/services/reconnect?force=true"

Forwards

Individual port forwards (a service may have multiple forwards for different pods/ports).

GET /api/v1/forwards

List all active port forwards.

Query Parameters:

Parameter Type Description
namespace string Filter by namespace
service string Filter by service name
status string Filter by status
bash
curl http://kubefwd.internal/api/v1/forwards

GET /api/v1/forwards/:key

Get details for a specific forward.

bash
curl http://kubefwd.internal/api/v1/forwards/api-gateway-pod-abc.default.minikube

GET /api/v1/forwards/:key/http

Get HTTP traffic captured for a forward.

Query Parameters:

Parameter Type Description
count integer Number of entries (default: 50)
bash
curl http://kubefwd.internal/api/v1/forwards/api-gateway.default.minikube/http?count=10

Namespaces

Manage namespace watchers dynamically.

GET /api/v1/namespaces

List active namespace watchers.

bash
curl http://kubefwd.internal/api/v1/namespaces

GET /api/v1/namespaces/:key

Get details for a namespace watcher. Key format: namespace.context

bash
curl http://kubefwd.internal/api/v1/namespaces/default.minikube

POST /api/v1/namespaces

Add a namespace watcher (start forwarding all services in namespace).

bash
curl -X POST http://kubefwd.internal/api/v1/namespaces \
  -H "Content-Type: application/json" \
  -d '{
    "namespace": "staging",
    "context": "minikube"
  }'

DELETE /api/v1/namespaces/:key

Remove a namespace watcher (stop forwarding all services in namespace).

bash
curl -X DELETE http://kubefwd.internal/api/v1/namespaces/staging.minikube

Kubernetes Discovery

Query the Kubernetes cluster for available resources.

GET /api/v1/kubernetes/contexts

List available kubeconfig contexts.

bash
curl http://kubefwd.internal/api/v1/kubernetes/contexts

GET /api/v1/kubernetes/namespaces

List namespaces in a context.

Query Parameters:

Parameter Type Description
context string Kubernetes context (uses current if omitted)
bash
curl http://kubefwd.internal/api/v1/kubernetes/namespaces?context=minikube

GET /api/v1/kubernetes/services

List services in a namespace.

Query Parameters:

Parameter Type Description
namespace string Namespace (required)
context string Kubernetes context
bash
curl "http://kubefwd.internal/api/v1/kubernetes/services?namespace=default&context=minikube"

GET /api/v1/kubernetes/services/:namespace/:name

Get details for a specific Kubernetes service.

bash
curl http://kubefwd.internal/api/v1/kubernetes/services/default/api-gateway

GET /api/v1/kubernetes/pods/:namespace

List pods in a namespace with status, ready state, restarts, and age.

Query Parameters:

Parameter Type Description
context string Kubernetes context (uses current if omitted)
labelSelector string Filter pods by labels (e.g., "app=nginx")
serviceName string Filter to pods backing this service
bash
# List all pods in namespace
curl http://kubefwd.internal/api/v1/kubernetes/pods/default

# Filter by label
curl "http://kubefwd.internal/api/v1/kubernetes/pods/default?labelSelector=app=nginx"

# Filter by service
curl "http://kubefwd.internal/api/v1/kubernetes/pods/default?serviceName=api-gateway"

GET /api/v1/kubernetes/pods/:namespace/:podName

Get detailed pod information including containers, status, conditions, and resources.

bash
curl http://kubefwd.internal/api/v1/kubernetes/pods/default/api-gateway-7d4f5b6c8-abc12

GET /api/v1/kubernetes/pods/:namespace/:podName/logs

Get logs from a pod's container.

Query Parameters:

Parameter Type Description
context string Kubernetes context (uses current if omitted)
container string Container name (defaults to first container)
tailLines integer Lines from end (default: 100, max: 1000)
sinceTime string RFC3339 timestamp to start from
previous boolean Get logs from previous container instance
timestamps boolean Include timestamps in output
bash
# Get last 100 lines
curl http://kubefwd.internal/api/v1/kubernetes/pods/default/api-gateway-7d4f5b6c8-abc12/logs

# Get last 50 lines with timestamps
curl "http://kubefwd.internal/api/v1/kubernetes/pods/default/api-gateway-7d4f5b6c8-abc12/logs?tailLines=50&timestamps=true"

# Get logs from specific container
curl "http://kubefwd.internal/api/v1/kubernetes/pods/default/api-gateway-7d4f5b6c8-abc12/logs?container=sidecar"

GET /api/v1/kubernetes/events/:namespace

Get Kubernetes events for debugging. Shows scheduling, pulling, starting, and killing events.

Query Parameters:

Parameter Type Description
context string Kubernetes context (uses current if omitted)
resourceKind string Filter by kind (Pod, Service, Deployment)
resourceName string Filter by resource name
limit integer Max events to return (default: 50)
bash
# Get all events in namespace
curl http://kubefwd.internal/api/v1/kubernetes/events/default

# Filter to pod events
curl "http://kubefwd.internal/api/v1/kubernetes/events/default?resourceKind=Pod"

# Get events for specific pod
curl "http://kubefwd.internal/api/v1/kubernetes/events/default?resourceKind=Pod&resourceName=api-gateway-7d4f5b6c8-abc12"

GET /api/v1/kubernetes/endpoints/:namespace/:serviceName

Get endpoints for a service. Shows which pods are backing the service and their ready state.

bash
curl http://kubefwd.internal/api/v1/kubernetes/endpoints/default/api-gateway

Metrics

Traffic and performance metrics.

GET /api/v1/metrics

Summary metrics for all forwards.

bash
curl http://kubefwd.internal/api/v1/metrics
json
{
  "totalServices": 15,
  "activeForwards": 23,
  "totalBytesIn": 1048576,
  "totalBytesOut": 524288,
  "uptime": "2h15m"
}

GET /api/v1/metrics/services

Metrics grouped by service.

bash
curl http://kubefwd.internal/api/v1/metrics/services

GET /api/v1/metrics/services/:key

Detailed metrics for a specific service.

bash
curl http://kubefwd.internal/api/v1/metrics/services/api-gateway.default.minikube

GET /api/v1/metrics/services/:key/history

Historical metrics for a service (time series data).

Query Parameters:

Parameter Type Description
duration string Time window (e.g., "1h", "30m")
interval string Bucket interval (e.g., "1m", "5m")
bash
curl "http://kubefwd.internal/api/v1/metrics/services/api-gateway.default.minikube/history?duration=1h"

Diagnostics

Error analysis and troubleshooting.

GET /api/v1/diagnostics

Diagnostics summary.

bash
curl http://kubefwd.internal/api/v1/diagnostics

GET /api/v1/diagnostics/errors

List current errors.

bash
curl http://kubefwd.internal/api/v1/diagnostics/errors

GET /api/v1/diagnostics/services/:key

Diagnostics for a specific service.

bash
curl http://kubefwd.internal/api/v1/diagnostics/services/api-gateway.default.minikube

GET /api/v1/diagnostics/forwards/:key

Diagnostics for a specific forward.

bash
curl http://kubefwd.internal/api/v1/diagnostics/forwards/api-gateway.default.minikube

GET /api/v1/diagnostics/network

Network interface diagnostics.

bash
curl http://kubefwd.internal/api/v1/diagnostics/network

Analysis

AI-friendly status and analysis endpoints.

GET /api/v1/status

Quick status overview optimized for AI tools.

bash
curl http://kubefwd.internal/api/v1/status
json
{
  "status": "healthy",
  "message": "All services forwarding normally",
  "totalServices": 15,
  "activeServices": 15,
  "errorCount": 0
}

GET /api/v1/analyze

Detailed analysis with recommendations.

bash
curl http://kubefwd.internal/api/v1/analyze

History

Event and error history.

GET /api/v1/history/events

Recent events.

Query Parameters:

Parameter Type Description
count integer Number of events (default: 50)
bash
curl http://kubefwd.internal/api/v1/history/events?count=20

GET /api/v1/history/errors

Error history.

bash
curl http://kubefwd.internal/api/v1/history/errors?count=20

GET /api/v1/history/reconnections

All reconnection events.

bash
curl http://kubefwd.internal/api/v1/history/reconnections

GET /api/v1/services/:key/history/reconnections

Reconnection history for a specific service.

bash
curl http://kubefwd.internal/api/v1/services/api-gateway.default.minikube/history/reconnections

GET /api/v1/history/stats

Aggregated history statistics.

bash
curl http://kubefwd.internal/api/v1/history/stats

Logs

Application logs.

GET /api/v1/logs

Recent log entries.

Query Parameters:

Parameter Type Description
count integer Number of entries (default: 100)
level string Filter by level (debug, info, warn, error)
service string Filter by service
bash
curl "http://kubefwd.internal/api/v1/logs?count=50&level=error"

GET /api/v1/logs/stream

Server-Sent Events (SSE) stream of logs.

bash
curl http://kubefwd.internal/api/v1/logs/stream

GET /api/v1/logs/system

System-level logs.

bash
curl http://kubefwd.internal/api/v1/logs/system

DELETE /api/v1/logs/system

Clear system logs.

bash
curl -X DELETE http://kubefwd.internal/api/v1/logs/system

Events (SSE)

GET /api/v1/events

Server-Sent Events stream for real-time updates.

bash
curl http://kubefwd.internal/api/v1/events

Event types:

  • service.added - New service started forwarding
  • service.removed - Service stopped forwarding
  • service.error - Service encountered an error
  • forward.connected - Port forward established
  • forward.disconnected - Port forward lost
  • pod.added - Pod added to service
  • pod.removed - Pod removed from service

Example event:

text
event: service.added
data: {"key":"api-gateway.default.minikube","namespace":"default","service":"api-gateway"}

HTTP Traffic

HTTP request/response capture for debugging.

GET /api/v1/services/:key/http

HTTP traffic for a service.

Query Parameters:

Parameter Type Description
count integer Number of entries (default: 50)
bash
curl http://kubefwd.internal/api/v1/services/api-gateway.default.minikube/http?count=10

Error Codes

Code Description
NOT_FOUND Resource not found
BAD_REQUEST Invalid request parameters
INTERNAL_ERROR Server error
ALREADY_EXISTS Resource already exists
CONFLICT Operation conflicts with current state

See Also