|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# Call it with the namespace to monitor |
| 4 | +namespace=${1:-default} |
| 5 | + |
| 6 | +# API URL setup. Requires an ambassador API proxy running side-by-side |
| 7 | +base=http://localhost:8001 |
| 8 | +ns=namespaces/$namespace |
| 9 | +k8s_service_url=$base/api/v1/$ns/services |
| 10 | +k8s_ingress_url=$base/apis/extensions/v1beta1/$ns/ingresses |
| 11 | + |
| 12 | +# Watch the K8s API on events on service objects |
| 13 | +echo "::: Starting to wait for events" |
| 14 | +curl -N -s -k $k8s_service_url?watch=true | while read event |
| 15 | +do |
| 16 | + # Event type |
| 17 | + type=$(echo $event | jq -r '.type') |
| 18 | + # Annotation "expose" on service |
| 19 | + expose=$(echo $event | jq -r '.object.metadata.annotations.expose?') |
| 20 | + # Firt service port |
| 21 | + port=$(echo $event | jq -r '.object.spec.ports[0]?.port') |
| 22 | + # Service |
| 23 | + service=$(echo $event | jq -r .object.metadata.name) |
| 24 | + |
| 25 | + echo "::: $type -- $service [$port] expose = $expose" |
| 26 | + |
| 27 | + # If a new service has been added and when its labeled with "expose", then |
| 28 | + # create an ingress objecgt for it |
| 29 | + if [ $type = "ADDED" ] && [ $expose != 'null' ]; then |
| 30 | + # Check for Ingress with the same name |
| 31 | + http_code=$(curl -s -o /dev/null -w "%{http_code}" $k8s_ingress_url/$service) |
| 32 | + if [ $http_code != 200 ]; then |
| 33 | + echo "::: Creating Ingress backend for service '$service'" |
| 34 | + cat - << EOT | curl -s -H "Content-Type: application/json" -X "POST" -d @- $k8s_ingress_url |
| 35 | +{ |
| 36 | + "apiVersion": "extensions/v1beta1", |
| 37 | + "kind": "Ingress", |
| 38 | + "metadata": { |
| 39 | + "name": "$service", |
| 40 | + "namespace": "$namespace" |
| 41 | + }, |
| 42 | + "spec": { |
| 43 | + "rules": [{ |
| 44 | + "http": { |
| 45 | + "paths": [{ |
| 46 | + "backend": { |
| 47 | + "serviceName": "$service", |
| 48 | + "servicePort": $port |
| 49 | + }, |
| 50 | + "path": "$expose" |
| 51 | + }] |
| 52 | + } |
| 53 | + }] |
| 54 | + } |
| 55 | +} |
| 56 | +EOT |
| 57 | + echo |
| 58 | + else |
| 59 | + echo "::: Ingress '$service' already exists. Skipping ..." |
| 60 | + fi |
| 61 | + fi |
| 62 | +done |
0 commit comments