Services, as defined by the Service API, allow for a basic level of Layer 3/4 load balancing.
Ingress is the most useful if you want to expose multiple services under the same IP address, and these services all use the same L7 protocol (typically HTTP).
If ingress controller routes request to service itself and service allows a basic level Layer3/4 round robin load balancing to pods , where is Layer 7 load balancing here ? It is just layer 7 for routing not load balancing, right?
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
ingress.kubernetes.io/rewrite-target: /
name: web-ingress
spec:
rules:
- host: kubernetes.foo.bar
http:
paths:
- backend:
serviceName: appsvc
servicePort: 80
path: /app
Ingress's main job is L7 routing. The backend services do the actual pod level load balancing. But some Ingress controllers are bootstrapped with some load balancing policy settings, such as the load balancing algorithm, backend weight scheme, rate limiting etc.
https://kubernetes.io/docs/concepts/services-networking/ingress/#loadbalancing
See the features's supported by Traefik other than just L7 routing here:
https://docs.traefik.io/v1.7/configuration/backends/kubernetes/#general-annotations