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
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 }
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%
- Pemisahan peran. Tim platform mengelola
Gateway(sertifikat, listener); tim aplikasi mengelolaHTTPRoutemasing-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, danGRPCRoute.
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.
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
| Gejala | Penyebab yang biasa |
|---|---|
| 404 dari Ingress | Host tidak cocok, atau ingressClassName salah |
| 502 Bad Gateway | Service tidak punya endpoint, atau port tujuan keliru |
| Peringatan sertifikat | Secret TLS di namespace yang berbeda dari Ingress |
| Redirect berulang tanpa henti | Aplikasi juga memaksa HTTPS padahal TLS sudah diakhiri di Ingress |
| Unggahan besar ditolak | Batas 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