tutorial

  1. gRPC di Kubernetes dengan LoadBalancer

77. gRPC di Kubernetes dengan LoadBalancer

gRPC saat ini menjadi salah satu primadona untuk komunikasi antar layanan (service-to-service communication) di arsitektur microservices modern. Salah satu kekuatan utamanya adalah efisiensi, kontrak API yang terstruktur, serta dukungan terhadap berbagai bahasa pemrograman. Namun, menerapkan gRPC di environment Kubernetes menghadirkan tantangan unik, terutama ketika kita ingin expose service gRPC ke dunia luar—di sinilah peran LoadBalancer menjadi vital.

Di artikel ini, saya akan membahas best practice menjalankan gRPC service di Kubernetes dengan tipe service LoadBalancer, lengkap dengan contoh deployment, simulasi traffic, diagram, serta insight engineer—semua dikemas dari sudut pandang engineer profesional.


Mengapa Menggunakan gRPC di Kubernetes?

Pada dasarnya, Kubernetes menawarkan mekanisme service discovery dan load balancing internal. Tetapi, gRPC memiliki karakteristik khusus dibandingkan HTTP/REST biasa:

  • gRPC menggunakan HTTP/2 sebagai transport, yang memiliki multiplexed streaming, binary framing, dan koneksi persistent.
  • Banyak Ingress Controller default tidak mendukung HTTP/2 end-to-end yang dibutuhkan gRPC.
  • Service external exposure biasanya butuh LoadBalancer berbasis L4 (TCP), bukan L7 (HTTP) agar komunikasi gRPC berjalan optimal.

Skenario ini umum terjadi ketika perlu expose service gRPC secara publik (misal ke pihak ketiga atau client mobile), atau ketika membangun hybrid cloud yang kliennya diluar cluster.


Diagram Alur gRPC Service di Kubernetes

Agar lebih jelas, perhatikan flow berikut:

flowchart LR
    A[gRPC Client] -- koneksi secure HTTP/2 --> B(LoadBalancer Service)
    B -- forward TCP --> C(gRPC Server Pod)
    C -- response binary/grpc --> A

Diagram di atas menunjukkan bahwa traffic dari client dialihkan langsung ke pod gRPC melalui LoadBalancer service. Benefit-nya? Full feature HTTP/2 terjaga, tanpa termination/interception oleh proxy L7.


Simulasi: Deploy gRPC Service dengan LoadBalancer

Untuk mendemonstrasikan, kita akan deploy contoh gRPC server di Kubernetes dan expose menggunakan Service type LoadBalancer.

1. Contoh Aplikasi gRPC Sederhana

Kita ambil gRPC server sederhana dengan Node.js untuk demonstrasi. Misal, file greeter_server.js:

const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync('greeter.proto');
const proto = grpc.loadPackageDefinition(packageDefinition);

function sayHello(call, callback) {
  callback(null, { message: 'Hello ' + call.request.name });
}

const server = new grpc.Server();
server.addService(proto.Greeter.service, { sayHello: sayHello });
server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => {
  server.start();
});

greeter.proto:

syntax = "proto3";
service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
  string name = 1;
}
message HelloReply {
  string message = 1;
}

2. Dockerfile untuk Containerisasi

FROM node:18
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 50051
CMD ["node", "greeter_server.js"]

Build dan push image ke registry (contoh: gcr.io, docker hub).

3. Manifest Deployment Kubernetes

grpc-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpc-greeter
spec:
  replicas: 2
  selector:
    matchLabels:
      app: grpc-greeter
  template:
    metadata:
      labels:
        app: grpc-greeter
    spec:
      containers:
        - name: greeter
          image: <IMAGE_URL> # Ganti dengan image Anda
          ports:
            - containerPort: 50051

4. Service Type LoadBalancer

grpc-service.yaml:

apiVersion: v1
kind: Service
metadata:
  name: grpc-greeter-service
spec:
  type: LoadBalancer
  selector:
    app: grpc-greeter
  ports:
    - protocol: TCP
      port: 50051
      targetPort: 50051

Catatan:

  • Service menggunakan tipe LoadBalancer agar dapat IP eksternal/public.
  • Port harus sama persis dengan yang digunakan gRPC di pod (50051/TCP).

Apply kedua resource:

kubectl apply -f grpc-deployment.yaml
kubectl apply -f grpc-service.yaml

Penjelasan Flow Traffic

