Kodeloka
  1. Kodeloka
  2. Kelas Kong API Gateway
  3. Materi

5 · Kubernetes · Modul 10 dari 12

Kong Ingress Controller 3.x & Gateway API

Menjalankan Kong sebagai ingress di Kubernetes, memakai Gateway API sebagai antarmuka utama, dan mengelola plugin lewat CRD.

📌 Perbedaan Mendasar di Kubernetes

Di luar Kubernetes, Anda mengonfigurasi Kong lewat Admin API atau berkas decK. Di dalam Kubernetes, objek Kubernetes menjadi sumber kebenarannya — controller membaca Gateway, HTTPRoute, dan CRD Kong, lalu menerjemahkannya menjadi konfigurasi Kong secara otomatis.

⚠️ Jangan mencampur dua cara sekaligus

Mengubah konfigurasi lewat Admin API pada Kong yang dikelola KIC adalah pekerjaan sia-sia: controller akan mengembalikannya ke keadaan yang tertulis di objek Kubernetes pada rekonsiliasi berikutnya. Pilih satu jalur dan konsisten.

📦 Instalasi

helm repo add kong https://charts.konghq.com
helm repo update

helm install kong kong/ingress \
  -n kong --create-namespace \
  --set gateway.ingressController.gatewayDiscovery.enabled=true

kubectl get pods -n kong
kubectl get gatewayclass

🚪 Gateway API — Cara yang Dianjurkan

gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gerbang-kong
  namespace: kong
spec:
  gatewayClassName: kong
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
      hostname: "*.contoh.com"
      tls:
        certificateRefs:
          - name: tls-wildcard
      allowedRoutes:
        namespaces:
          from: All          # route dari namespace mana pun boleh menempel
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rute-pesanan
  namespace: produksi
spec:
  parentRefs:
    - name: gerbang-kong
      namespace: kong
  hostnames: ["api.contoh.com"]
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /pesanan
      backendRefs:
        - name: layanan-pesanan
          port: 80
          weight: 90
        - name: layanan-pesanan-baru
          port: 80
          weight: 10        # canary 10% — bagian dari spesifikasi
💡 Kenapa Gateway API lebih baik daripada Ingress

Dengan Ingress, kemampuan seperti pembagian trafik dan pencocokan header hanya tersedia lewat anotasi khusus vendor, sehingga konfigurasi terkunci pada satu controller. Gateway API menjadikannya field resmi, sekaligus memisahkan peran: tim platform mengelola Gateway beserta sertifikatnya, tim aplikasi mengelola HTTPRoute masing-masing di namespace sendiri.

🔌 Plugin lewat CRD

apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: batas-laju
  namespace: produksi
config:
  minute: 100
  policy: redis
  redis:
    host: redis.produksi.svc.cluster.local
    port: 6379
plugin: rate-limiting
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rute-pesanan
  namespace: produksi
  annotations:
    konghq.com/plugins: batas-laju      # ← dilampirkan di sini
spec:
  ...

Anotasi konghq.com/plugins dapat dipasang pada HTTPRoute, Ingress, Service, atau KongConsumer — cakupannya mengikuti resource tempat ia dilampirkan.

👥 Consumer & Kredensial sebagai Objek

apiVersion: v1
kind: Secret
metadata:
  name: kredensial-mitra-a
  namespace: produksi
  labels:
    konghq.com/credential: key-auth
stringData:
  key: "rahasia-dari-external-secrets"
---
apiVersion: configuration.konghq.com/v1
kind: KongConsumer
metadata:
  name: mitra-a
  namespace: produksi
  annotations:
    kubernetes.io/ingress.class: kong
username: mitra-a
credentials:
  - kredensial-mitra-a
📌 Pasangkan dengan External Secrets Operator

Kredensial disimpan sebagai Secret Kubernetes, yang berarti hanya di-encode base64 dan tidak boleh masuk Git dalam bentuk mentah. External Secrets Operator dapat mengambilnya dari Vault atau AWS Secrets Manager, sehingga yang tersimpan di Git hanyalah petunjuk lokasinya.

⚠️ CRD yang Sudah Usang

🚫 KongIngress tidak lagi dipakai

Banyak tutorial masih mengajarkan CRD KongIngress untuk mengatur perilaku upstream, protokol, dan penulisan ulang path. CRD ini sudah usang di KIC 3.x. Penggantinya lebih spesifik dan lebih jelas: KongUpstreamPolicy untuk pengaturan load balancing dan health check, serta field resmi Gateway API untuk routing dan penulisan ulang path.

apiVersion: configuration.konghq.com/v1beta1
kind: KongUpstreamPolicy
metadata:
  name: kebijakan-pesanan
  namespace: produksi
spec:
  algorithm: least-connections
  healthchecks:
    active:
      type: http
      httpPath: /healthz
      healthy:
        interval: 5
        successes: 2
      unhealthy:
        interval: 5
        httpFailures: 3

🔍 Menelusuri Masalah

kubectl get gateway,httproute -A
kubectl describe httproute rute-pesanan -n produksi
kubectl logs -n kong deploy/kong-controller -c ingress-controller --tail=100
kubectl get kongplugin,kongconsumer -A

# Melihat konfigurasi Kong yang DIHASILKAN controller
kubectl exec -n kong deploy/kong-gateway -- \
  curl -s http://localhost:8001/config | jq

Bagian status pada objek HTTPRoute adalah tempat pertama yang harus dilihat: ia menyatakan apakah route berhasil menempel ke Gateway, dan bila tidak, alasannya.