I will end up having around 20 microservices on the Kubernetes cluster eventually. I am thinking "services meshes" like Istio are overkill. if I have to do just basic "service discovery and communication" within each of the 20 microservices with 1 external ingress/LB (for public traffic), do I need to create a K8's 'service' type for each of the 20 microservices so that they can call each other over http/grpc?
Correct, you need a Service
for everything you call. Service
is a LoadBalancer, it spreads the load and hides the scale and placement of the underlying pods, plus it gives you a service discovery based on DNS.