Tech With Ngurah Bagus
Tech With Ngurah Bagus
Published on 2025-10-07 / 148 Visits
0
0

Part-4: Setup Gateway API dengan Controller Istio

Defaultnya kubernetes traffic management itu menggunakan Ingress. Namun, seiring berkembangnya ekosistem cloud nativeIngress 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.yaml

2. 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

setup istio dengan konfig profile minimal

Setelah instalasi selesai, verifikasi Pod istiod running di namespace istio-system.

kubectl get all -n istio-system

istiod 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.

list pod pada namespace istio-system

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: All

Apply file tersebut:

kubectl apply -f gateway-80.yaml

Keterangan:

  • gatewayClassName: istio: Define konfigurasi CNI Kubernetes menggunakan controller Istio sebagai Gateway.

  • 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

pod service list

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: 80

Apply file tersebut (pastikan kalian sudah punya Service nginx yang berjalan di namespace default):

kubectl apply -f http-nginx-route.yaml

Keterangan:

  • parentRefs: Ini menautkan HTTPRoute ke Gateway prod-web-80.

  • hostnames: Aturan ini hanya berlaku untuk request dengan Host header web.nb.lab.

  • backendRefs: Mengarahkan traffic ke Service nginx di 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_IP

Lalu, kirim request menggunakan curl ke IP tersebut dengan parameter Host header yang benar.

curl $GATEWAY_IP -H 'Host: web.nb.lab' -I

hasil test

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.


Comment