Komunikasi antar-service yang aman dan andal adalah tulang punggung arsitektur modern; di episode ini kalian memahami DNS dalam cluster, TLS dengan cert-manager, mutual TLS, dan service mesh Istio/Linkerd, lalu mengamankan komunikasi service-to-service

Di episode 8 kalian men-deploy aplikasi dan mengeksposnya via Service dan Ingress. Tetapi di sistem nyata, satu request melewati banyak service — dan setiap hop itu butuh networking yang bisa diandalkan dan aman: bagaimana satu service menemukan service lain? Bagaimana traffic dienkripsi? Bagaimana satu service membuktikan identitasnya ke service lain?
Episode 19 menjawab pertanyaan-pertanyaan itu di tiga lapisan: DNS dan networking dalam cluster, TLS dengan cert-manager untuk komunikasi eksternal, dan service mesh — Istio/Linkerd — untuk keamanan dan reliabilitas antar-service dengan mutual TLS (mTLS). Ini adalah lapisan yang membuat arsitektur microservice berjalan aman pada skala besar.
Setiap Service di Kubernetes otomatis mendapat DNS record internal. Ini yang memungkinkan service saling menemukan hanya dengan nama — tanpa tahu IP:
myapp.default.svc.cluster.local # nama DNS penuh service myapp
http://myapp:8080 # dipakai di dalam namespace defaultKubernetes juga mendukung NetworkPolicy — firewall yang menentukan service mana boleh berkomunikasi dengan siapa:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-api
spec:
podSelector:
matchLabels:
app: web
ingress:
- from:
- podSelector:
matchLabels:
app: api
ports:
- protocol: TCP
port: 3000Default Kubernetes membolehkan semua traffic. NetworkPolicy default-deny + allowlist adalah praktik yang harus kalian pasang sejak awal — jaringan yang "terbuka semua" adalah undangan untuk pergerakan lateral setelah satu service ditembus.
Lalu lintas menuju aplikasi harus dienkripsi dengan TLS. Di Kubernetes, alur yang benar untuk mengelola certificate adalah cert-manager — controller yang meminta certificate dari Let's Encrypt (melalui ACME) dan memperbaruinya otomatis sebelum kedaluwarsa.
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: app-tls
namespace: default
spec:
secretName: app-tls-secret
dnsNames:
- app.example.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuerSetelah certificate dibuat, Ingress memakainya — dan seluruh traffic ke app.example.com terenkripsi:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
tls:
- hosts:
- app.example.com
secretName: app-tls-secret
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
number: 80TLS biasa mengamankan koneksi browser → server: server membuktikan identitasnya, browser memverifikasi. Tapi ketika service berbicara ke service, kalian tidak tahu siapa di ujung sana — seorang attacker yang sudah masuk ke satu Pod bisa berpura-pura menjadi service lain. Mutual TLS (mTLS) menjawabnya: kedua pihak memverifikasi identitas satu sama lain dengan certificate sendiri.
mTLS diimplementasikan paling praktis lewat service mesh, karena mesh otomatis menyuntikkan identity per-Pod dan mengatur certificate — tanpa mengubah kode aplikasi.
Service mesh menambahkan lapisan proxy (sidecar) di samping setiap Pod. Semua traffic masuk-keluar Pod lewat proxy, sehingga mesh bisa mengatur traffic, keamanan, dan observability secara terpusat:
| Aspek | Istio | Linkerd |
|---|---|---|
| Ekosistem | Fitur sangat kaya (traffic, security, observability) | Ringan, sederhana, fokus pada kesederhanaan |
| Model sidecar | Envoy proxy (kuat, kompleks) | Proxy ringan (Rust) |
| Complexity | Tinggi | Rendah |
| Best for | Arsitektur besar yang butuh kontrol penuh | Tim yang ingin value cepat tanpa kompleksitas |
Keduanya memberi empat kemampuan inti: mTLS otomatis, traffic shifting (canary dari episode 6), retry/timeout, dan metrics per-service tanpa instrumentasi manual.
Dengan Istio, kebijakan mTLS bisa dinyatakan secara deklaratif. Sebuah PeerAuthentication memaksa semua traffic antar-service di namespace terenkripsi:
apiVersion: security.istio.io/v1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICTDan AuthorizationPolicy membatasi service mana yang boleh memanggil service lain:
apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
name: billing-allow-api
namespace: default
spec:
selector:
matchLabels:
app: billing
action: ALLOW
rules:
- from:
- source:
principals:
- cluster.local/ns/default/sa/api
to:
- operation:
methods: ["GET", "POST"]istioctl x describe pod billing-<id>
kubectl exec -n default deploy/billing -- curl -v http://api:8080/health 2>&1 | grep "SSL"Important
Mulailah dengan Linkerd atau NetworkPolicy + cert-manager jika tim masih kecil — keduanya memberi keamanan tanpa biaya operasional besar. Istio adalah pilihan tepat ketika sudah butuh control plane yang kaya: traffic shifting granular, observability mendalam, dan kebijakan per-namespace. Service mesh yang dipasang terlalu dini adalah sumber kompleksitas, bukan solusi.
Inti yang harus dibawa pulang:
Di episode 20 selanjutnya kita membahas Disaster Recovery & Backup — RPO/RTO, backup dengan Velero dan Restic, dan rencana pemulihan yang diuji dengan simulasi nyata. Semua arsitektur yang kalian bangun di episode 8-19 tidak bernilai jika tidak bisa dipulihkan setelah bencana.