From 7084c46f89d9b919dfbb4dd7c0b9bc1f4f62f63e Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 8 Feb 2026 13:16:38 +0000 Subject: [PATCH] Add Kubernetes manifests for routing engines Deployments and Services for osrm-foot (256-512MB), osrm-bicycle (256-512MB), and OTP (1-2GB). Includes PVCs for data storage and an init Job to download and pre-process Greater London OSM data. --- k8s/osrm-bicycle.yaml | 53 ++++++++++++++++++++++++++++++++++ k8s/osrm-foot.yaml | 53 ++++++++++++++++++++++++++++++++++ k8s/osrm-init-job.yaml | 64 ++++++++++++++++++++++++++++++++++++++++++ k8s/otp.yaml | 53 ++++++++++++++++++++++++++++++++++ k8s/routing-pvcs.yaml | 21 ++++++++++++++ 5 files changed, 244 insertions(+) create mode 100644 k8s/osrm-bicycle.yaml create mode 100644 k8s/osrm-foot.yaml create mode 100644 k8s/osrm-init-job.yaml create mode 100644 k8s/otp.yaml create mode 100644 k8s/routing-pvcs.yaml diff --git a/k8s/osrm-bicycle.yaml b/k8s/osrm-bicycle.yaml new file mode 100644 index 0000000..487fc19 --- /dev/null +++ b/k8s/osrm-bicycle.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: osrm-bicycle + labels: + app: osrm-bicycle +spec: + replicas: 1 + selector: + matchLabels: + app: osrm-bicycle + template: + metadata: + labels: + app: osrm-bicycle + spec: + containers: + - name: osrm-bicycle + image: ghcr.io/project-osrm/osrm-backend:latest + command: ["osrm-routed", "--algorithm", "MLD", "/data/bicycle/greater-london-latest.osrm"] + ports: + - containerPort: 5000 + volumeMounts: + - name: osrm-data + mountPath: /data + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "500m" + readinessProbe: + httpGet: + path: /health + port: 5000 + initialDelaySeconds: 5 + periodSeconds: 10 + volumes: + - name: osrm-data + persistentVolumeClaim: + claimName: osrm-data-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: osrm-bicycle +spec: + selector: + app: osrm-bicycle + ports: + - port: 5000 + targetPort: 5000 diff --git a/k8s/osrm-foot.yaml b/k8s/osrm-foot.yaml new file mode 100644 index 0000000..6d7fec5 --- /dev/null +++ b/k8s/osrm-foot.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: osrm-foot + labels: + app: osrm-foot +spec: + replicas: 1 + selector: + matchLabels: + app: osrm-foot + template: + metadata: + labels: + app: osrm-foot + spec: + containers: + - name: osrm-foot + image: ghcr.io/project-osrm/osrm-backend:latest + command: ["osrm-routed", "--algorithm", "MLD", "/data/foot/greater-london-latest.osrm"] + ports: + - containerPort: 5000 + volumeMounts: + - name: osrm-data + mountPath: /data + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "500m" + readinessProbe: + httpGet: + path: /health + port: 5000 + initialDelaySeconds: 5 + periodSeconds: 10 + volumes: + - name: osrm-data + persistentVolumeClaim: + claimName: osrm-data-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: osrm-foot +spec: + selector: + app: osrm-foot + ports: + - port: 5000 + targetPort: 5000 diff --git a/k8s/osrm-init-job.yaml b/k8s/osrm-init-job.yaml new file mode 100644 index 0000000..0fe64ff --- /dev/null +++ b/k8s/osrm-init-job.yaml @@ -0,0 +1,64 @@ +apiVersion: batch/v1 +kind: Job +metadata: + name: osrm-init +spec: + backoffLimit: 3 + template: + spec: + restartPolicy: OnFailure + containers: + - name: osrm-init + image: ghcr.io/project-osrm/osrm-backend:latest + command: + - /bin/bash + - -c + - | + set -euo pipefail + OSM_FILE="greater-london-latest.osm.pbf" + GEOFABRIK_URL="https://download.geofabrik.de/europe/great-britain/england/greater-london-latest.osm.pbf" + + # Download OSM data if not present + if [ ! -f "/data/${OSM_FILE}" ]; then + echo "Downloading Greater London OSM extract..." + apt-get update -qq && apt-get install -qq -y curl + curl -L -o "/data/${OSM_FILE}" "${GEOFABRIK_URL}" + fi + + # Process foot profile + if [ ! -f "/data/foot/greater-london-latest.osrm" ]; then + echo "Processing foot profile..." + mkdir -p /data/foot + cp "/data/${OSM_FILE}" "/data/foot/${OSM_FILE}" + osrm-extract -p /opt/foot.lua "/data/foot/${OSM_FILE}" + osrm-partition "/data/foot/greater-london-latest.osrm" + osrm-customize "/data/foot/greater-london-latest.osrm" + rm -f "/data/foot/${OSM_FILE}" + fi + + # Process bicycle profile + if [ ! -f "/data/bicycle/greater-london-latest.osrm" ]; then + echo "Processing bicycle profile..." + mkdir -p /data/bicycle + cp "/data/${OSM_FILE}" "/data/bicycle/${OSM_FILE}" + osrm-extract -p /opt/bicycle.lua "/data/bicycle/${OSM_FILE}" + osrm-partition "/data/bicycle/greater-london-latest.osrm" + osrm-customize "/data/bicycle/greater-london-latest.osrm" + rm -f "/data/bicycle/${OSM_FILE}" + fi + + echo "OSRM data initialization complete!" + volumeMounts: + - name: osrm-data + mountPath: /data + resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "2Gi" + cpu: "2000m" + volumes: + - name: osrm-data + persistentVolumeClaim: + claimName: osrm-data-pvc diff --git a/k8s/otp.yaml b/k8s/otp.yaml new file mode 100644 index 0000000..f4bf8bc --- /dev/null +++ b/k8s/otp.yaml @@ -0,0 +1,53 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: otp + labels: + app: otp +spec: + replicas: 1 + selector: + matchLabels: + app: otp + template: + metadata: + labels: + app: otp + spec: + containers: + - name: otp + image: opentripplanner/opentripplanner:2.6.0 + command: ["--load", "--serve"] + ports: + - containerPort: 8080 + volumeMounts: + - name: otp-data + mountPath: /var/opentripplanner + resources: + requests: + memory: "1Gi" + cpu: "250m" + limits: + memory: "2Gi" + cpu: "1000m" + readinessProbe: + httpGet: + path: /otp/actuators/health + port: 8080 + initialDelaySeconds: 120 + periodSeconds: 30 + volumes: + - name: otp-data + persistentVolumeClaim: + claimName: otp-data-pvc +--- +apiVersion: v1 +kind: Service +metadata: + name: otp +spec: + selector: + app: otp + ports: + - port: 8080 + targetPort: 8080 diff --git a/k8s/routing-pvcs.yaml b/k8s/routing-pvcs.yaml new file mode 100644 index 0000000..ce8222e --- /dev/null +++ b/k8s/routing-pvcs.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: osrm-data-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: otp-data-pvc +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 2Gi