Forward to ExternalName with traefik in kubernetes as the documenation suggests

3/22/2018

Following the Official Guide I got to the section onForwarding to ExtternalNames. Where it says:

When specifying an ExternalName, Træfik will forward requests to the given host accordingly

which points to the docs from kubernetes services without selectors

Which led me to create a service

kind: Service
apiVersion: v1
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

Of which Traefik happily ignores when I point to it:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-service
  namespace: kube-system
spec:
  rules:
  - host: my-service.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-service
          servicePort: 4080

I have also tried as an endpoint.

---                                                                                                                                                                                           
kind: Service
apiVersion: v1
metadata:
  name: my-service
  namespace: kube-system
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 4080
---
kind: Endpoints
apiVersion: v1
metadata:
  name: my-service
subsets:
  - addresses:
      - ip: 10.0.0.3
    ports:
      - port: 4080

Does anyone know how to get traefik to point to an externalname as the documentation suggests?

-- thoth
kubernetes
traefik

1 Answer

3/22/2018

As I see, you missed at least one line in your Ingress object - traefik.frontend.passHostHeader: "false".

Also, you need to create an Ingress object in a same Namespace with your Service.

So, your Ingress should be like:

apiVersion: extensions/v1beta1 kind: Ingress metadata: name: my-service namespace: prod annotations: traefik.frontend.passHostHeader: "false" spec: rules: - host: my-service.example.com http: paths: - path: / backend: serviceName: my-service servicePort: 4080

And service:

kind: Service apiVersion: v1 metadata: name: my-service namespace: prod spec: type: ExternalName ports: - name: app-port port: 4080 externalName: my.database.example.com

-- Anton Kostenko
Source: StackOverflow