Search code examples
kubernetestraefiktraefik-ingress

How to use Traefik IngressRoute on a Headless Service


I am trying to configure a Traefik IngressRoute to point to a Headless service (the service point to a Database behind the cluster). The Setup work well with a "normal" service (with the endpoint inside the cluster). I am using traefik 2.3.

But when I try to create an ingressRoute that point to the headless service, I have that error in the traefik logs:

time="2020-11-27T10:41:53Z" level=error msg="cannot define a port for dev/-central-db-service" ingress=webapp-ingressroute providerName=kubernetescrd namespace=traefik

time="2020-11-27T10:41:54Z" level=error msg="cannot define a port for dev/central-db-service" providerName=kubernetescrd ingress=webapp-ingressroute namespace=traefik

Here is the IngressRoute I am trying to create, along with the Headless service with endpoint:

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: webapp-ingressroute
  namespace: traefik
  labels:
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`couchdb.test.io`)
      kind: Rule
      services:
        - name: central-db-service
          kind: Service
          port: 5984
          namespace: dev
  tls:
    secretName: certificate
---
kind: Endpoints
apiVersion: v1
metadata:
  name: central-db-service
  namespace: dev
subsets:
  - addresses:
        - ip: 192.168.0.50
    ports:
      - port: 5984
        name: central-db-service
---
kind: Service
apiVersion: v1
metadata:
  name: central-db-service
  namespace: dev
spec:
  clusterIP: None
  ports:
  - port: 5984
    targetPort: 5984

The setup work perfectly with a "normal" service.

What did I miss? Is it even possible to point to headless service with traefik 2.3 ? Thanks in advance for your help.


Solution

  • Resolved !

    The error came from a misconfiguration of my service and endpoints.

    The name I set for the port of my endpoints didn't match the name of the port of the service (in fact, I didn't set a name). Once the ports in the endpoints and the ports in the services have the same name set, everything worked fine.

    kind: Endpoints
    apiVersion: v1
    metadata:
      name: central-db-service
      namespace: dev
    subsets:
      - addresses:
            - ip: 192.168.0.50
        ports:
          - port: 5984
            name: central-db-service
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: central-db-service
      namespace: dev
    spec:
      clusterIP: None
      ports:
      - port: 5984
        targetPort: 5984
        name: central-db-service