Kubernetes have advanced networking capabilities that allow Pods and Services to communicate inside the cluster's network and externally.
In this scenario, you will learn the following types of Kubernetes services.
Cluster IP
Target Ports
NodePort
External IPs
Load Balancer
Kubernetes Services are an abstract that defines a policy and approach on how to access a set of Pods. The set of Pods accessed via a Service is based on a Label Selector.
More information on defining a Service is available via it's spec definition. https://github.com/kubernetes-client/python/blob/master/kubernetes/docs/V1ServiceSpec.md
Documentation is available at https://kubernetes.io/docs/concepts/services-networking/service/

Steps
Networking Introduction
Step 1 - Cluster IP
Cluster IP is the default approach when creating a Kubernetes Service. The service is allocated an internal IP that other components can use to access the pods.
By having a single IP address it enables the service to be load balanced across multiple Pods.
Services are deployed via kubectl apply -f clusterip.yaml
.
The definition can be viewed at cat clusterip.yaml
This will deploy a web app with two replicas to showcase load balancing along with a service. The Pods can be viewed at kubectl get pods
It will also deploy a service. kubectl get svc
More details on the service configuration and active endpoints (Pods) can be viewed via kubectl describe svc/webapp1-clusterip-svc
After deploying, the service can be accessed via the ClusterIP allocated.
export CLUSTER_IP=$(kubectl get services/webapp1-clusterip-svc -o go-template='{{(index .spec.clusterIP)}}')
echo CLUSTER_IP=$CLUSTER_IP
curl $CLUSTER_IP:80
Multiple requests will showcase how the service load balancers across multiple Pods based on the common label selector.
curl $CLUSTER_IP:80