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.
This commit is contained in:
Viktor Barzin 2026-02-08 13:16:38 +00:00
parent 8509a0326f
commit 7084c46f89
No known key found for this signature in database
GPG key ID: 0EB088298288D958
5 changed files with 244 additions and 0 deletions

53
k8s/osrm-bicycle.yaml Normal file
View file

@ -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

53
k8s/osrm-foot.yaml Normal file
View file

@ -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

64
k8s/osrm-init-job.yaml Normal file
View file

@ -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

53
k8s/otp.yaml Normal file
View file

@ -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

21
k8s/routing-pvcs.yaml Normal file
View file

@ -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