====== Kubernetes Headless Service ====== Kubernetes Services are a fundamental abstraction that defines how pods are accessed within a cluster. While most people are familiar with **ClusterIP**, **NodePort**, and **LoadBalancer** services, **Headless Services** serve a very different and powerful purpose. This article covers what a Kubernetes Headless Service is, why it exists, how it works, and when to use it \\ \\ ==== What Is a Headless Service? ==== A **Headless Service** is a Kubernetes Service without **a Cluster IP**. Instead of a single virtual IP and load balancing, it provides direct pod IP access via DNS. You create a headless service by setting: spec: clusterIP: None When this is done: * Kubernetes does **not** allocate a virtual IP. * Kube-proxy does **not** perform load balancing. * DNS returns **pod IPs directly**, not a single service IP. \\ \\ ==== Why Headless Services Exist ==== Traditional services abstract away individual pods and provide load balancing. However, some applications **need to know exactly which pod they are talking to**. There are some scenarios where more fine grained controlled is needed on which pod we want to connect for a specific need. Common reasons can include: * Stateful applications (databases, message brokers, caching systems) * Leader–follower architectures * Custom client-side load balancing * Peer discovery systems Headless services enable **service discovery without traffic routing**. \\ \\ ==== With a Normal Service ==== A DNS query in normal Service my-service.default.svc.cluster.local returns a service IP: 10.96.0.15 Traffic is load-balanced across pods. \\ \\ ==== With a Headless Service ==== DNS query: my-headless-service.default.svc.cluster.local Returns: 10.244.1.5 10.244.2.8 10.244.3.12 Each IP corresponds to a **pod**, not the service. The client has the control to decide: * Which pod to connect to * How to load-balance or route traffic \\ \\ ==== Creating a Headless Service ==== To create a headless service, clusterIP needs to be set to **None** in the definition of a clusterIP server. Here is an example : apiVersion: v1 kind: Service metadata: name: my-headless-service spec: clusterIP: None selector: app: my-app ports: - port: 80 targetPort: 8080 Key points: * **clusterIP: None** makes it headless * Pods matching the selector are published via DNS. * No virtual IP is created. \\ \\ ==== Headless Service with StatefulSets ==== Headless services are most commonly used with **StatefulSets**. **Why do we need it?** StatefulSets give each pod: * A stable hostname * A stable network identity * Persistent storage Example DNS names: pod-0.my-headless-service.default.svc.cluster.local pod-1.my-headless-service.default.svc.cluster.local This is ideal for: * Databases like Cassandra, MongoDB, MySQL * Kafka and Zookeeper * etcd clusters \\ \\ ==== DNS Records in Headless Services ==== Depending on the configuration, Kubernetes creates: * **A records** → One per pod IP * **SRV records** → For named ports Example SRV lookup: my-port.tcp.my-headless-service.default.svc.cluster.local This allows advanced clients to discover: * Pod IP * Port * Protocol \\ \\ ==== When to use a Headless Service ==== Use a headless service when: * You need **direct pod-to-pod communication.** * Clients must **discover all pods.** * You want **custom or client-side load balancing.** * You're running **stateful or clustered applications.** Do **not** use it when: * You just want simple load balancing. * You want a single stable service IP. * The app does not need pod awareness. \\ \\ ==== Advantages and Limitations ==== === Advantages === * Full control over traffic routing. * Essential for stateful workloads. * Works seamlessly with StatefulSets. * Enables advanced service discovery. === Limitations === * No built-in load balancing. * Client logic becomes more complex. * Not suitable for simple stateless apps. ---- Author: https://medium.com/@narinderkaurmakkar1