kubefwd

GitHub

Bulk port forwarding Kubernetes services for local development.

AI Prompts & Endpoints
MCP View CodeWiki Knowledge Base

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"

Using Homebrew:

bash
brew install kubefwd

To upgrade:

bash
brew update && brew upgrade kubefwd

=== "Windows"

Using winget:

powershell
winget install txn2.kubefwd

Or using Scoop:

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)"

Download the .deb package from GitHub Releases:

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

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

=== "Linux (RHEL/Fedora)"

Download the .rpm package from GitHub Releases:

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

# Upgrade
sudo rpm -U kubefwd_*_amd64.rpm

=== "Linux (Manual)"

Download and extract the tarball from GitHub Releases:

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

=== "Docker"

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

- User Guide - Master the interactive interface
- Configuration - All command-line options
- Advanced Usage - Multi-namespace, selectors, port mapping
- MCP Integration - AI assistant setup

Chapter: index (docs/index.md)

---
title: kubefwd
description: Bulk port forward Kubernetes services to unique loopback IPs with /etc/hosts integration. Interactive TUI, REST API, and MCP server for AI assistants.
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

- Getting Started - Installation and basic usage
- MCP Integration - AI assistant integration
- Configuration - CLI flags reference