Skip to content

robtuley/rainchasers

Repository files navigation

Rainchasers Gauge Service

Responsible for retrieving updates from various flavours of river gauges and providing a consistent stream of these through Google Pub/Sub and presenting out a gauge API.

  • Recent levels polling in /cmd/ea, daily batch reconciliation via /cmd/eaday
  • Station identifiers include an @id of the data URL, RLOIid and wiskiID also available

The EA Hydrology API provides access to quality checked historical data. This is not used yet.

  • Recent levels polled in /cmd/nrw
  • Station identifier is RLOIid

This is an authenticated API and requires an API key (from your profile) to be stored in k8s:

kubectl create secret generic -n default nrw-apikey \
--from-literal=key=<your API Key>
  • Recent levels polled in /cmd/sepa
  • Station identifiers is an integer "location code" which appears in the data URL

Not Used Yet

Deployment

Deployed onto k8s (GKE), with a continuous deliovery pipeline via Google Cloud Build.

  • Create a Google Pub/Sub topic gauge for the snapshot updates
  • Create a service account that can access Pub/Sub topic for the applications
  • Add the relevant GKE secrets for Honeycomb, NRW & Algolia
  • Create Google Cloud build deployments for each application using the templated cloudbuild.yaml and the _APP subsitution variable.
  • Deploy to k8s cluster using the relavnt deployment.yaml

Pub/Sub & Firestore Permissions via Service Account

Following [this process to allow access to pub/sub from the deamons](https://cloud.google.com/kubernetes-engine/docs/tutorials/authenticating-to-cloud-platform.

  • Create a rainchasers-app service account in the project. Grant the Pub/Sub Editor and Cloud Datastore User roles.
  • load the json key file as a secret kubectl create secret generic service-accn-key --from-file=key.json=<filename>.json

Honeycomb

The k8s cluster needs the Honeycomb API key in a secrets store:

kubectl create secret generic -n default honeycomb-writekey \
  --from-literal=key=<your API Key>

Daemons will post events to Honeycomb alongside JSON structured logs to Stdout.

Algolia

The firestore daemon persists the river state infomation to Algolia SAAS search service and this requires algolia credentials:

kubectl create secret generic -n default algolia-writekey \
  --from-literal=id=<app ID> --from-literal=key=<admin API key>

GKE

The service is designed to be deployed to a Google Cloud k8s cluster.

# setup kubectl access
gcloud config set project rainchasers
gcloud config set compute/zone europe-west2-b
gcloud container clusters get-credentials prod

# create the deployments
kubectl apply -f ./cmd/ea/deployment.yaml
kubectl apply -f ./cmd/nrw/deployment.yaml
kubectl apply -f ./cmd/sepa/deployment.yaml
kubectl apply -f ./cmd/store/deployment.yaml
kubectl apply -f ./cmd/web/deployment.yaml
kubectl apply -f ./cmd/web/service.yaml

# view the web IP
kubectl get service com-rainchasers --output yaml