kubernetes

Kubernetes Ingress to External Service?


Say I have a service that isn't hosted on Kubernetes. I also have an ingress controller and cert-manager set up on my kubernetes cluster.

Because it's so much simpler and easy to use kubernetes ingress to control access to services, I wanted to have a kubernetes ingress that points to a non-kubernetes service.

For example, I have a service that's hosted at https://10.0.40.1:5678 (ssl required, but self signed certificate) and want to access at service.example.com.


Solution

  • You can do it by manual creation of Service and Endpoint objects for your external server.

    Objects will looks like that:

    apiVersion: v1
    kind: Service
    metadata:
      name: external-ip
    spec:
      ports:
      - name: app
        port: 80
        protocol: TCP
        targetPort: 5678
      clusterIP: None
      type: ClusterIP
    ---
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: external-ip
    subsets:
    - addresses:
      - ip: 10.0.40.1
      ports:
      - name: app
        port: 5678
        protocol: TCP
    

    Also, it is possible to use an EndpointSlice object instead of Endpoints.

    Then, you can create an Ingress object which will point to Service external-ip with port 80:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: external-service
    spec:
      rules:
      - host: service.example.com
        http:
          paths:
          - backend:
              serviceName: external-ip
              servicePort: 80
            path: /