/romulus

A kubernetes ingress controller

Primary LanguageGoMIT LicenseMIT

romulusd

GoDoc

Automagically register your kubernetes services in a loadbalancing proxy!

Supported loadbalancers: vulcand, traefik

Romulus works as an ingress controller in kubernetes. It listens for Ingress or Service additions / updates and registers the connected Endpoints in your backend loadbalancer provider. If you don't want to / can't use Ingress (because you're running an older kubernetes) then you can control resource routes with annotations in your Services.

Usage

usage: romulusd [<flags>]

A kubernetes ingress controller

Flags:
  --help               Show context-sensitive help (also try --help-long and --help-man).
  -k, --kube-api=http://127.0.0.1:8080
                       URL for kubernetes api
  --kube-api-ver="v1"  kubernetes api version
  --kube-user=KUBE-USER
                       kubernetes username
  --kube-pass=KUBE-PASS
                       kubernetes password
  --kube-insecure      Run kubernetes client in insecure mode
  -s, --selector=label=value
                       label selectors. Leave blank for Everything(). Form: key=value
  -a, --annotations-prefix="romulus/"
                       annotations key prefix
  -p, --provider=vulcand
                       LoadBalancer provider
  --sync-interval=1h   Resync period with kube api
  --lb-timeout=10s     Timeout for communicating with loadbalancer provider
  --vulcan-api=http://127.0.0.1:8182
                       URL for vulcand api
  --traefik-etcd=TRAEFIK-ETCD
                       etcd peers for traefik
  -l, --log-level=info
                       log level. One of: fatal, error, warn, info, debug

If you are using Ingress, create your things as follows (assuming you set --selector=route=public):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: api-v1
  namespace: myapp
  labels:
    romulus/route: public
spec:
  rules:
  - host: www.example.com
    paths:
    - path: /v1
      backend:
        serviceName: microservice-v1
        servicePort: api
---
apiVersion: v1
kind: Service
metadata:
  name: microservice-v1
  namespace: myapp
  labels:
    romulus/route: public
spec:
  selector:
    app: myapi
    version: v1
  ports:
  - name: api
    port: 80
    targetPort: http
    protocol: TCP

If you do not use Ingresses:

apiVersion: v1
kind: Service
metadata:
  name: blog
  namespace: myblog
  annotations:
    romulus/host: 'www.example.com'
    romulus/prefix: '/blog'
    romulus/pass_host_header: true
    romulus/trust_forward_headers: true
  labels:
    romulus/route: public
spec:
  selector:
    app: blog
  ports:
  - name: web
    port: 80
    targetPort: http
    protocol: TCP

When you create these things, Romulus will turn around and upsert routes to the resulting Endpoints in your loadbalancer provider!

See the docs and the examples for more info