0
0
KubernetesHow-ToBeginner · 3 min read

How to Expose a Kubernetes Deployment as a Service

To expose a Kubernetes Deployment as a Service, use the kubectl expose deployment command with a service type like ClusterIP, NodePort, or LoadBalancer. This creates a stable network endpoint to access your pods managed by the deployment.
📐

Syntax

The basic syntax to expose a deployment as a service is:

  • kubectl expose deployment <deployment-name>: Specifies which deployment to expose.
  • --type=<service-type>: Defines how the service is exposed (ClusterIP, NodePort, LoadBalancer, ExternalName).
  • --port=<port-number>: The port the service will listen on.
  • --target-port=<container-port>: The port on the pod containers to forward traffic to.
bash
kubectl expose deployment <deployment-name> --type=<service-type> --port=<port-number> --target-port=<container-port>
💻

Example

This example exposes a deployment named nginx-deployment as a NodePort service on port 80, forwarding traffic to container port 80. This allows access to the deployment from outside the cluster on a high port.

bash
kubectl expose deployment nginx-deployment --type=NodePort --port=80 --target-port=80
Output
service/nginx-deployment exposed
⚠️

Common Pitfalls

  • Forgetting to specify --type defaults to ClusterIP, which is only accessible inside the cluster.
  • Using NodePort without knowing the assigned port range (usually 30000-32767) can cause confusion.
  • Not matching --target-port to the container's actual listening port causes connection failures.
  • Trying to use LoadBalancer type without cloud provider support will not create an external IP.
bash
kubectl expose deployment nginx-deployment --port=80
# This creates a ClusterIP service, not accessible outside the cluster

kubectl expose deployment nginx-deployment --type=NodePort --port=80 --target-port=8080
# Wrong target-port if container listens on 80, causes failure
📊

Quick Reference

Service TypeDescriptionUse Case
ClusterIPExposes service on internal cluster IPInternal communication between pods
NodePortExposes service on each node’s IP at a static portAccess service from outside cluster on node IP
LoadBalancerCreates external load balancer (cloud providers)Public access with cloud load balancer
ExternalNameMaps service to external DNS nameAccess external services via DNS

Key Takeaways

Use kubectl expose deployment with --type to create a service for your deployment.
ClusterIP is default and only accessible inside the cluster.
NodePort allows external access via node IP and a high port number.
LoadBalancer requires cloud support to get an external IP.
Match --target-port to the container port to avoid connection issues.