ClusterIP Services

ClusterIP is the default Service type, reachable only from inside the cluster.

Syntaxspec: type: ClusterIP # default, can be omitted selector: { app: <label> } ports: - port: <port> targetPort: <containerPort>

ClusterIP is the default Service type. It gives your Pods a virtual IP that is reachable only from within the cluster β€” perfect for internal traffic between microservices.

When to use it

  • A backend API that only your frontend Pods call.
  • A database or cache that should never be exposed publicly.
  • Any service-to-service communication inside the cluster.

Reaching it

Other Pods connect using the Service's DNS name, typically just its name within the same namespace. No IP addresses to remember.

Example

Example Β· yaml
apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  type: ClusterIP
  selector:
    app: backend
  ports:
    - port: 8080
      targetPort: 8080
# Reach it from another Pod as: http://backend:8080

When to use it

  • A backend API Service is exposed as ClusterIP so only other pods inside the cluster can call it, preventing any external access.
  • A Redis cache is published as a ClusterIP Service so application pods can connect to redis-svc:6379 without knowing any pod IPs.
  • A headless ClusterIP Service (clusterIP: None) lets StatefulSet pods discover peer pods via DNS for peer-to-peer clustering.

More examples

ClusterIP Service for internal API

Creates a ClusterIP Service accessible only within the cluster at api-internal:8080, selecting all pods labelled app=api.

Example Β· yaml
apiVersion: v1
kind: Service
metadata:
  name: api-internal
spec:
  type: ClusterIP
  selector:
    app: api
  ports:
    - port: 8080
      targetPort: 8080

Test ClusterIP connectivity

Tests a ClusterIP Service from within the cluster using both the short name and the full DNS name across namespaces.

Example Β· bash
# From another pod in the same namespace
kubectl run curl --image=curlimages/curl --rm -it -- \
  curl http://api-internal:8080/health

# From a different namespace using FQDN
curl http://api-internal.default.svc.cluster.local:8080/health

Headless Service for StatefulSet

Sets clusterIP: None to create a headless Service that returns individual pod IPs via DNS, required by StatefulSets.

Example Β· yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql-headless
spec:
  clusterIP: None
  selector:
    app: mysql
  ports:
    - port: 3306

Discussion

  • Be the first to comment on this lesson.
ClusterIP Services β€” Kubernetes | SoundsCode