Defaultnya kubernetes traffic management itu menggunakan Ingress. Namun, seiring berkembangnya ekosistem cloud native, Ingress memiliki beberapa keterbatasan yang cukup terasa. Contohnya yaitu ingress hanya mendukung traffic http dan https. Untuk mengatasinya, Official Kubernetes memperkenalkan Gateway API, yaitu network management yang hanya fokus pada L4 dan L7 routing pada kubernetes.
Kenapa Gateway API, Bukan Ingress?
Gateway API sendiri dibuat untuk menambal kekurangan yang ingress tidak punya, seperti poin berikut:
Protocol: Ingress dibuat hanya untuk traffic http dan https. Jika kalian mempunyai traffic TCP atau UDP, ingress biasanya memerlukan beberapa anotasi tambahan. Sementara Gateway API support beberapa protocol lain seperti HTTP, HTTPS, TCP, UDP, dan gRPC.
Model (Role): Ingress bisa dibilang menggunakan sistem monolith (sistem tunggal), karena menggabungkan hampir semua elemen routing (host, path rules, TLS, backend services) dalam satu file YAML sedangkan Gateway API bisa memisahkan konfigurasi YAML jadi beberpa file konfig. Ada beberapa konfigurasi model yang dipakai gateway api:
Gateway: Gerbang atau alur traffic network yang masuk dan keluar, dimana konfigurasi ini dibuat oleh arsitek untuk menentukan dari dan menuju kemana trafficnya, melalui loadbalance mana dan port mana.
HTTPRoute/TCPRoute/etc: Flow traffic dari gateway menuju service didalam pod.
Portable: Ingress sulit untuk dipindah ke ingress controller lainnya dikarenakan konfigurasi yang dipakai tidak bisa diaplikasikan pada semua controller. Untuk gateway api sendiri sangat memungkinkan untuk dipakai pada controller lain dan diaplikasikan pada controller lain, alasan itulah yang membuat gateway api sendiri bisa dibilang portable.
Deploy Istio
Istio merupakan controller yang berfungsi sebagai pengatur aliran traffic dari luar yang masuk menuju kedalam pod. Dalam case ini, gateway api menerima traffic dari luar menuju istio, lalu istio akan mengatur atau mengontrol traffic tersebut kedalam pod. Sebetulnya banyak controller lain yang bisa digunakan selain istio, seperti Contour atau Nginx Gateway Fabric. Tapi pada artikel ini kita akan bahas cara deploy istio untuk cluster kubernetes.
1. Instalasi CRD Gateway API
Langkah pertama adalah menginstal Custom Resource Definitions (CRD) dari Gateway API kedalam cluster. Kita akan menggunakan konfigurasi stkalianrd.
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.1.0/stkalianrd-install.yaml2. Instalasi Istio sebagai Gateway Controller
Istio adalah sebuah service mesh yang menyediakan fungsionalitas seperti manajemen traffic, keamanan, dan observabilitas. Salah satu komponennya bisa berfungsi sebagai implementasi Gateway API.
Download istioctl
istioctl adalah CLI untuk mengelola instalasi Istio.
# Download versi terbaru
curl -L https://istio.io/downloadIstio | sh -
# Pindah ke direktori hasil download (sesuaikan versinya)
cd istio-1.24.0/
# Salin binary ke path kalian
sudo cp bin/istioctl /usr/local/bin/Install Istio dengan Profile Minimal
Karena kita hanya ingin menggunakan Istio sebagai gateway controller dan menyerahkan manajemen resource ke Gateway API, kita cukup menginstal dengan profil minimal.
istioctl install --set profile=minimal -y
Setelah instalasi selesai, verifikasi Pod istiod running di namespace istio-system.
kubectl get all -n istio-systemistiod adalah control plane Istio. Ia akan memantau resource Gateway API dan mengonfigurasi data plane (dalam hal ini, Envoy proxy) sesuai dengan aturan yang kita define pada konfigurasi.

3. Konfigurasi Gateway
Sekarang, mari kita buat sebuah Gateway. Disini saya membuat sebuah listen load balancer dan membuka port 80 untuk HTTP. Buat file gateway-80.yaml:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: prod-web-80
namespace: istio-system
spec:
gatewayClassName: istio
listeners:
- name: prod-web-http
protocol: HTTP
port: 80
allowedRoutes:
namespaces:
from: AllApply file tersebut:
kubectl apply -f gateway-80.yamlKeterangan:
gatewayClassName: istio: Define konfigurasi CNI Kubernetes menggunakan controller Istio sebagaiGateway.listeners: Define listener port 80 untuk HTTP.
Setelah Gateway dibuat, Istio otomatis akan men-deploy sebuah Service dengan type: LoadBalancer. Inilah yang akan menjadi pintu utama traffic masuk ataupun keluar.
# Cek Gateway dan Service yang dibuat Istio
kubectl get gateway
kubectl get svc Jika tidak mendefinisikan namespace ketika membuat sebuah gateway akan secara otomatis membuat di namespace default

4. Membuat Routing Rule dengan HTTPRoute
Gateway hanya membuka pintu untuk keluar masuknya traffic. Kita perlu HTTPRoute untuk memberitahu traffic ke mana harus pergi. HTTPRoute ini akan kita tautkan ke Gateway yang sudah kita buat.
Buat file http-nginx-route.yaml:
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: nginx-route
namespace: default
spec:
parentRefs:
- name: prod-web-80
namespace: istio-system
hostnames:
- "web.nb.lab"
rules:
- backendRefs:
- name: nginx # Nama Service tujuan
port: 80Apply file tersebut (pastikan kalian sudah punya Service nginx yang berjalan di namespace default):
kubectl apply -f http-nginx-route.yamlKeterangan:
parentRefs: Ini menautkanHTTPRoutekeGatewayprod-web-80.hostnames: Aturan ini hanya berlaku untuk request dengan Host headerweb.nb.lab.backendRefs: Mengarahkan traffic keServicenginxdi port 80.
5. Pengujian
Untuk mengujinya, kita perlu tau alamat IP eksternal dari Service LoadBalancer yang dibuat oleh Istio.
# Dapatkan IP eksternal dari Gateway
export GATEWAY_IP=$(kubectl get svc prod-web-80 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $GATEWAY_IPLalu, kirim request menggunakan curl ke IP tersebut dengan parameter Host header yang benar.
curl $GATEWAY_IP -H 'Host: web.nb.lab' -I
Kesimpulan
Secara fungsi gateway api lebih banyak kompatibilitas dibanding ingress sendiri, karena gateway api mendukung protocol tcp, udp dan grpc. Istio pada artikel ini berfungsi untuk management traffic yang masuk kedalam pod. Istio juga bisa dipakai untuk routing aplikasi dan port yang dipakai pada pod.