Episode ini membahas cara menyusun sertifikat TLS dalam Kubernetes secret, mengonfigurasi HTTPS termination pada Gateway, serta TLS passthrough dan kontrol SNI untuk skenario yang membutuhkan enkripsi end-to-end.

Traffic HTTP polos bisa dibaca siapa pun di jaringan. Di produksi, hampir semua traffic masuk harus dienkripsi. Episode 5 membahas TLS & HTTPS termination di Multigress: menyimpan sertifikat sebagai Kubernetes secret, memakai listener HTTPS di Gateway, dan memahami kapan memakai mode passthrough dengan kontrol SNI.
Dua mode penting yang harus kalian pahami: termination, di mana gateway mendekripsi traffic dan mengirim plaintext ke backend, serta passthrough, di mana gateway meneruskan koneksi terenkripsi tanpa membukanya. Keduanya dipakai dalam skenario berbeda.
Untuk latihan, buat sertifikat self-signed dengan openssl:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt \
-subj "/CN=api.example.com" \
-addext "subjectAltName=DNS:api.example.com"Perintah di atas menghasilkan tls.key dan tls.crt untuk domain api.example.com. Di produksi, ganti dengan sertifikat dari CA tepercaya seperti Let's Encrypt.
Gateway API hanya menerima secret bertipe kubernetes.io/tls. Buat dan verifikasi:
kubectl create secret tls api-tls \
--key tls.key --cert tls.crt \
--namespace multigress-system
kubectl get secret api-tls -n multigress-systemSecret api-tls menyimpan tls.crt dan tls.key sebagai kunci data. Perintah kubectl get secret api-tls -n multigress-system sebaiknya ditambah flag -o yaml untuk memastikan struktur data benar, walaupun nilainya terenkripsi base64.
Warning
Gateway dan secret TLS harus berada di namespace yang sama dengan Gateway, bukan namespace aplikasi. HTTPRoute berada di namespace aplikasi, tetapi sertifikat milik listener Gateway.
Sekarang deklarasikan listener HTTPS yang merujuk ke secret:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: main-gateway
namespace: multigress-system
spec:
gatewayClassName: multigress
listeners:
- name: http
protocol: HTTP
port: 80
- name: https
protocol: HTTPS
port: 443
hostname: "*.example.com"
tls:
certificateRefs:
- name: api-tls
kind: SecretPerhatikan bagian tls.certificateRefs: ini menghubungkan listener HTTPS ke secret. Field hostname bersifat opsional — jika diisi, listener hanya melayani hostname yang cocok.
Terapkan dan tes:
kubectl apply -f gateway.yaml
curl -k https://localhost:8443/v1 -H "Host: api.example.com"Gunakan flag -k karena sertifikat self-signed. Kalau respons muncul, berarti gateway sudah men-terminasi TLS dan meneruskan request ke backend. Cek juga status listener:
kubectl describe gateway main-gateway -n multigress-systemPada bagian Status harus muncul kondisi Accepted: True dan Ready: True untuk listener HTTPS. Kesalahan umum seperti secret tidak ditemukan akan tercatat di kondisi ResolvedRefs.
Ada skenario di mana gateway tidak boleh membuka traffic: backend yang menangani sertifikatnya sendiri, seperti aplikasi legacy atau regulasi yang mensyaratkan enkripsi end-to-end. Di sinilah passthrough dipakai. Multigress hanya meneruskan byte terenkripsi dan mengarahkan berdasarkan SNI (Server Name Indication) — nama domain yang dikirim klien saat handshake.
Passthrough dinyatakan dengan TLSRoute:
apiVersion: gateway.networking.k8s.io/v1
kind: TLSRoute
metadata:
name: legacy-tls-route
spec:
parentRefs:
- name: main-gateway
namespace: multigress-system
hostnames:
- "legacy.example.com"
rules:
- backendRefs:
- name: legacy-app
port: 443TLSRoute tidak memiliki konsep path karena koneksi tidak didekripsi — keputusan routing murni berdasarkan SNI. Backend legacy-app harus mendukung TLS sendiri.
| Aspek | Termination | Passthrough |
|---|---|---|
| Sertifikat di gateway | Ya | Tidak |
| Routing berdasarkan path | Ya | Tidak, hanya SNI |
| Enkripsi ke backend | Bisa plaintext | Selalu terenkripsi |
| Contoh penggunaan | Aplikasi modern | Aplikasi legacy, regulasi |
Aturan praktis: gunakan termination untuk hampir semua kasus, dan simpan passthrough untuk skenario yang benar-benar membutuhkan.
Episode 5 mengamankan jalur masuk traffic kalian: menyimpan sertifikat sebagai secret, mengonfigurasi listener HTTPS dengan certificateRefs, dan memilih antara termination atau passthrough sesuai kebutuhan backend.
Inti yang harus dibawa pulang:
kubernetes.io/tls dan berada di namespace Gateway.tls.certificateRefs.Accepted untuk validitas, ResolvedRefs untuk referensi secret.Di episode 6 selanjutnya kita akan mengelola traffic policy & load balancing — traffic splitting dan weights, retries, timeouts, circuit breakers, request mirroring, serta perilaku load balancing antar service backend. Gateway HTTPS kalian akan menjadi laboratorium untuk semua eksperimen tersebut.