I am tried to troubleshoot a scenario where traefik ingress is not load balancing between the backends defined in the ingress rule.
Here’s some background.
I have a pod, that has two instances of the same app container. Each instance listening on a different port.
I have created two different services, with each service routing to one of the app instances, based on targetPort.
Here’s how these services look.
apiVersion: v1 kind: Service metadata: name: app1 namespace: exp spec: ports: - name: http port: 80 protocol: TCP targetPort: 9000 selector: service: app1-service sessionAffinity: None type: ClusterIP
apiVersion: v1 kind: Service metadata: name: app1-s1 namespace: exp spec: ports: - name: http port: 80 protocol: TCP targetPort: 9001 selector: service: app1-service sessionAffinity: None type: ClusterIP
I can hit these services and reach the respective container instance.
However, I am trying to put both of these container instances, behind a single IP.
So,, that services that consume this app, can reach to both instances of the container within the pod.
And for this reason, I am trying to leverage traefik ingress vs a native k8s service, which I couldnt figure out if there is a way to do.
So, here’s how I created the traefik ingress rule.
apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: traefik.ingress.kubernetes.io/service-weights: | app1-s1: 50% app1: 50% name: app1-traefik namespace: exp spec: rules: - host: app1-traefik http: paths: - backend: serviceName: app1-s1 servicePort: 8001 path: / - backend: serviceName: app1 servicePort: 80 path: /
I also have a service app1-traefik, setup this way.
apiVersion: v1 kind: Service metadata: name: app1-traefik namespace: exp spec: externalName: traefik-ingress-service.kube-system.svc.clusterexp sessionAffinity: None type: ExternalName
I try to hit the url app1-traefik from the pods, that want to consume the app1 service in the two containers within the pod.
It works, but it always seems to route to the pod behind the service defined to the end/last in the ingress rule above.
In the ingress rule above “app1-traefik”, app1 port 80 is defined to the end. And the requests via app1-traefik always go to the container behind this service.
the service weights seem to be playing no role here..or are not being honored.
And if and when I move app1-s1 on port 8001 to the end, the requests sent via app1-traefik seems to be always going to the container behind service app1-s1.
Note that I currently successfully use traefik, where the two backend services in the ingress rules are pointing to container in different pods.
However, this seems to not work when the containers are in the same pod.
Is this the expected behavior? Or am I missing something here?
Thanks and greatly appreciate any pointers.