Kodeloka
  1. Kodeloka
  2. Kelas Kubernetes
  3. Materi

2 · Jaringan · Modul 4 dari 14

Ingress, Gateway API & TLS

Mengekspos banyak layanan lewat satu titik masuk, mengelola sertifikat otomatis, dan mengenal Gateway API sebagai penerus Ingress.

Ingress: Router HTTP untuk Kluster

Internet
   │
   ▼
LoadBalancer (satu saja)
   │
   ▼
Ingress Controller (nginx / Traefik / Kong / Envoy)
   │
   ├── toko.contoh.com/api    →  Service layanan-api
   ├── toko.contoh.com/       →  Service frontend
   └── admin.contoh.com/      →  Service dasbor-admin
⚠️ Objek Ingress tanpa controller tidak melakukan apa-apa

Membuat objek Ingress saja tidak cukup — ia hanya sebuah catatan konfigurasi. Anda harus memasang Ingress Controller yang membacanya dan benar-benar merutekan trafik. Ini kebingungan pemula yang sangat umum: objek dibuat, statusnya terlihat normal, tetapi tidak ada yang bisa diakses.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: gerbang-toko
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/proxy-body-size: "10m"
spec:
  ingressClassName: nginx
  tls:
    - hosts: [toko.contoh.com]
      secretName: tls-toko
  rules:
    - host: toko.contoh.com
      http:
        paths:
          - path: /api
            pathType: Prefix
            backend:
              service:
                name: layanan-api
                port: { number: 80 }
          - path: /
            pathType: Prefix
            backend:
              service:
                name: frontend
                port: { number: 80 }
🚫 Kelemahan mendasar Ingress: anotasi

Spesifikasi Ingress hanya mencakup routing HTTP yang paling sederhana. Segala hal lain — pembatasan laju, penulisan ulang path, timeout, sesi lengket, pemisahan trafik untuk canary — dilakukan lewat anotasi khusus vendor. Akibatnya konfigurasi Anda terkunci pada satu controller: berpindah dari nginx ke Traefik berarti menulis ulang semua anotasi. Inilah alasan utama lahirnya Gateway API.

Gateway API: Penerus Ingress

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gerbang-utama
spec:
  gatewayClassName: nginx
  listeners:
    - name: https
      protocol: HTTPS
      port: 443
      hostname: "*.contoh.com"
      tls:
        certificateRefs:
          - name: tls-wildcard
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: rute-api
spec:
  parentRefs:
    - name: gerbang-utama
  hostnames: ["toko.contoh.com"]
  rules:
    - matches:
        - path: { type: PathPrefix, value: /api }
      backendRefs:
        - name: layanan-api
          port: 80
          weight: 90            # pemisahan trafik BAWAAN
        - name: layanan-api-baru
          port: 80
          weight: 10            # canary 10%
💡 Kenapa Gateway API lebih baik
  • Pemisahan peran. Tim platform mengelola Gateway (sertifikat, listener); tim aplikasi mengelola HTTPRoute masing-masing. Dengan Ingress, semuanya bercampur dalam satu objek.
  • Fitur menjadi bagian spesifikasi. Pembobotan trafik, pencocokan header, penulisan ulang, dan mirroring adalah field resmi — bukan anotasi vendor.
  • Lintas namespace yang aman. Route dari namespace lain hanya bisa menempel bila Gateway mengizinkannya secara eksplisit.
  • Bukan hanya HTTP. Ada TCPRoute, TLSRoute, dan GRPCRoute.

Sertifikat Otomatis dengan cert-manager

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-prod-akun
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx

Dengan anotasi cert-manager.io/cluster-issuer pada Ingress, cert-manager akan meminta sertifikat, menyelesaikan tantangan ACME, menyimpannya sebagai Secret, dan memperbaruinya otomatis sebelum kedaluwarsa. Sertifikat kedaluwarsa adalah penyebab pemadaman yang sangat umum dan sepenuhnya bisa dihindari.

⚠️ Selalu uji di lingkungan staging Let's Encrypt dulu

Let's Encrypt punya batas laju yang ketat: kegagalan berulang saat mencoba konfigurasi bisa membuat domain Anda diblokir selama berjam-jam. Pakai issuer acme-staging-v02 sampai semuanya bekerja, baru pindah ke produksi.

Masalah yang Sering Muncul

GejalaPenyebab yang biasa
404 dari IngressHost tidak cocok, atau ingressClassName salah
502 Bad GatewayService tidak punya endpoint, atau port tujuan keliru
Peringatan sertifikatSecret TLS di namespace yang berbeda dari Ingress
Redirect berulang tanpa hentiAplikasi juga memaksa HTTPS padahal TLS sudah diakhiri di Ingress
Unggahan besar ditolakBatas ukuran body bawaan controller terlalu kecil
kubectl get ingress
kubectl describe ingress gerbang-toko
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller --tail=100
kubectl get certificate,certificaterequest,order,challenge -A