Services are an essential concept in Kubernetes. When you create a Deployment, the Deployment will manage a ReplicaSet, which manages the underlying Pods.
However, the Pods are ephemeral and can be terminated and replaced at anytime. Unlike Pods managed by StatefulSets, Pods managed by Deployments do not have a stable name. They are assigned a random hash suffix as part of their name. So, when a pod is terminated and replaced by a new one, the name of the new Pod will be different from the name of the old Pod, and also its IP address will be different.
If you want to access your application, you need a stable endpoint for your underlying Pods. This is where Services come into play.
Services groups Pods together and provides a stable endpoint to access the Pods. The grouping of Pods is done by a label selector defined in the Service manifest.