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. π

π Apa itu K3s? K3s adalah distribusi Kubernetes ringan dari Rancher yang dirancang untuk mempermudah proses instalasi dan penggunaan Kubernetes….

Mau bikin website WordPress super cepat, aman, dan bisa di-scale di Kubernetes? π‘ Artikel ini akan membahas langkah demi langkah…
Nice mas
Thanks mas ehehe π