Active Nerds
Module #66 · beginner Article

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

4 min read+10 XPPublished 2026-05-29

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.