Next, we should deploy a Service that sits in front of the backend Pods. As a recap, every backend Pod inside the backend Deployment will have its own IP address, but these addresses can change as Pods are destroyed and created. Having a Service that sits in front of these Pods allow other parts of the application to access these backend Pods in a consistent manner.
Create a new manifest file at ./manifests/backend/service.yaml with the following content:
apiVersion: v1
kind: Service
metadata:
name: backend
labels:
app: backend
spec:
selector:
app: backend
ports:
- port: 8080
name: api
- port: 8100
name: docs
And deploy it using kubectl apply:
$ kubectl apply -f ./manifests/backend/service.yaml
service "backend" created
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
backend ClusterIP 10.32.187.38 <none> 8080/TCP,8100/TCP 4s
elasticsearch ClusterIP None <none> 9200/TCP,9300/TCP 1d
kubernetes ClusterIP 10.32.0.1 <none> 443/TCP 1d
Our backend Service is now reachable through its Cluster IP (10.32.187.38, in our example). However, that is a private IP address, accessible only within the cluster. We want our API to be available externally – to the wider internet. To do this, we need to look at one final Kubernetes Object—Ingress.