
Banyak orang mengetahui Kong adalah tools API Gateway untuk menyaring dan meneruskan trafik yang masuk ke dalam suatu sistem. Dalam beberapa tahun ke belakang, Kong merilis beberapa fitur seperti native support GRPC, mengelola browser session, Kubernetes Ingress Controller dan masih banyak lagi :D. Artikel ini tidak akan membahas semua fitur Kong tersebut, sebab ini blog saya pribadi bukan halaman ofisial dokumentasi Kong :p karena sebagian besar blog ini berisi beberapa artikel pengalaman saya mengelola Kubernetes, mari kita mulai pembahasan implementasi Kubernetes Ingres Controller menggunakan Kong 🙂
Install Kong Kubernetes Ingress Controller mode DB-less menggunakan Helm atau dengan cara lain yang Anda suka. Berikut beberapa konfigurasi penting yang perlu kita deklarasikan pada Helm values.
env:
real_ip_header: x-forwarded-for
trusted_ips: 0.0.0.0/0,::/0
ingressController:
enabled: true
installCRDs: false
proxy:
externalTrafficPolicy: Local
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: tcp
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*'
service.beta.kubernetes.io/aws-load-balancer-type: nlb
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
➜ kong helm -n kong install kong kong/kong -f values.yaml
NAME: kong
LAST DEPLOYED: Fri Oct 28 14:20:46 2022
NAMESPACE: kong
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To connect to Kong, please execute the following commands:
HOST=$(kubectl get svc --namespace kong kong-kong-proxy -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
PORT=$(kubectl get svc --namespace kong kong-kong-proxy -o jsonpath='{.spec.ports[0].port}')
export PROXY_IP=${HOST}:${PORT}
curl $PROXY_IP
Once installed, please follow along the getting started guide to start using
Kong: https://docs.konghq.com/kubernetes-ingress-controller/latest/guides/getting-started/
Agar Ingress berjalan menggunakan protokol HTTPS, gunakan cert-manager dan definisikan ClusterIssuer yang diintergrasikan dengan IngressClass Kong menggunakan Letsencrypt.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-kong
spec:
acme:
email: surat@bayuaji.id #please change this/this is an optional, but recommended setting
privateKeySecretRef:
name: letsencrypt-kong
server: https://acme-v02.api.letsencrypt.org/directory
solvers:
- http01:
ingress:
podTemplate:
metadata:
annotations:
kuma.io/sidecar-injection: "false" # If ingress is running in Kuma/Kong Mesh, disable sidecar injection
sidecar.istio.io/inject: "false" # If using Istio, disable sidecar injection
class: kong
Deploy workload deployment dan service Kubernetes menggunakan dummy image yang biasa Anda gunakan. Jika sudah, deploy workload Ingress dengan mencantumkan anotasi cert-manager dan beberapa konfigurasi Kong yang diperlukan.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo
annotations:
cert-manager.io/cluster-issuer: letsencrypt-kong
"konghq.com/protocols": "https"
"konghq.com/https-redirect-status-code": "308"
spec:
ingressClassName: kong
tls:
- secretName: letsencrypt-echo
hosts:
- echo.domain.abc
rules:
- host: echo.domain.abc
http:
paths:
- path: /foo
pathType: ImplementationSpecific
backend:
service:
name: echo
port:
number: 80
Hit subdomain yang Anda buat sampai anda mendapatkan respon status 200 dan menerima header balikan dari Kong.
➜ kong curl -i https://echo.domain.abc/foo
HTTP/2 200
content-type: text/plain; charset=UTF-8
date: Fri, 28 Oct 2022 07:46:39 GMT
server: echoserver
x-kong-upstream-latency: 1
x-kong-proxy-latency: 0
via: kong/3.0.0
Hostname: echo-588c888c78-j8rv2
Pod Information:
node name: ip-172-22-7-234.ap-southeast-1.compute.internal
pod name: echo-588c888c78-j8rv2
pod namespace: default
pod IP: 172.22.4.184
Server values:
server_version=nginx: 1.12.2 - lua: 10010
Request Information:
client_address=172.22.7.76
method=GET
real path=/foo
query=
request_version=1.1
request_scheme=http
request_uri=http://echo.domain.abc:8080/foo
Request Headers:
accept=*/*
connection=keep-alive
host=echo.domain.abc
user-agent=curl/7.64.1
x-forwarded-for=103.1.2.3
x-forwarded-host=echo.domain.abc
x-forwarded-path=/foo
x-forwarded-port=443
x-forwarded-proto=https
x-real-ip=103.1.2.3
Request Body:
-no body in request-
Sampai pada tahap ini, Anda sudah berhasil mengimplementasikan Kong sebagai Kubernetes Ingress Controller. Langkah berikutnya Anda bisa mengintegrasikan Ingress Controller dengan fitur API Gateway Kong seperti rate-limiting menggunakan Kong Plugin. Mari praktikan bersama kembali 🙂 Buat & install manifest berikut satu namespace dengan workload Ingress yang dibuat.
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
name: rate-limit
config:
minute: 60
policy: local
plugin: rate-limiting
Tambahkan annotation berikut pada workload Ingress agar Kong Plugin dapat digunakan.
konghq.com/plugins: rate-limit
Hit subdomain Anda sampai mendapatkan respon status 429 yang menandakan bahwa Anda sudah melampaui limit request yang server tetapkan.
➜ kong while sleep 0.01; do curl -s -o /dev/null -w "%{http_code}" https://echo.domain.abc/foo ; echo '\n' ; done
.
.
200
200
200
200
429
429
429
429
.
.
Kelebihan yang dimilikki Kong Plugin ini adalah Kong akan memberikan balikkan yang sangat informatif kepada pengguna seperti kuota hit yang masih bisa digunakan dan lama waktu anda diizinkan mengakses server tersebut.
➜ kong curl -I https://echo.domain.abc/foo
HTTP/2 200
content-type: text/plain; charset=UTF-8
x-ratelimit-remaining-minute: 58
x-ratelimit-limit-minute: 60
ratelimit-reset: 44
ratelimit-limit: 60
ratelimit-remaining: 58
date: Fri, 28 Oct 2022 08:33:16 GMT
server: echoserver
x-kong-upstream-latency: 1
x-kong-proxy-latency: 1
via: kong/3.0.0
Skenario di atas merupakan proteksi dasar rate-limit yang bisa Anda dapatkan pada Kong menggunakan metrics yang ditetapkan pada waktu tertentu. Anda mungkin bisa membatasi akses satu pengguna, Namun hal ini tidak membatasi pengguna lain untuk melakukan permintaan trafik yang bisa menyebabkan sistem Anda mengalami masalah. Kong memiliki advanced fitur rate-limit pada Enterprise subscription dengan menyematkan algoritma rate-limit yang lebih optimal untuk mengakomodir high scale production environment. Pemilihan Ingress Controller harus sesuai dengan kebutuhan. Pada akhirnya, Kong hanyalah satu dari sekian banyak opsi Ingress Controller yang bisa Anda gunakan. Pemetaan prioritas, budget, kapasitas sumber daya yang mengelola, dan kebutuhan bisnis adalah faktor yang harus kita pertimbangkan sebelum memutuskan untuk mengadopsi atau memilih suatu tools untuk diimplementasikan.