<p>I have a composite service S.c which consumes 2 atomic service S.a and S.b where all three services are running in Kubernetes cluster. What would be a better pattern</p>

<p>1) Create Sa,Sb as a headless service and let Sc integrate with them via external Loadbalancer like NGINX+ (which uses DNS resolver to maintain updated backend pods)</p>

<p>2) Create Sa,Sb with clusterIP and let Sc access/resolve them via cluster DNS (skyDNS addon). Which will internally leverage IP-Table based load-balancing to pods.</p>

<p>Note: My k8s cluster is running on custom solution (on-premise VMs)
We have many composite services which consume 1 to many atomic services (like example above).  </p>

<p>Edit: In few scenarios I would also need to expose services to external network
like Sb would need access both from Sc and outside.
In such it would make more sense to create Sb as a headless service, otherwise DNS resolver would always return only the clusterIP address and all external request will also get routed to clusterIP address.
My challenge is both scenarios (intra vs inter) are conflicting with each other</p>

<p>example: nginx-service (which has clusterIP) and nginx-headless-service (headless)</p>

<pre><code> / # nslookup nginx-service
 Server:    172.16.48.11
 Address 1: 172.16.48.11 kube-dns.kube-system.svc.cluster.local

 Name:      nginx-service
 Address 1: 172.16.50.29 nginx-service.default.svc.cluster.local

 / # nslookup nginx-headless-service
 Server:    172.16.48.11
 Address 1: 172.16.48.11 kube-dns.kube-system.svc.cluster.local

 Name:      nginx-headless-service
 Address 1: 11.11.1.13 wrkfai1asby2.my-company.com
 Address 2: 11.11.1.15 imptpi1asby.my-company.com
 Address 3: 11.11.1.4 osei623a-sby.my-company.com
 Address 4: 11.11.1.6 osei511a-sby.my-company.com
 Address 5: 11.11.1.7 erpdbi02a-sbyold.my-company.com
</code></pre>

<p>Using DNS + cluster IPs is the simpler approach, and doesn't require exposing your services to the public internet. Unless you want specific load-balancing features from nginx, I'd recommend going with #2.</p>
