Belajar Golang - Go di Cloud, Containers, dan Kubernetes
Episode 16 of 19

Belajar Golang - Go di Cloud, Containers, dan Kubernetes

Episode ini membawa aplikasi Go ke production: build static binary dengan CGO_ENABLED=0, multi-stage Dockerfile yang efisien, image distroless minimal, serta deployment ke Kubernetes, Cloud Run, dan platform serverless.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Di episode 1 kalian mendengar bahwa Go menghasilkan binary statis. Episode 16 adalah saatnya menuai keuntungan itu: aplikasi Go adalah salah satu kandidat terbaik untuk container karena image-nya bisa sangat kecil, aman, dan cepat dideploy.

Episode 16 membawa aplikasi Go ke cloud: membangun binary statis, menyusun multi-stage Dockerfile yang efisien, memakai image distroless yang minimal, dan mendeploy ke Kubernetes, Cloud Run, serta platform serverless. Di akhir episode, aplikasi kalian berjalan di production dengan footprint sekecil mungkin.

Static Binary dengan CGO_ENABLED=0

Mengapa Menonaktifkan CGO

CGO memungkinkan Go memanggil kode C, tetapi membuat binary bergantung pada pustaka C di runtime. Menonaktifkannya dengan CGO_ENABLED=0 menghasilkan binary murni yang berjalan di container sekecil apa pun — termasuk distroless dan scratch yang tanpa shell.

Build binary statis
CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o app .

Flag -ldflags="-s -w" menghilangkan tabel simbol dan informasi debug, mengecilkan ukuran binary. Untuk mengecek hasilnya, file app harus menunjukkan statically linked.

Build untuk Arsitektur Lain

Go mendukung cross-compilation tanpa toolchain tambahan. GOOS dan GOARCH menentukan target: GOOS=linux GOARCH=arm64 untuk ARM, GOOS=darwin untuk macOS. Inilah fleksibilitas yang membuat Go unggul di ekosistem multi-platform.

Multi-Stage Dockerfile

Prinsip Multi-Stage

Dockerfile multi-stage memisahkan environment build dari runtime. Stage pertama memakai image Go lengkap untuk kompilasi; stage kedua hanya menyalin binary — tanpa source code dan tanpa toolchain.

Dockerfile multi-stage
FROM golang:1.23-alpine AS builder
 
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o app .
 
FROM gcr.io/distroless/static-debian12
 
COPY --from=builder /app/app /app/app
ENTRYPOINT ["/app/app"]

Stage builder mengunduh dependency sekali lewat go mod download, memanfaatkan cache layer. Image distroless hanya berisi binary dan runtime minimal — tanpa shell, tanpa package manager, permukaan serangan yang sangat kecil.

Manfaat Ukuran Kecil

Image Go yang baik berukuran puluhan megabyte, jauh lebih kecil dibanding image berbasis Python atau Node. Keuntungannya: download lebih cepat saat deployment, penyimpanan registry lebih hemat, dan startup container lebih cepat — semuanya krusial untuk scaling cepat.

Deploy ke Kubernetes

Deployment dan Service

Aplikasi Go dideploy sebagai Deployment dengan probe kesehatan yang sudah kita bangun di episode 15:

Deployment Kubernetes
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-go
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-go
  template:
    metadata:
      labels:
        app: api-go
    spec:
      containers:
        - name: api-go
          image: registry.example.com/api-go:1.0.0
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              path: /readyz
              port: 8080

Terapkan dengan kubectl apply -f deployment.yaml, lalu ekspos lewat Service dan Ingress. HorizontalPodAutoscaler bisa menambah replika berdasarkan metrik CPU atau request per detik.

Image Pull Policy dan Versi

Selalu tag image dengan versi yang unik — jangan latest di production karena sulit di-rollback. imagePullPolicy: IfNotPresent mempercepat deployment ulang, sedangkan tag yang berubah memicu pull image baru.

Cloud Run dan Serverless

Cloud Run

Cloud Run menjalankan container tanpa perlu mengelola cluster. Image Go statis sangat cocok karena cold start yang singkat. Deploy dengan perintah:

Deploy ke Cloud Run
gcloud run deploy api-go \
  --image registry.example.com/api-go:1.0.0 \
  --region asia-southeast1 \
  --allow-unauthenticated

Cloud Run menskalakan ke nol saat tidak ada traffic, jadi biaya hanya muncul ketika layanan dipakai. Port yang didengarkan aplikasi dibaca dari environment PORT.

Platform Serverless Lain

AWS Lambda mendukung Go melalui custom runtime atau container image, begitu pula Google Cloud Functions dan Azure Functions. Binary statis Go bisa dibungkus sebagai image container fungsi tanpa runtime tambahan, sehingga memory footprint-nya jauh lebih kecil dibanding bahasa lain.

Best Practice Container Runtime

Beberapa praktik yang menjaga container Go tetap sehat:

  • Jalankan sebagai non-root: tambahkan USER nonroot atau gunakan image distroless yang tidak punya user root default.
  • Sertakan probe: liveness, readiness, dan startup probe di Deployment.
  • Limit resource: set requests dan limits CPU serta memori.
  • Scan image: pindai untuk kerentanan di CI dengan trivy atau grype.
  • Simpan config di environment, bukan di dalam image.

Praktik ini memastikan image yang sama bisa dideploy ke environment mana pun tanpa perubahan.

Penutup

Episode 16 membawa aplikasi Go ke production: build static binary dengan CGO_ENABLED=0 dan -ldflags, multi-stage Dockerfile dengan image distroless minimal, deployment ke Kubernetes dengan probe, serta deploy ke Cloud Run dan platform serverless.

Inti yang harus dibawa pulang:

  • CGO_ENABLED=0 menghasilkan binary statis tanpa dependensi C.
  • -ldflags="-s -w" mengecilkan ukuran binary.
  • Multi-stage Dockerfile memisahkan build dan runtime.
  • Image distroless meminimalkan permukaan serangan.
  • Deployment Kubernetes butuh liveness dan readiness probe.
  • Cloud Run dan Lambda menerima container Go dengan cold start singkat.

Di episode 17 selanjutnya kita akan membahas CI/CD, release, dan dependency management — pipeline build dan test otomatis dengan GitHub Actions, menjaga dependency aman dengan go mod verify dan govulncheck, serta release workflow dengan versioning, semantic imports, dan distribusi binary.

Belajar Golang - Go di Cloud, Containers, dan Kubernetes | Belajar Golang