Kong API Gateway — Kapsamlı Geliştirici Rehberi
Kong Gateway ile API geliştirme, güvenlik ve operasyon süreçleri için derinlemesine, uygulamaya dönük bir kaynak — temel kavramlar, eklentiler (plugin), dağıtım modelleri, Kubernetes entegrasyonu, özel eklenti geliştirme, performans ve üretim (production) desenlerini kapsar.
İçindekiler
- Giriş ve Mimari
- Temel Varlıklar (Entities)
- Dağıtım Modelleri
- Kurulum ve Hızlı Başlangıç
- Admin API
- Bildirimsel (Declarative) Yapılandırma ve decK
- Kubernetes Ingress Controller (KIC)
- Kimlik Doğrulama Eklentileri
- Trafik Kontrol Eklentileri
- Dönüştürme (Transformation) Eklentileri
- Loglama ve Gözlemlenebilirlik
- Yük Dengeleme ve Sağlık Kontrolleri
- Özel Eklenti Geliştirme (Lua)
- Güvenlik En İyi Uygulamaları
- Performans Ayarlama (Tuning)
- Üretim Desenleri (Patterns)
- CI/CD ve GitOps
- Sorun Giderme
- CLI ve Admin API Hızlı Referans
1. Giriş ve Mimari
Kong; NGINX ve OpenResty (NGINX + LuaJIT) üzerine inşa edilmiş, bulut-native ve platform bağımsız bir API Gateway‘dir. İstemciler ile arka uç (upstream) servisler arasında konumlanır ve kimlik doğrulama, hız sınırlama (rate limiting), dönüştürme, loglama, yük dengeleme ve trafik şekillendirme gibi ortak sorumlulukları mikroservislerin her birinde tekrar tekrar yazmak zorunda kalmadan merkezi biçimde ele alır.
1.1 Neden Gateway Kullanılır?
- Ayrıştırma (Decoupling): İstemciler backend servislerle asla doğrudan konuşmaz.
- Merkezi politika uygulaması: Kimlik doğrulama, hız sınırlama ve loglama her serviste tekrar edilmek yerine tek bir yerde yönetilir.
- Protokol dönüşümü: REST ↔ gRPC ↔ WebSocket ↔ TCP arası köprü kurulabilir.
- Kesintisiz evrim: Backend’leri değiştirmek, versiyonlamak veya ölçeklemek istemciyi etkilemez.
1.2 Üst Düzey Mimari
┌────────────────────┐
İstemci İstekleri ──▶│ Kong Gateway │
│ (OpenResty/NGINX) │
│ - Router │
│ - Plugin Pipeline │
│ - Load Balancer │
└─────────┬───────────┘
│
┌────────────────┼────────────────┐
▼ ▼ ▼
Upstream A Upstream B Upstream C
Kong’un istek yaşam döngüsü, NGINX/OpenResty fazlarını yansıtan fazlar üzerinden ilerler ve eklentiler bu fazlara bağlanır:
| Faz | Amaç |
|---|---|
certificate | SSL/TLS el sıkışmasını yönetir (SNI’ye göre sertifika seçimi) |
rewrite | Yönlendirme kararından önce isteği yeniden yazar |
access | Kimlik doğrulama, yetkilendirme, hız sınırlama — çoğu eklenti burada çalışır |
header_filter | Yanıt gönderilmeden önce header’ları değiştirir |
body_filter | Yanıt gövdesi parçalarını (chunk) değiştirir |
log | Fire-and-forget loglama, analitik |
Fazları anlamak, özel eklenti yazarken veya sıralarken kritiktir — yanıt gövdesini değiştiren bir eklenti access değil, body_filter fazını uygulamalıdır.
1.3 Kong Ürün Ailesi
- Kong Gateway (OSS/Enterprise) — self-hosted çalışan API gateway’in kendisi.
- Kong Konnect — Kong’un SaaS kontrol düzlemi (hosted yönetim, analitik, developer portal, servis kataloğu); self-hosted veya cloud-hosted data plane’leri yönetebilir.
- Kong Mesh / Kuma — Envoy üzerine kurulu servis mesh; east-west (servisler arası) trafiği yönetir, Kong Gateway’in north-south (istemci-servis) rolünü tamamlar.
- Kong Ingress Controller (KIC) — Kubernetes kaynaklarını (Ingress, CRD’ler) Kong yapılandırmasına çevirir.
- Insomnia — aynı şirketin API istemci/tasarım aracı; Kong arkasındaki API’leri test etmek için kullanışlıdır.
2. Temel Varlıklar (Entities)
Kong’daki her şey bir varlık olarak modellenir; Admin API, declarative YAML veya Kubernetes CRD’leri üzerinden yapılandırılır.
2.1 Service
Bir upstream API/mikroservisi temsil eder.
curl -i -X POST http://localhost:8001/services \
--data name=orders-service \
--data url=http://orders.internal:8080
2.2 Route
İsteklerin nasıl eşleştirileceğini ve bir Service’e nasıl yönlendirileceğini tanımlar (path, host, method, header, SNI’ye göre).
curl -i -X POST http://localhost:8001/services/orders-service/routes \
--data 'paths[]=/orders' \
--data name=orders-route \
--data strip_path=false
Önemli route alanları:
strip_path— eşleşen path önekinin, upstream’e proxy’lenmeden önce kaldırılıp kaldırılmayacağı.preserve_host— orijinalHostheader’ının upstream’inki yerine korunması.protocols—http,https,grpc,grpcs,tcp,tls,udp,ws,wssile sınırlama.path_handling— path birleştirme semantiği içinv0veyav1(özelliklestrip_pathile prefixli upstream path’leri birlikte kullanılırken önemlidir).
2.3 Upstream ve Target
Upstream, bir Target (backend IP:port girdileri) havuzunu temsil eden sanal bir hostname’dir; yük dengeleme ve sağlık kontrollerini mümkün kılar.
curl -i -X POST http://localhost:8001/upstreams --data name=orders-upstream
curl -i -X POST http://localhost:8001/upstreams/orders-upstream/targets \
--data target=10.0.0.11:8080 --data weight=100
curl -i -X POST http://localhost:8001/upstreams/orders-upstream/targets \
--data target=10.0.0.12:8080 --data weight=100
Ardından bir Service’in host alanını ham bir IP yerine upstream adına (orders-upstream) yönlendirin.
2.4 Consumer
Kong’un kimlik bilgisi (credential), ACL grubu ve hız sınırlama kotası bağlayabileceği bir API istemcisini (kullanıcı, uygulama veya iş ortağı) temsil eder.
curl -i -X POST http://localhost:8001/consumers --data username=mobile-app
2.5 Plugin
Bir davranışı (kimlik doğrulama, hız sınırlama, dönüştürme, loglama) bir Service, Route, Consumer’a veya global olarak ekler.
curl -i -X POST http://localhost:8001/services/orders-service/plugins \
--data name=rate-limiting \
--data config.minute=100 \
--data config.policy=local
Kapsam önceliği (en özelden en genele): Route + Consumer > Route > Service > Consumer > Global. Bu önceliği anlamak, belirli bir istek için hangi eklenti örneğinin gerçekten tetikleneceğini öngörmek açısından şarttır.
2.6 Certificate ve SNI
TLS sertifikaları ve bunlara bağlı Server Name Indication hostname’leri; edge’de SNI tabanlı yönlendirme ve TLS sonlandırma için kullanılır.
2.7 Vault (Enterprise / 3.x+)
Secret referansları ({vault://...}) sayesinde hassas yapılandırma değerlerini (API anahtarları, TLS anahtarları) Kong yapılandırmasında düz metin olarak tutmak yerine HashiCorp Vault, AWS Secrets Manager, GCP Secret Manager veya ortam değişkenlerinde saklayabilirsiniz.
2.8 Varlık İlişki Diyagramı (Kavramsal)
Consumer ──credential──▶ (key-auth / jwt / oauth2 / basic-auth / hmac / mtls)
Consumer ──üyedir──────▶ ACL Grubu
Service ──çoklu içerir▶ Route
Service ──çoklu içerir▶ Plugin
Route ──çoklu içerir▶ Plugin
Service ──işaret eder─▶ Upstream ──çoklu içerir──▶ Target
3. Dağıtım Modelleri
3.1 Geleneksel (DB Destekli)
Kong node’ları yapılandırmayı PostgreSQL‘den okur/yazar. Admin API üzerinden sık sık dinamik değişiklik gerektiren senaryolarda (self-servis developer portal, sık consumer/plugin değişimi) uygundur.
- Artıları: tam dinamik, Admin API yazma işlemleri küme genelinde anında etkili olur.
- Eksileri: DB bir bağımlılıktır; yükseltmede migration (
kong migrations up/finish) gerektirir.
3.2 DB’siz (Declarative)
Kong tüm yapılandırmasını başlangıçta statik bir YAML/JSON dosyasından (kong.yml) yükler veya Admin API’nin /config endpoint’i üzerinden alır. Veritabanı gerekmez.
- Artıları: GitOps’a uygun, immutable altyapı, daha hızlı başlangıç, DB operasyon yükü yok.
- Eksileri: Admin API varlıklar için salt okunur hale gelir (kısmi PATCH yerine
/config‘e tam bir yenisiylePOSTyaparsınız).
Bu, günümüzde çoğu ekip için önerilen varsayılan yaklaşımdır — özellikle decK ile birlikte kullanıldığında (bkz. Bölüm 6).
3.3 Hibrit Mod (Control Plane / Data Plane Ayrımı)
- Control Plane (CP): Yapılandırmayı PostgreSQL’de saklar, Admin API’yi sunar, yapılandırmayı mTLS websocket bağlantısı üzerinden data plane’lere iter.
- Data Plane (DP): Stateless, DB’siz, yalnızca trafiği proxy’ler — doğrudan DB veya Admin API erişimi yoktur, yapılandırmayı sadece CP’den alır.
Faydaları: DP’ler her biri DB bağlantısına ihtiyaç duymadan yatayda ölçeklenebilir ve trafiğe yakın (çok bölgeli) dağıtılabilir; sadece CP hassas kimlik bilgilerine dokunduğu için saldırı yüzeyi azalır.
┌───────────────┐
│ Control Plane │──── Postgres
│ (Admin API) │
└───────┬───────┘
mTLS üzerinden websocket, config senkronizasyonu
┌────────────┼────────────┐
▼ ▼ ▼
DP (us-east) DP (eu-west) DP (ap-south)
3.4 Konnect (SaaS Control Plane)
Kong tarafından hosted control plane; siz yalnızca data plane’leri (self-hosted veya Kong-hosted “Serverless”) çalıştırırsınız; yapılandırma, analitik ve developer portal yönetimini Konnect’in UI/API/Terraform provider’ı üzerinden yaparsınız.
4. Kurulum ve Hızlı Başlangıç
4.1 Docker (DB’siz, en hızlı yol)
mkdir -p ~/kong-declarative
cat > ~/kong-declarative/kong.yml << 'EOF'
_format_version: "3.0"
services:
- name: example-service
url: https://httpbin.org
routes:
- name: example-route
paths:
- /example
EOF
docker run -d --name kong \
-v ~/kong-declarative:/kong/declarative \
-e "KONG_DATABASE=off" \
-e "KONG_DECLARATIVE_CONFIG=/kong/declarative/kong.yml" \
-e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
-e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
-e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
-e "KONG_ADMIN_LISTEN=0.0.0.0:8001" \
-p 8000:8000 -p 8443:8443 -p 8001:8001 \
kong:3.7
Test edin:
curl http://localhost:8000/example/get
4.2 Docker Compose (DB destekli, dinamik Admin API ile lokal geliştirme için)
version: "3.8"
services:
kong-database:
image: postgres:15
environment:
POSTGRES_USER: kong
POSTGRES_DB: kong
POSTGRES_PASSWORD: kongpass
volumes:
- kong_data:/var/lib/postgresql/data
kong-migrations:
image: kong:3.7
command: kong migrations bootstrap
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kongpass
depends_on:
- kong-database
kong:
image: kong:3.7
environment:
KONG_DATABASE: postgres
KONG_PG_HOST: kong-database
KONG_PG_PASSWORD: kongpass
KONG_PROXY_ACCESS_LOG: /dev/stdout
KONG_ADMIN_ACCESS_LOG: /dev/stdout
KONG_PROXY_ERROR_LOG: /dev/stderr
KONG_ADMIN_ERROR_LOG: /dev/stderr
KONG_ADMIN_LISTEN: 0.0.0.0:8001
ports:
- "8000:8000"
- "8443:8443"
- "8001:8001"
depends_on:
- kong-migrations
volumes:
kong_data: {}
4.3 Helm (Kubernetes)
helm repo add kong https://charts.konghq.com
helm repo update
helm install kong kong/kong \
--namespace kong --create-namespace \
--set ingressController.installCRDs=false \
--set admin.enabled=true
5. Admin API
Admin API (varsayılan port 8001) Kong’un kontrol yüzeyidir. Her varlığın bir REST kaynağı vardır.
5.1 Temel Endpoint’ler
# Service oluşturma
curl -X POST :8001/services -d name=svc -d url=http://backend:80
# Service listeleme
curl :8001/services
# Güncelleme (kısmi PATCH)
curl -X PATCH :8001/services/svc -d url=http://backend:8081
# Silme
curl -X DELETE :8001/services/svc
# İç içe oluşturma (bir service altında route)
curl -X POST :8001/services/svc/routes -d 'paths[]=/api'
# Global olarak bir eklenti etkinleştirme
curl -X POST :8001/plugins -d name=prometheus
# Uygulamadan önce yapılandırmayı doğrulama (şema kontrolü)
curl -X POST :8001/schemas/plugins/validate -d name=rate-limiting -d config.minute=10
5.2 Admin API’yi Güvenli Hale Getirme
8001 portunu asla açık internete maruz bırakmayın. Üretimde:
- Admin API’yi
127.0.0.1‘e veya yalnızca dahili bir ağ arayüzüne bağlayın (bind). - Kendi kimlik doğrulaması (mTLS, IP allowlist) olan bir VPN, bastion veya dahili load balancer’ın arkasına koyun.
- Hibrit/Konnect modunda data plane’lerin zaten Admin API erişimine ihtiyacı yoktur — erişimi yalnızca control plane’lerle sınırlayın.
- Hangi ekibin hangi varlıkları değiştirebileceğini sınırlamak için RBAC (Kong Enterprise) kullanmayı düşünün.
5.3 Admin API ile kong.conf Farkı
Çalışma zamanı varlıkları (service, route, plugin) Admin API veya declarative config üzerinden yönetilir. Node seviyesi ayarlar (worker süreç sayısı, listen adresleri, log seviyeleri, plugin allowlist) kong.conf içinde veya KONG_* ortam değişkenlerinde tanımlanır ve reload/restart gerektirir.
6. Bildirimsel (Declarative) Yapılandırma ve decK
6.1 Neden decK
decK (deck), Kong yapılandırmasını kod olarak yönetmek için kullanılan CLI aracıdır — çalışan bir Kong (veya Konnect) örneğine karşı kong.yml dosyalarını diff’ler, senkronize eder ve doğrular. Kong için GitOps iş akışlarının belkemiğidir.
# Mevcut durumu bir dosyaya aktar
deck gateway dump -o kong.yml
# Lokal dosyayı canlı Kong ile karşılaştır
deck gateway diff -s kong.yml
# Lokal dosyayı uygula (eşleşecek şekilde oluşturur/günceller/siler)
deck gateway sync -s kong.yml
# Yalnızca sözdizimi/şema doğrulaması, ağ çağrısı yok
deck file validate -s kong.yml
# Özel kural kümelerine (naming convention, zorunlu tag vb.) göre lint
deck file lint -s kong.yml -r ruleset.yml
6.2 Örnek kong.yml
_format_version: "3.0"
_transform: true
services:
- name: catalog-service
url: http://catalog.internal:8080
tags: [team-catalog, prod]
routes:
- name: catalog-route
paths: ["/catalog"]
strip_path: false
plugins:
- name: rate-limiting
config:
minute: 300
policy: local
- name: key-auth
config:
key_names: ["apikey"]
consumers:
- username: partner-a
keyauth_credentials:
- key: "abc123-partner-a"
acls:
- group: partners
acls: []
upstreams:
- name: catalog-upstream
algorithm: round-robin
healthchecks:
active:
http_path: /health
healthy:
interval: 5
successes: 2
unhealthy:
interval: 5
http_failures: 3
targets:
- target: 10.0.1.10:8080
weight: 100
- target: 10.0.1.11:8080
weight: 100
6.3 decK En İyi Uygulamaları
- Ortam başına bir
kong.ymltutun (veyadeck file mergeile birden fazla dosyaya bölün). - Her varlıkta
tagskullanın — paylaşılan Kong kümelerinde seçmeli senkronizasyonu (deck gateway sync --select-tag=team-catalog) mümkün kılar. deck gateway syncçalıştırmadan önce CI’da PR kontrolü olarakdeck gateway diffçalıştırın — asla kör senkronizasyon yapmayın.- Secret’ları versiyonlanmış
kong.ymliçinde düz metin yerine Vault referansı ({vault://env/API_KEY}) olarak saklayın. - Mevcut bir OpenAPI spesifikasyonundan doğrudan Kong yapılandırması oluşturmak için
deck file openapi2kongkullanın.
7. Kubernetes Ingress Controller (KIC)
KIC, Kubernetes kaynaklarını izler ve bunları otomatik olarak Kong yapılandırmasına çevirir — K8s ortamında manuel Admin API çağrısına gerek kalmaz.
7.1 Standart Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: orders-ingress
annotations:
konghq.com/strip-path: "true"
labels:
konghq.com/plugins: rate-limit-orders
spec:
ingressClassName: kong
rules:
- http:
paths:
- path: /orders
pathType: Prefix
backend:
service:
name: orders-svc
port:
number: 80
7.2 Kong CRD’leri
Kong, düz Ingress’in ifade edemediği yetenekler için Kubernetes’i Custom Resource Definition’larla genişletir:
| CRD | Amaç |
|---|---|
KongPlugin / KongClusterPlugin | Bir plugin yapılandırması tanımlar, annotation veya label ile bağlanır |
KongConsumer | Bir K8s kimliğini Kong Consumer’ına eşler |
KongIngress | Ayrıntılı routing/upstream yapılandırması (legacy, büyük ölçüde yerini aldı) |
KongCredential | Kimlik bilgilerini (key-auth, jwt vb.) bir KongConsumer‘a bağlar |
TCPIngress / UDPIngress | HTTP olmayan TCP/UDP trafiğini yönlendirir |
KongVault | Harici secret backend’lerine referans verir |
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: rate-limit-orders
plugin: rate-limiting
config:
minute: 100
policy: local
---
apiVersion: v1
kind: Service
metadata:
name: orders-svc
annotations:
konghq.com/plugins: rate-limit-orders
apiVersion: configuration.konghq.com/v1
kind: KongConsumer
metadata:
name: mobile-app
annotations:
kubernetes.io/ingress.class: kong
username: mobile-app
credentials:
- mobile-app-apikey
---
apiVersion: v1
kind: Secret
metadata:
name: mobile-app-apikey
type: Opaque
stringData:
kongCredType: key-auth
key: mobile-secret-key
7.3 Gateway API Desteği
Modern KIC sürümleri, Ingress‘e alternatif olarak Kubernetes Gateway API‘yi (Gateway, HTTPRoute, TCPRoute, GRPCRoute) destekler — K8s ekosisteminin daha ifade gücü yüksek, taşınabilir trafik yönlendirmesi (header eşleştirme, canary için ağırlıklı backend’ler, namespace’ler arası routing) için yöneldiği doğrultudur.
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: orders-route
spec:
parentRefs:
- name: kong
rules:
- matches:
- path: { type: PathPrefix, value: /orders }
backendRefs:
- name: orders-svc
port: 80
weight: 90
- name: orders-svc-canary
port: 80
weight: 10
8. Kimlik Doğrulama Eklentileri
8.1 Key Authentication
En basit yöntem — istemciler bir header, query parametresi veya body içinde API anahtarı gönderir.
curl -X POST :8001/services/svc/plugins -d name=key-auth -d config.key_names=apikey
curl -X POST :8001/consumers/alice/key-auth -d key=alice-secret-key
İstemci çağrısı: curl -H "apikey: alice-secret-key" https://api.example.com/svc
8.2 JWT
Kong, istek başına harici bir auth sunucusuna çağrı yapmadan, istemcinin issuer’ı tarafından imzalanmış bir JWT’yi (RS256/HS256) doğrular.
curl -X POST :8001/services/svc/plugins -d name=jwt
curl -X POST :8001/consumers/alice/jwt \
-d algorithm=RS256 \
-d rsa_public_key="$(cat pubkey.pem)"
Not: Kong’un jwt eklentisi imza/geçerlilik süresini doğrular — bir OIDC sağlayıcısının introspection endpoint’ini çağırmaz. Token introspection içeren tam OAuth2/OIDC akışları için bunun yerine OpenID Connect eklentisini (Enterprise) kullanın.
8.3 OAuth2
OAuth2 çerçevesini doğrudan Kong içinde uygular (authorization code, client credentials, implicit, password grant’ler).
curl -X POST :8001/services/svc/plugins -d name=oauth2 \
-d config.enable_authorization_code=true \
-d config.scopes=read,write
Çoğu modern kurulumda ekipler, OAuth2/OIDC’yi harici bir IdP’de (Auth0, Okta, Keycloak) sonlandırıp token doğrulama, discovery/introspection/JWKS işlemleri için Kong’un OpenID Connect eklentisini kullanmayı tercih eder.
8.4 Basic Auth / LDAP / HMAC / mTLS
basic-auth: HTTP Basic üzerinden kullanıcı adı/şifre — dahili/servisler arası senaryolar için uygundur, TLS olmadan genel API’ler için değil.ldap-auth: LDAP dizinine karşı kimlik doğrulama (kurumsal SSO senaryoları).hmac-auth: imza tabanlı kimlik doğrulama (istemci isteği paylaşılan bir secret ile imzalar) — güçlü bütünlük garantisi sağlar, webhook/partner entegrasyonlarında yaygındır.mtls-auth: karşılıklı TLS; istemci sertifikası Consumer’ı belirler — en güçlü seçenektir, zero-trust/servis mesh’e yakın mimarilerde yaygındır.
8.5 Çoklu Kimlik Doğrulama Deseni (OR Mantığı)
Aynı route’ta hem key-auth hem de JWT’yi ya-ya da mantığıyla kabul etmek için her iki eklentiyi de uygulayıp her birinde config.anonymous‘u ortak bir anonim consumer’a ayarlayın. Kong 3.x’te native anonim consumer OR-auth zincirleme kullanın: her auth eklentisine aynı config.anonymous=<uuid> verilir; ilk eklenti başarısız olursa istek anonim olarak devam eder ve ikinci eklentiye gerçek bir kimlik doğrulama şansı verilir — ikisi de başarısız olursa istek genellikle anonim grubu engelleyen bir ACL eklentisi tarafından reddedilir.
9. Trafik Kontrol Eklentileri
9.1 Rate Limiting (Hız Sınırlama)
curl -X POST :8001/services/svc/plugins -d name=rate-limiting \
-d config.minute=60 \
-d config.hour=1000 \
-d config.policy=redis \
-d config.redis.host=redis.internal
policy=local: sayaçlar her node’da bellekte tutulur — hızlıdır ama çok node’lu kümede tutarsızdır (her node kendi limitini bağımsız uygular).policy=cluster: paylaşılan sayaç olarak Kong veritabanını kullanır — doğrudur ama DB yükü ekler; DB’siz modda kullanılamaz.policy=redis: Redis’te paylaşılan sayaç — doğru global limitlere ihtiyaç duyan çok node’lu üretim dağıtımları için standart tercihtir.
Rate-limiting-advanced (Enterprise), sliding-window algoritmaları, eklenti örneği başına birden fazla limit ve maliyet tabanlı (cost-based) sınırlama ekler.
9.2 ACL (Erişim Kontrol Listeleri)
Route başına Consumer gruplarını whitelist/blacklist yapmak için herhangi bir auth eklentisiyle birleştirin.
curl -X POST :8001/consumers/alice/acls -d group=partners
curl -X POST :8001/routes/orders-route/plugins -d name=acl -d config.allow=partners
9.3 IP Restriction
curl -X POST :8001/services/svc/plugins -d name=ip-restriction \
-d config.allow=10.0.0.0/8 -d config.allow=203.0.113.5
9.4 Request Size Limiting
curl -X POST :8001/services/svc/plugins -d name=request-size-limiting \
-d config.allowed_payload_size=10
9.5 Proxy Caching
Cache edilebilir GET endpoint’leri için backend yükünü azaltmak amacıyla upstream yanıtlarını (method/status/vary bazında) önbelleğe alır.
curl -X POST :8001/services/svc/plugins -d name=proxy-cache \
-d config.content_type="application/json" \
-d config.cache_ttl=300 \
-d config.strategy=memory
9.6 Circuit Breaker Desenleri
Kong, “circuit breaker” adında birinci taraf bir eklenti sunmaz; ancak bu deseni şu yollarla sağlar:
- Upstream aktif/pasif sağlık kontrolleri — sağlıksız target’lara trafik yönlendirmeyi otomatik olarak durdurur (bkz. Bölüm 12).
- Enterprise
proxy-cache-advanced+request-termination— upstream çöktüğünde eski (stale) cache veya fallback yanıt sunar. - PDK ile geliştirilmiş üçüncü taraf/topluluk circuit-breaker eklentileri, özel hata eşiği mantığı için.
10. Dönüştürme (Transformation) Eklentileri
10.1 Request Transformer
curl -X POST :8001/routes/orders-route/plugins -d name=request-transformer \
-d config.add.headers=X-Request-Source:kong \
-d config.remove.headers=X-Internal-Debug \
-d config.rename.headers=X-Old-Name:X-New-Name
10.2 Response Transformer
curl -X POST :8001/routes/orders-route/plugins -d name=response-transformer \
-d config.remove.json=internal_id \
-d config.add.headers=X-Powered-By:Kong
10.3 Correlation ID
Dağıtık izleme (tracing) korelasyonu için istek başına benzersiz bir ID enjekte eder/yayar.
curl -X POST :8001/services/svc/plugins -d name=correlation-id \
-d config.header_name=X-Correlation-ID \
-d config.generator=uuid \
-d config.echo_downstream=true
10.4 gRPC Transcoding
grpc-gateway ve grpc-web eklentileri sırasıyla HTTP/JSON istemcilerinin gRPC backend’leriyle konuşmasına ve tarayıcı gRPC-Web istemcilerinin standart gRPC servisleriyle konuşmasına olanak tanır — dahili gRPC mikroservislerini yeniden yazmadan yalnızca REST destekleyen tüketicilere açmak istediğinizde kullanışlıdır.
11. Loglama ve Gözlemlenebilirlik
11.1 Prometheus Metrikleri
curl -X POST :8001/plugins -d name=prometheus \
-d config.status_code_metrics=true \
-d config.latency_metrics=true \
-d config.bandwidth_metrics=true
Admin API portu üzerinde (veya KONG_STATUS_LISTEN ile yapılandırılmış ayrı bir 8100 status portunda) GET /metrics‘i scrape edin. Önemli metrikler: kong_http_requests_total, kong_latency_bucket, kong_bandwidth_bytes, kong_upstream_target_health.
11.2 Yapılandırılmış Loglama
| Eklenti | Hedef |
|---|---|
file-log | Yerel dosya (JSON satırları) |
http-log | HTTP endpoint (log toplayıcınızın ingest API’si) |
tcp-log / udp-log | Syslog tarzı yönlendiriciler |
syslog | Yerel syslog |
datadog | Datadog metrikleri + logları |
zipkin / opentelemetry | Dağıtık izleme span’leri |
curl -X POST :8001/services/svc/plugins -d name=http-log \
-d config.http_endpoint=https://logs.example.com/ingest \
-d config.timeout=5000 \
-d config.keepalive=5000
11.3 OpenTelemetry
opentelemetry eklentisi, izleri (isteğe bağlı olarak log/metrikleri de) OTLP formatında herhangi bir OTel uyumlu backend’e (Jaeger, Tempo, Honeycomb, Datadog vb.) aktarır — yeni dağıtımlarda eski Zipkin eklentisinin yerini alan, dağıtık izleme için modern varsayılan seçenektir.
curl -X POST :8001/plugins -d name=opentelemetry \
-d config.endpoint=http://otel-collector:4318/v1/traces \
-d config.resource_attributes.service.name=kong-gateway
11.4 Dashboard’lar
Kong, Prometheus eklenti çıktısı için resmi Grafana dashboard’ları yayınlar — istek oranı, p99 gecikme, upstream sağlığı ve consumer bazlı kullanım izlenebilir. kong_upstream_target_health geçişleri ve 5xx oranı sıçramaları için alerting ile birlikte kullanın.
12. Yük Dengeleme ve Sağlık Kontrolleri
12.1 Yük Dengeleme Algoritmaları
| Algoritma | Davranış |
|---|---|
round-robin | Eşit döngü, target weight‘ine saygı gösterir |
consistent-hashing | IP, header, cookie veya query parametresi üzerinden hash — server-side session olmadan sticky routing |
least-connections | Trafiği en az aktif bağlantısı olan target’a gönderir |
curl -X PATCH :8001/upstreams/orders-upstream \
-d algorithm=consistent-hashing \
-d hash_on=header \
-d hash_on_header=X-Session-ID
12.2 Aktif Sağlık Kontrolleri
Kong, target’ları belirli aralıklarla proaktif olarak yoklar (probe).
curl -X PATCH :8001/upstreams/orders-upstream \
-d healthchecks.active.http_path=/health \
-d healthchecks.active.healthy.interval=5 \
-d healthchecks.active.healthy.successes=2 \
-d healthchecks.active.unhealthy.interval=5 \
-d healthchecks.active.unhealthy.http_failures=3 \
-d healthchecks.active.unhealthy.tcp_failures=3
12.3 Pasif Sağlık Kontrolleri
Kong gerçek proxy trafiğini gözlemler — bir target yeterli sayıda ardışık hata (5xx, timeout) döndürürse, özel bir probe olmadan sağlıksız olarak işaretlenir.
curl -X PATCH :8001/upstreams/orders-upstream \
-d healthchecks.passive.unhealthy.http_failures=5 \
-d healthchecks.passive.unhealthy.timeouts=3
En iyi uygulama: ikisini birden kullanın. Aktif kontroller, çökmüş bir target’ı canlı trafik almadan önce yakalar; pasif kontroller ise aktif probe’ların kaçırabileceği hataları yakalar (örn. /health sağlıklı görünse de gerçek API path’inin bozuk olması).
12.4 Kesintisiz Backend Değişimi
Yeni target’ı aynı veya daha yüksek weight ile ekleyin, sağlık/hata oranlarını izleyin, ardından eski target’ın weight’ini 0’a indirip kaldırın — herhangi bir route/service değişikliği veya istemci etkisi olmadan.
13. Özel Eklenti Geliştirme (Lua)
13.1 Eklenti Anatomisi
Bir Kong eklentisi, handler.lua (mantık) ve schema.lua (config doğrulama) içeren bir Lua modülüdür.
my-plugin/
├── kong/plugins/my-plugin/
│ ├── handler.lua
│ └── schema.lua
└── my-plugin-1.0.0-1.rockspec
schema.lua
return {
name = "my-plugin",
fields = {
{ config = {
type = "record",
fields = {
{ header_name = { type = "string", default = "X-My-Plugin" } },
{ header_value = { type = "string", required = true } },
},
},
},
},
}
handler.lua
local MyPluginHandler = {
PRIORITY = 1000, -- diğer eklentilere göre çalışma sırası
VERSION = "1.0.0",
}
function MyPluginHandler:access(conf)
kong.service.request.set_header(conf.header_name, conf.header_value)
end
function MyPluginHandler:header_filter(conf)
kong.response.set_header("X-Processed-By", "my-plugin")
end
return MyPluginHandler
13.2 Eklenti Önceliği (Priority)
PRIORITY bir tam sayıdır; aynı fazda daha yüksek olan önce çalışır. Yerleşik eklentilerden referans noktaları:
| Eklenti | Priority | Faz kaygısı |
|---|---|---|
pre-function | 1000000+ | Neredeyse her şeyden önce çalışır |
cors | 2000 | Preflight’ta header ayarlamak için auth’tan önce çalışmalı |
key-auth/jwt/oauth2 | ~1000-1200 | Kimlik doğrulama |
acl | ~950 | Auth’tan sonra, kimliği doğrulanmış consumer’a ihtiyaç duyar |
rate-limiting | ~900 | Auth’tan sonra, consumer bazlı limitler için consumer kimliğine ihtiyaç duyar |
request-transformer | ~800 | Auth/rate-limiting kararları verildikten sonra |
post-function | -1000000 | Neredeyse her şeyden sonra çalışır |
13.3 Plugin Development Kit (PDK)
PDK (kong.* namespace’i), eklentilerin ham NGINX/OpenResty API’lerine dokunmak yerine kullanması gereken kararlı API yüzeyidir — kong.request, kong.response, kong.service, kong.log, kong.client, kong.ctx, kong.vault. PDK kullanımı, eklentinizi Kong’un sürümler arası dahili değişikliklerinden izole eder.
13.4 Serverless Fonksiyonlar (Derlenmiş Eklenti Gerektirmez)
Tam bir eklenti paketlemeden hızlı mantık için, Admin API üzerinden istek anında satır içi Lua enjekte eden pre-function / post-function (OSS) veya serverless-functions (Enterprise, birden fazla dili destekler) eklentilerini kullanın.
curl -X POST :8001/routes/orders-route/plugins -d name=pre-function \
--data-urlencode 'config.access[1]=kong.service.request.set_header("X-Injected", "yes")'
13.5 Eklenti Testi
Kong, eklenti geliştiricileri için Docker tabanlı bir geliştirme/test ortamı olan Pongo‘yu sunar:
pongo run # tek kullanımlık Kong + bağımlılıklarını başlat
pongo lint # luacheck
pongo run spec/ # busted birim/entegrasyon testleri
14. Güvenlik En İyi Uygulamaları
- Admin API’yi kilitleyin — yalnızca dahili ağ, mTLS veya RBAC (bkz. 5.2). Bu, tek başına en yüksek etkiye sahip güvenlik kontrolüdür.
- Her yerde TLS — TLS’i Kong’da sonlandırın, genel route’larda
protocols: [https]zorunlu kılın, HTTP → HTTPS yönlendirmesi yapın. - Kimlik bilgilerini rotasyona sokun — key-auth anahtarları ve JWT imzalama anahtarları kesinti olmadan rotasyona sokulabilmelidir (yeni credential oluştur, istemcileri geçir, eskisini iptal et).
- Redis şifreleri, upstream kimlik bilgileri gibi eklenti config değerleri için
kong.ymlveya DB’de düz metin yerine Vault/secret manager kullanın. - En az ayrıcalık RBAC’ı (Enterprise) — workspace/varlık erişimini ekip bazında sınırlayın; her mühendise global Admin API hakkı vermeyin.
- Bozuk payload’ları upstream’e ulaşmadan reddetmek için request-validator eklentisiyle (JSON Schema/OpenAPI tabanlı istek doğrulama) doğrulama ve temizleme yapın.
- Dahili servislerde bile rate limiting ve IP restriction’ı savunma amaçlı uygulayın — ağ çevresinin er ya da geç ihlal edileceğini varsayın (zero-trust duruşu).
- Genel API’lerde scraping ve credential stuffing’i azaltmak için bot-detection / ip-restriction / referrer restriction eklentilerini etkinleştirin.
- Yapılandırma değişikliklerinin izlenebilir olması için audit logging kullanın (Enterprise Admin API audit log veya Admin API çağrılarını yakalayan bir
post-function). - Kong ve eklenti sürümlerini sabitleyin, yükseltmeden önce changelog’ları gözden geçirin — Kong düzenli olarak CVE düzeltmeleri yayınlar; güncel kalın ama önce staging’de test edin.
- Kong tarafından açıkça temizlenmediği/üzerine yazılmadığı sürece istemci tarafından sağlanan header’lara kimlik için güvenmeyin — Kong proxy’lemeden önce bunları temizlemezse bir saldırgan
X-Consumer-*tarzı header’ları taklit edebilir (Kong bunu kendi enjekte ettiği header’lar için varsayılan olarak yapar, ancak özel transformer yapılandırmalarında dikkatli olun).
15. Performans Ayarlama (Tuning)
15.1 Worker Süreçleri ve Bağlantılar
KONG_NGINX_WORKER_PROCESSES=auto
KONG_NGINX_WORKER_CONNECTIONS=16384
worker_processes‘i kullanılabilir CPU çekirdek sayısıyla eşleştirin (auto bunu otomatik yapar).
15.2 Veritabanı Önbelleği
DB destekli Kong, varlıkları paylaşımlı bellekte bir LRU cache’te tutar (mem_cache_size, varsayılan 128m) — küçük boyutlu cache’ler yük altında sık DB gidiş-dönüşlerine (cache miss) neden olur. Çok sayıda varlığı olan kümelerde bunu artırın.
KONG_MEM_CACHE_SIZE=512m
15.3 Ölçek için DB’siz/Hibrit
DB’siz data plane’ler, istek başına DB bağımlılığını tamamen ortadan kaldırır; bu, büyük ölçekte yüksek throughput ve düşük gecikmeli proxy’leme için tek başına en büyük kaldıraçtır — bu yüzden büyük üretim kümeleri için önerilen desen Hibrit moddur.
15.4 Eklenti Yükü (Overhead)
Etkinleştirilen her eklenti gecikme ekler. Kullanılmayan/global eklentileri düzenli olarak denetleyin. Mantığın evrensel olarak çalışmasına gerek yoksa, blanket global uygulama yerine eklentileri ihtiyaç duyan route/service’lere kapsamlandırmayı tercih edin. policy=redis ile rate-limiting istek başına bir ağ gidiş-dönüşü ekler — Redis’i Kong node’larına yakın konumlandırın veya mükemmel node’lar arası doğruluk gerekmiyorsa policy=local kullanın.
15.5 Keepalive ve Upstream Bağlantıları
Kong’un istek başına yeniden bağlanmak yerine backend bağlantılarını yeniden kullanması için upstream keepalive havuzlarını ayarlayın:
curl -X PATCH :8001/upstreams/orders-upstream \
-d 'keepalive_pool_size=60' \
-d 'keepalive_idle_timeout=60'
15.6 Yük Testi
k6, wrk veya hey ile gerçekçi, eklenti etkin bir yapılandırmaya karşı (çıplak passthrough değil) benchmark yapın — üretimde asıl önemli olan auth/rate-limiting overhead’idir, ham proxy baseline’ı değil.
16. Üretim Desenleri (Patterns)
16.1 API Versiyonlama
- URI versiyonlama: aynı veya farklı Service’lerde ayrı Route’lar olarak
/v1/orders,/v2/orders— en basit, en açık, deprecate etmesi en kolay yöntem. - Header versiyonlama:
Accept: application/vnd.company.v2+json, Route header koşullarıyla eşleştirilir — daha temiz URL’ler, daha karmaşık routing kuralları. - Eski ve yeni versiyonları ayrı Upstream’lere işaret eden ayrı Service’ler olarak çalıştırın; böylece v1’in backend’ini bağımsız olarak emekliye ayırabilirsiniz.
16.2 Canary / Blue-Green Dağıtımlar
Bir Upstream içindeki ağırlıklı target’lar, istemci tarafından görülebilir hiçbir değişiklik olmadan canary release’ler sağlar:
curl -X POST :8001/upstreams/orders-upstream/targets -d target=10.0.2.20:8080 -d weight=10 # canary, %10
curl -X PATCH :8001/upstreams/orders-upstream/targets/10.0.1.10:8080 -d weight=90 # stabil, %90
Güven arttıkça ağırlığı kademeli olarak canary target’a kaydırın; weight’i 0’a çekerek anında rollback yapın.
16.3 Backend-for-Frontend (BFF)
Her istemci türü için (/mobile/orders, /web/orders) ayrı Kong Service/Route’ları açığa çıkarın; her biri aynı veya farklı upstream kompozisyonuna işaret edebilir, her BFF yüzeyi için özel dönüştürme eklentileriyle (mobil için alan kırpma, web için genişletme) uyarlanabilir.
16.4 Çok Kiracılılık (Multi-Tenancy)
- Workspace’ler (Enterprise): tek bir Kong kümesi içinde ekip/kiracı başına yapılandırmayı mantıksal olarak izole eder, her biri kendi RBAC kapsamına sahiptir.
- Consumer Group’lar (OSS 3.x+): her consumer için eklenti örneğini çoğaltmadan, consumer segmentlerine farklılaştırılmış eklenti yapılandırması (örn. farklı rate limit’ler) uygular.
curl -X POST :8001/consumer_groups -d name=premium-tier
curl -X POST :8001/consumer_groups/premium-tier/consumers -d consumer=alice
curl -X POST :8001/consumer_groups/premium-tier/overrides/plugins/rate-limiting-advanced \
-d config.limit=10000 -d config.window_size=60
16.5 API Kompozisyonu / Agregasyon
Kong’un kendisi yanıt agregasyonu yapmaz (birden çok backend çağrısını tek bir yanıtta birleştirme) — bu bir BFF/GraphQL-gateway meselesidir. Bunu bir Kong eklentisine zorlamak yerine, Kong’u özel bir agregasyon katmanıyla (veya protokol köprüleme için grpc-gateway eklentisiyle) birlikte kullanın.
16.6 Edge’de İstek Doğrulama
Geçersiz istekleri upstream compute’unu tüketmeden reddetmek için JSON Schema veya OpenAPI spesifikasyonuyla request-validator kullanın — özellikle genel, yüksek hacimli API’ler için değerlidir.
17. CI/CD ve GitOps
17.1 Önerilen Pipeline
1. Geliştirici kong.yml'i düzenler (veya OpenAPI spec → deck file openapi2kong)
2. PR açılır → CI `deck file validate` + `deck file lint` çalıştırır
3. CI, staging'e karşı `deck gateway diff` çalıştırır → diff'i PR yorumu olarak paylaşır
4. main'e merge edildiğinde → CD, staging'e karşı `deck gateway sync` çalıştırır
5. Manuel/otomatik promosyon → production'a karşı `deck gateway sync` çalıştırır
17.2 Örnek GitHub Actions Adımı
- name: Kong config doğrulama
run: deck file validate -s kong.yml
- name: Staging'e karşı diff
run: deck gateway diff -s kong.yml --kong-addr https://staging-admin.internal:8001
- name: Staging'e senkronizasyon
if: github.ref == 'refs/heads/main'
run: deck gateway sync -s kong.yml --kong-addr https://staging-admin.internal:8001
17.3 Terraform (Konnect Provider)
Konnect tarafından yönetilen control plane’ler için resmi Terraform provider’ı (kong/konnect), control plane’leri, service’leri, route’ları ve eklentileri Terraform kaynağı olarak yönetmenizi sağlar — Kong yapılandırmasının diğer infrastructure-as-code ile birlikte yaşadığı durumlarda kullanışlıdır.
17.4 Güvenli Rollout Disiplini
- Senkronizasyondan önce her zaman diff alın — otomatik pipeline’larda bile asla kör senkronizasyon yapmayın (beklenmedik diff boyutu/kapsamında pipeline’ı başarısız kılın).
- Paylaşılan kümelerde tag-scope senkronizasyon (
--select-tag) kullanın; böylece bir ekibin pipeline’ı yanlışlıkla başka bir ekibin varlıklarını silemez. - Hızlıca senkronize edilebilir bir rollback
kong.yml‘i (önceki iyi durum) hazır tutun.
18. Sorun Giderme
| Belirti | Muhtemel Sebep | Çözüm |
|---|---|---|
no Route matched (404) | Path/host/method uyuşmazlığı, yanlış strip_path | GET /routes yapılandırmasını kontrol edin, LB arkasındaysanız X-Forwarded-* header’larıyla test edin |
| Eklenti tetiklenmiyor | Yanlış kapsam (yanlış service/route’a bağlı), devre dışı | Kapsamı ve enabled: true‘yu doğrulamak için GET /plugins?service.id= |
| Kong’dan 502/504 | Upstream’e ulaşılamıyor, timeout çok düşük, DNS çözümlemesi başarısız | upstream_connect_timeout‘u kontrol edin, Target sağlığını doğrulayın, Kong’un DNS resolver yapılandırmasını kontrol edin |
| Node’lar arası tutarsız rate limit | Çok node’lu kümede policy=local kullanılıyor | policy=redis veya cluster‘a geçin |
| Admin API değişiklikleri etkili olmuyor | DB’siz mod — Admin API varlıklar için salt okunur | Tam declarative payload ile POST /config yapın veya deck sync kullanın |
| Eklentilerin eklediği yüksek gecikme | Redis gidiş-dönüşü, yavaş harici HTTP log endpoint’i | Asenkron loglamaya geçin (http-log varsayılan olarak asenkrondur), Redis’i yakın konumlandırın, logları batch’leyin |
| SSL el sıkışma hataları | Yanlış SNI eşlemesi, eksik ara sertifika zinciri | GET /certificates ve GET /snis‘i kontrol edin, zinciri openssl s_client ile doğrulayın |
| Data plane control plane’e bağlanmıyor (Hibrit) | mTLS sertifika uyuşmazlığı, saat kayması, küme portunda ağ/firewall engeli | kong.conf‘ta cluster_cert/cluster_cert_key‘i kontrol edin, 8005/8006 portunun erişilebilir olduğunu doğrulayın |
Özel eklenti deploy sonrası Cannot invoke handler | Lua sözdizimi hatası, eklenti KONG_PLUGINS listesinde değil | kong.conf/env’de plugins = bundled,my-plugin‘i kontrol edin, error log’u inceleyin |
18.1 Kullanışlı Hata Ayıklama Komutları
kong config db_export # mevcut DB destekli yapılandırmayı dosyaya aktarır
kong check kong.yml # declarative dosya sözdizimini doğrular
kong health # lokal node'un temel sağlık kontrolü
curl :8001/status # node durumu: bağlantılar, bellek, DB erişilebilirliği
curl :8001/status/ready # readiness probe (K8s dostu)
19. CLI ve Admin API Hızlı Referans
# --- Kong CLI ---
kong start -c kong.conf
kong stop
kong reload -c kong.conf
kong migrations bootstrap # ilk kez DB kurulumu
kong migrations up # bekleyen migration'ları uygula
kong migrations finish # kesintisiz yükseltmeden sonra finalize et
kong version
# --- Admin API: Service & Route ---
curl :8001/services
curl :8001/routes
curl -X POST :8001/services -d name=x -d url=http://x:80
curl -X POST :8001/services/x/routes -d 'paths[]=/x'
# --- Admin API: Plugin ---
curl :8001/plugins
curl :8001/plugins/enabled # bu node'a derlenmiş eklentilerin listesi
curl -X POST :8001/plugins -d name=cors # global kapsam
# --- Admin API: Consumer & Credential ---
curl -X POST :8001/consumers -d username=bob
curl -X POST :8001/consumers/bob/key-auth -d key=bob-key
curl -X POST :8001/consumers/bob/acls -d group=default
# --- Admin API: Upstream & Target ---
curl :8001/upstreams
curl :8001/upstreams/my-upstream/health
curl -X POST :8001/upstreams/my-upstream/targets -d target=1.2.3.4:80
# --- decK ---
deck gateway dump -o kong.yml
deck gateway sync -s kong.yml
deck gateway diff -s kong.yml
deck file validate -s kong.yml
deck file openapi2kong -s openapi.yml -o kong.yml
# --- Node durumu ---
curl :8001/status
curl :8001/status/ready
Daha Fazla Kaynak
- Resmi dokümantasyon:
docs.konghq.com - Plugin Hub:
docs.konghq.com/hub - decK:
docs.konghq.com/deck - PDK referansı:
docs.konghq.com/gateway/latest/plugin-development/pdk - Kong Ingress Controller:
docs.konghq.com/kubernetes-ingress-controller
Bu rehber, Kong Gateway 3.x konvansiyonlarını yansıtır. Çalıştırdığınız sürüme göre eklenti/alan adlarını her zaman çapraz kontrol edin — isimler ve varsayılanlar ana sürümler arasında değişebilir.