How can I expose my Hasura microservice on multiple ports?

12/12/2017

My microservice has multiple containers, each of which needs access to a different port. How do I expose this service on multiple ports using the Hasura CLI and project configuration files?

Edit: Adding the microservice's k8s.yaml (as requested by @iamnat) Let's say I have two containers, containerA and containerB, that I want to expose over HTTP on ports 6379 and 8000 respectively.

apiVersion: v1
items:
- apiVersion: extensions/v1beta1
  kind: Deployment
  metadata:
    creationTimestamp: null
    labels:
      app: www
      hasuraService: custom
    name: www
    namespace: '{{ cluster.metadata.namespaces.user }}'
  spec:
    replicas: 1
    strategy: {}
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: www
      spec:
        containers:
        - name: containerA
          image: imageA
          ports:
          - containerPort: 6379
        - name: containerB
          image: imageB
          ports:
          - containerPort: 8000
        securityContext: {}
        terminationGracePeriodSeconds: 0
  status: {}
- apiVersion: v1
  kind: Service
  metadata:
    creationTimestamp: null
    labels:
      app: www
      hasuraService: custom
    name: www
    namespace: '{{ cluster.metadata.namespaces.user }}'
  spec:
    ports:
    - port: 6379
      name: containerA
      protocol: HTTP
      targetPort: 6379

    - port: 8000
      name: containerB
      protocol: HTTP
      targetPort: 8000

    selector:
      app: www
    type: ClusterIP
  status:
    loadBalancer: {}
kind: List
metadata: {}
-- sandip
hasura
kubernetes

1 Answer

1/8/2018

TL;DR: - Add an API gateway route for each HTTP endpoint you want to expose [docs]


Inside the kubernetes cluster, give your k8s spec this is what your setup will look like:

http://www.default:8000  -> containerA
http://www.default:6379  -> containerB

So you need to create a route for each of those HTTP paths in conf/routes.yaml.

www-a:
  /:
    upstreamService:
      name: www
      namespace: {{ cluster.metadata.namespaces.user }}
    upstreamServicePath: /
    upstreamServicePort: 8000
    corsPolicy: allow_all
www-b:
  /:
    upstreamService:
      name: www
      namespace: {{ cluster.metadata.namespaces.user }}
    upstreamServicePath: /
    upstreamServicePort: 6379
    corsPolicy: allow_all

This means that, you'll get the following:

https://www-a.domain.com -> containerA
https://www-a.domain.com -> containerB
-- iamnat
Source: StackOverflow