Implementasi Kong Kubernetes Ingress Controller

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.

Leave a comment