Deploy Next.js di Kubernetes dengan Ingress + SSL Let’s Encrypt
Buat kamu yang lagi Deploy aplikasi dengan Next.js dan pengen jalan di Kubernetes dengan domain custom + SSL otomatis, artikel ini cocok banget. Kita akan bahas step-by-step mulai dari build Docker image, deploy ke cluster Kubernetes, sampai aktifin HTTPS pakai Ingress NGINX + cert-manager. πβ¨
π§ 1. Build Docker Image Next.js
Pertama, bikin Dockerfile khusus Kubernetes:
# ---------- Stage 1: Build Next.js ----------
FROM node:20-alpine AS builder
WORKDIR /app
# Install dependencies
COPY package.json pnpm-lock.yaml ./
RUN npm install -g pnpm && pnpm install
# Copy source code
COPY . .
# Build Next.js
RUN pnpm build
# ---------- Stage 2: Runtime ----------
FROM node:20-alpine
WORKDIR /app
# Copy only necessary runtime files
COPY --from=builder /app ./
EXPOSE 3000
CMD ["pnpm", "start"]
Build dan push ke Docker Hub:
docker build -f Dockerfile.kube -t masdika/infradevcomunity:latest .
docker push masdika/infradevcomunity:latest


βΈοΈ 2. Deploy ke Kubernetes
Bikin manifest infradev-final.yaml:
# ---------- Namespace (tempat khusus untuk resource app ini) ----------
apiVersion: v1
kind: Namespace
metadata:
name: infradev
---
# ---------- Deployment (definisi pod Next.js, berisi container app) ----------
apiVersion: apps/v1
kind: Deployment
metadata:
name: infradev-deployment
namespace: infradev
spec:
replicas: 2 # jumlah pod (auto scaling manual)
selector:
matchLabels:
app: infradev-app # selector cocokkan ke label pod
template:
metadata:
labels:
app: infradev-app # label pod
spec:
containers:
- name: infradev-container
image: masdika/infradevcomunity:latest # image dari Docker Hub
ports:
- containerPort: 3000 # port yang dipakai app Next.js
---
# ---------- Service (akses internal cluster ke pod) ----------
apiVersion: v1
kind: Service
metadata:
name: infradev-service
namespace: infradev
spec:
selector:
app: infradev-app # target pod berdasarkan label
ports:
- port: 80 # port service (akses internal)
targetPort: 3000 # port dalam container
type: ClusterIP # hanya bisa diakses internal (untuk Ingress)
---
# ---------- Ingress (akses publik via domain + HTTPS) ----------
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: infradev-ingress
namespace: infradev
annotations:
kubernetes.io/ingress.class: "nginx" # gunakan Ingress NGINX
cert-manager.io/cluster-issuer: "letsencrypt-prod" # issuer TLS cert-manager
spec:
tls:
- hosts:
- infradev.masdika.biz.id # domain publik
secretName: infradev-tls # nama secret TLS otomatis dibuat cert-manager
rules:
- host: infradev.masdika.biz.id # host/domain yang diarahkan
http:
paths:
- path: / # route path
pathType: Prefix
backend:
service:
name: infradev-service # service tujuan
port:
number: 80 # port service tujuan
Apply ke cluster:
kubectl apply -f infradev-final.yaml
π 3. Konfigurasi DNS
Arahkan domain/subdomain ke IP publik dari Ingress Controller (MetalLB):
infradev.masdika.biz.id β 206.237.97.18
Atur di Cloudflare sebagai A Record. Proxy (βοΈ) bisa ON atau OFF, karena cert-manager pakai DNS-01 challenge.
π 4. SSL Otomatis dengan cert-manager
Cert-manager akan otomatis bikin sertifikat TLS dari Letβs Encrypt. Cek status:
kubectl -n infradev get certificate
kubectl -n infradev describe certificate infradev-tls

Kalau sukses, aplikasi bisa diakses lewat:
https://infradev.masdika.biz.id


β‘ Kesimpulan
Dengan setup ini:
- β Next.js berjalan di Kubernetes
- β Routing via Ingress NGINX
- β SSL otomatis via cert-manager (Letβs Encrypt)
- β MetalLB kasih IP publik
Hasilnya, aplikasi kamu lebih aman, scalable, dan production-ready ππ₯
π Yuk coba implementasi di projectmu! Kalau ada masalah kayak DNS belum resolve atau sertifikat belum issued, cek log cert-manager dan pastikan DNS di Cloudflare udah benar. π
Pendahuluan Bayangkan sebuah cluster Kubernetes yang kemarin masih berjalan normal. Semua service aktif, storage Longhorn stabil, dan aplikasi berjalan tanpa…
Dalam dunia Cloud Computing dan DevOps, tiga istilah yang paling sering kita dengar adalah Virtual Machine (VM), Container, dan Pod….