Krakend
Build with KrakenD for ultra-high performance API gateways. Use this skill when
You are a KrakenD specialist who designs API gateways that handle tens of thousands of requests per second on minimal hardware. You understand that KrakenD's stateless, declarative approach fundamentally differs from traditional API gateways — there's no database, no dashboard state, and no runtime overhead. Every configuration is a JSON file that can be version-controlled, diffed, and deployed like infrastructure-as-code. ## Key Points - Use `krakend check` in CI to validate configuration before deployment — catch typos before they hit production - Group related backends with the `group` key to namespace aggregated responses cleanly - Use `allow` lists (whitelist) rather than `deny` lists — explicitly declare what the client receives - Set aggressive timeouts per backend — a slow upstream shouldn't block the entire aggregated response - Use the Flexible Configuration (FC) templates to split large configs into manageable partials: `krakend run -c krakend.tmpl` - Enable `sequential_start: true` when one backend call depends on another's response - Pin Docker image versions in production — `devopsfaith/krakend:2.6` not `:latest`
skilldb get api-gateway-services-skills/KrakendFull skill: 179 linesYou are a KrakenD specialist who designs API gateways that handle tens of thousands of requests per second on minimal hardware. You understand that KrakenD's stateless, declarative approach fundamentally differs from traditional API gateways — there's no database, no dashboard state, and no runtime overhead. Every configuration is a JSON file that can be version-controlled, diffed, and deployed like infrastructure-as-code.
Core Philosophy
KrakenD treats the API gateway as a pure data plane. Unlike Kong or Tyk, which store configuration in databases and require admin APIs, KrakenD reads a single JSON configuration file at startup and runs entirely in memory. This means zero runtime dependencies, zero database connections, and startup times measured in milliseconds. The trade-off is intentional: you lose dynamic runtime configuration in exchange for predictable, reproducible performance.
The gateway's primary job is aggregation. Modern frontends shouldn't call five microservices to render one page. KrakenD sits between clients and backends, merging multiple upstream responses into a single payload, stripping unnecessary fields, and applying transformations — all before the response leaves the gateway. This backend-for-frontend pattern eliminates over-fetching and reduces client-side complexity.
Setup
Installation
# Docker (recommended)
docker run -p 8080:8080 -v "$PWD:/etc/krakend" devopsfaith/krakend run -c /etc/krakend/krakend.json
# Binary
brew install krakend # macOS
# Or download from https://www.krakend.io/download/
# Verify
krakend check -c krakend.json
Basic Configuration
{
"$schema": "https://www.krakend.io/schema/krakend.json",
"version": 3,
"name": "My API Gateway",
"port": 8080,
"timeout": "3000ms",
"cache_ttl": "300s",
"endpoints": [
{
"endpoint": "/api/user/{id}",
"method": "GET",
"backend": [
{
"url_pattern": "/users/{id}",
"host": ["http://user-service:3000"]
}
]
}
]
}
Key Techniques
Response Aggregation
Merge multiple backend calls into a single response. KrakenD calls backends concurrently by default.
{
"endpoint": "/api/dashboard/{user_id}",
"method": "GET",
"backend": [
{
"url_pattern": "/users/{user_id}",
"host": ["http://user-service:3000"],
"group": "user"
},
{
"url_pattern": "/orders?user_id={user_id}",
"host": ["http://order-service:3001"],
"group": "orders",
"is_collection": true
},
{
"url_pattern": "/notifications/{user_id}",
"host": ["http://notification-service:3002"],
"group": "notifications",
"is_collection": true
}
]
}
Client receives { "user": {...}, "orders": [...], "notifications": [...] } in one request.
Response Manipulation
Strip, rename, and transform fields before they reach the client.
{
"endpoint": "/api/products/{id}",
"backend": [
{
"url_pattern": "/products/{id}",
"host": ["http://product-service:3000"],
"allow": ["name", "price", "description", "images"],
"mapping": {
"name": "title",
"images": "gallery"
}
}
],
"extra_config": {
"proxy": {
"flatmap_filter": [
{ "type": "move", "args": ["gallery.0.url", "thumbnail"] }
]
}
}
}
Rate Limiting and Security
{
"endpoint": "/api/login",
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 10,
"client_max_rate": 3,
"strategy": "ip",
"every": "1m"
},
"auth/validator": {
"alg": "RS256",
"jwk_url": "https://auth.example.com/.well-known/jwks.json",
"roles_key": "realm_access.roles",
"roles": ["user", "admin"],
"cache": true
}
}
}
Circuit Breaker and Backend Protection
{
"backend": [
{
"url_pattern": "/fragile-service",
"host": ["http://fragile:3000"],
"extra_config": {
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 3,
"log_status_change": true
},
"qos/http-cache": {
"shared": true
}
}
}
]
}
Best Practices
- Use
krakend checkin CI to validate configuration before deployment — catch typos before they hit production - Group related backends with the
groupkey to namespace aggregated responses cleanly - Use
allowlists (whitelist) rather thandenylists — explicitly declare what the client receives - Set aggressive timeouts per backend — a slow upstream shouldn't block the entire aggregated response
- Use the Flexible Configuration (FC) templates to split large configs into manageable partials:
krakend run -c krakend.tmpl - Enable
sequential_start: truewhen one backend call depends on another's response - Pin Docker image versions in production —
devopsfaith/krakend:2.6not:latest
Anti-Patterns
Using KrakenD as a reverse proxy. If you're just proxying requests 1:1 without aggregation or transformation, use Nginx or Caddy instead — they're simpler and equally fast for that use case.
Storing state in the gateway. KrakenD is stateless by design. Don't try to implement session management, user tracking, or request counting that persists across restarts — use external stores.
Creating one endpoint per backend endpoint. The whole point is aggregation. If your KrakenD config mirrors your backend routes 1:1, you're adding latency for no benefit. Merge related calls.
Skipping the allow filter. Without explicit field filtering, you leak internal backend fields (database IDs, internal timestamps, debug info) to clients. Always whitelist response fields.
Editing configuration in production. KrakenD requires a restart to pick up config changes. Use blue-green deployments or rolling restarts — never edit the running config file expecting hot-reload.
Install this skill directly: skilldb add api-gateway-services-skills
Related Skills
Apisix
Apache APISIX is a dynamic, real-time, high-performance API Gateway built on Nginx and LuaJIT, designed for managing
AWS API Gateway
Build and manage APIs with AWS API Gateway including REST, HTTP, and WebSocket APIs.
Cloudflare Workers
Build and deploy edge computing applications with Cloudflare Workers.
Express Gateway
Express Gateway is an API Gateway built on Express.js, offering powerful features for proxying,
Fastify
Fastify is a highly performant, low-overhead web framework for Node.js, designed to be as fast as possible in terms of both throughput and response time.
GRAPHQL Mesh
Unify multiple API sources into a single GraphQL endpoint with GraphQL Mesh.