Setelah service terdeploy, provider cloud (misal GKE, EKS, AKS) akan provision IP eksternal. Traffic dari gRPC client akan mengalir sebagai berikut:

  1. Client melakukan koneksi gRPC ke <External-IP>:50051
  2. LoadBalancer meneruskan koneksi TCP mentah ke salah satu pod backend (round-robin)
  3. Pod gRPC menerima request, memproses, dan mengirim response
  4. Respon dikembalikan melalui jalur yang sama

Tabel Simulasi Routing Request

Client Source IPLoadBalancer IPPod TujuanStatus
10.1.2.1534.68.XX.YYgrpc-greeter-1OK
10.1.2.1634.68.XX.YYgrpc-greeter-2OK
10.1.2.1734.68.XX.YYgrpc-greeter-2OK

Illustrasi di atas menunjukkan LoadBalancer akan menyeimbangkan koneksi TCP ke pod-pod.


Challenge dan Best Practice gRPC LoadBalancer di Kubernetes

1. Pastikan HTTP/2 End-to-End

  • LoadBalancer cloud (misal AWS ELB classic atau Layer 4 TCP) akan forward paket TCP berbasis connection-aware.
  • Jangan menggunakan Ingress L7 (Nginx, ALB, GCLB HTTP) jika tidak mendukung HTTP/2 passthrough! Karena mayoritas hanya support HTTP/1.1. Maka, path termudah adalah Publish L4 LoadBalancer.
  • Alternatif: gunakan NGINX TCP LoadBalancer atau Kubernetes Gateway API yang mendukung TCP passthrough.

2. Health Check Pod

Gunakan readinessProbe berbasis gRPC agar pod hanya menerima traffic jika gRPC benar-benar ready. Sejak Kubernetes 1.23+, readinessProbe sudah support gRPC:

readinessProbe:
  grpc:
    port: 50051

3. Network Policy & Security

  • Aktifkan NetworkPolicy agar hanya client terpercaya yang bisa akses LoadBalancer
  • Untuk akses publik, gunakan TLS pada gRPC. Jangan pakai ServerCredentials.createInsecure() untuk production.
  • Sertakan cert TLS (self-signed atau dari CA) dan enable secure channel.

4. Autoscaling & Service Capacity

Dengan tipe LoadBalancer, scaling replica pod mudah. Namun, perhatikan:

  • Attach horizontal pod autoscaler (HPA) sesuai resource usage (CPU/RAM/connections)
  • Sesuaikan Session Affinity jika gRPC client butuh sticky session
  • Monitor LoadBalancer metrics (concurrent connections, errors, latency)

FAQ dan Insight Praktis

Q: Bisa pakai Ingress Controller biasa?
A: Tidak selalu. Ingress berbasis HTTP biasanya terminate HTTP di L7 yang hanya support HTTP/1.1. Untuk gRPC perlu HTTP/2 end-to-end. Cari Ingress Controller yang mendukung itu (contohnya NGINX versi terbaru, Kong, Istio dengan config khusus).

Q: Berapa limit connections pada LoadBalancer?
A: Bervariasi tiap cloud provider. Misal, AWS NLB support 1 juta+ connections, GCP LB tergantung quota backend.

Q: Apa risk expose service gRPC langsung?
A: Raw exposure berarti semua client bisa mencoba connect. Minimalkan attack surface pakai mTLS, dan NetworkPolicy.


Kesimpulan

Mengoperasikan gRPC di Kubernetes dengan LoadBalancer adalah pola recommended saat expose service gRPC dari cluster ke eksternal. Fokus utamanya adalah memastikan koneksi HTTP/2 tetap utuh, performa stabil, serta keamanan terjaga. Pahami limitasi L4 vs L7 routing, jaga health check, dan scale pod secara benar.

Apapun bahasa backend Anda, pola deployment ini sangat reusable—dari Go, Java, Node.js hingga Python. Pastikan Anda memilih LoadBalancer dengan pengaturan L4 dan kombinasi NetworkPolicy, TLS, serta monitoring untuk production-ready gRPC di Kubernetes.


Referensi Lanjut:

Happy Scaling! 🚀


Tantangan untuk Anda:
Sudah menggunakan gRPC di Kubernetes? Coba share pengalaman unik Anda di kolom komentar: bagaimana handling scaling-nya, apakah pernah trouble dengan Ingress, atau pernah coba service mesh seperti Istio—let’s discuss!

comments powered by Disqus