ClusterIP vs. NodePort vs. LoadBalancer vs. ExternalName: Service Type Selection
ClusterIP (internal only), NodePort (node-level external access), LoadBalancer (cloud LB per service), ExternalName (DNS alias to external) — use Ingress ins...
Quick Answer: ClusterIP (internal only), NodePort (node-level external access), LoadBalancer (cloud LB per service), ExternalName (DNS alias to external) — use Ingress instead of LoadBalancer for HTTP services.
Detailed Answer:
| Type | Access | Use Case | Production? | |---|---|---|---| | ClusterIP | Inside cluster only | Microservice-to-microservice | ✅ Default choice | | NodePort | Node IP + static port | Dev/testing quick access | ⚠️ Avoid in prod | | LoadBalancer | External via cloud LB | Non-HTTP services (TCP/UDP) | ✅ For L4 only | | ExternalName | DNS CNAME alias | Route to external services | ✅ For external routing |
# ClusterIP (default) — internal only
spec:
type: ClusterIP
clusterIP: 10.96.0.100 # Or omit — auto-assigned
# Access: curl http://my-svc:80 from inside cluster
# NodePort — opens port on every node
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 30080 # Range: 30000-32767
# Access: curl http://<node-ip>:30080
# LoadBalancer — provisions cloud LB (AWS NLB/ALB)
spec:
type: LoadBalancer
# On EKS with AWS Load Balancer Controller:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: external
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: ip
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
# Access: curl http://<aws-lb-hostname>
# ExternalName — DNS alias
spec:
type: ExternalName
externalName: mydb.us-east-1.rds.amazonaws.com
# Access: curl http://my-db-svc → resolves to RDS endpoint
# Useful for migrating apps to K8s while DB stays outside
Decision Tree:
HTTP/HTTPS traffic?
├── YES → Multiple services? → Use Ingress + ClusterIP
└── NO → TCP/UDP direct access?
├── Internal only → ClusterIP
├── External L4 → LoadBalancer
└── External routing to outside K8s → ExternalName
Key Takeaway: Use ClusterIP for everything internal, Ingress+ClusterIP for external HTTP, and LoadBalancer only for non-HTTP protocols like databases or game servers.
Finished reading?
Mark as complete to claim your +10 XP and track progress.
