infra/stacks/osm_routing/main.tf
Viktor Barzin eb32190461 [ci skip] fix OOM crashes: add resource limits for osrm-bicycle, aiostreams, listenarr, authentik
- osrm-bicycle: 1Gi limit (loads 403MB routing graph)
- aiostreams: 768Mi limit (loads 44K anime entries)
- listenarr: 1Gi limit (.NET + Playwright/Chromium)
- authentik server: 1Gi limit, worker: 1Gi limit (Django + gunicorn)
- servarr: pass nfs_server variable to all submodules
2026-02-28 17:03:33 +00:00

239 lines
4.9 KiB
HCL

variable "tls_secret_name" { type = string }
variable "nfs_server" { type = string }
resource "kubernetes_namespace" "osm-routing" {
metadata {
name = "osm-routing"
labels = {
"istio-injection" : "disabled"
tier = local.tiers.aux
}
}
}
# --- OSRM Foot ---
resource "kubernetes_deployment" "osrm-foot" {
metadata {
name = "osrm-foot"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "osrm-foot"
tier = local.tiers.aux
}
}
spec {
replicas = 1
strategy {
type = "Recreate"
}
selector {
match_labels = {
app = "osrm-foot"
}
}
template {
metadata {
labels = {
app = "osrm-foot"
}
}
spec {
container {
name = "osrm-foot"
image = "ghcr.io/project-osrm/osrm-backend:latest"
command = ["osrm-routed", "--algorithm", "MLD", "/data/foot/greater-london-latest.osrm"]
port {
name = "http"
container_port = 5000
protocol = "TCP"
}
volume_mount {
name = "osrm-data"
mount_path = "/data"
}
}
volume {
name = "osrm-data"
nfs {
server = var.nfs_server
path = "/mnt/main/osm-routing/osrm-data"
}
}
}
}
}
}
resource "kubernetes_service" "osrm-foot" {
metadata {
name = "osrm-foot"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "osrm-foot"
}
}
spec {
selector = {
app = "osrm-foot"
}
port {
port = 5000
target_port = 5000
}
}
}
# --- OSRM Bicycle ---
resource "kubernetes_deployment" "osrm-bicycle" {
metadata {
name = "osrm-bicycle"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "osrm-bicycle"
tier = local.tiers.aux
}
}
spec {
replicas = 1
strategy {
type = "Recreate"
}
selector {
match_labels = {
app = "osrm-bicycle"
}
}
template {
metadata {
labels = {
app = "osrm-bicycle"
}
}
spec {
container {
name = "osrm-bicycle"
image = "ghcr.io/project-osrm/osrm-backend:latest"
command = ["osrm-routed", "--algorithm", "MLD", "/data/bicycle/greater-london-latest.osrm"]
port {
name = "http"
container_port = 5000
protocol = "TCP"
}
volume_mount {
name = "osrm-data"
mount_path = "/data"
}
resources {
requests = {
cpu = "15m"
memory = "512Mi"
}
limits = {
cpu = "250m"
memory = "1Gi"
}
}
}
volume {
name = "osrm-data"
nfs {
server = var.nfs_server
path = "/mnt/main/osm-routing/osrm-data"
}
}
}
}
}
}
resource "kubernetes_service" "osrm-bicycle" {
metadata {
name = "osrm-bicycle"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "osrm-bicycle"
}
}
spec {
selector = {
app = "osrm-bicycle"
}
port {
port = 5000
target_port = 5000
}
}
}
# --- OTP (OpenTripPlanner) ---
resource "kubernetes_deployment" "otp" {
metadata {
name = "otp"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "otp"
tier = local.tiers.aux
}
}
spec {
replicas = 0 # Scaled down: TfL GTFS data expired, OTP crash-loops on build
strategy {
type = "Recreate"
}
selector {
match_labels = {
app = "otp"
}
}
template {
metadata {
labels = {
app = "otp"
}
}
spec {
container {
name = "otp"
image = "opentripplanner/opentripplanner:2.6.0"
args = ["--build", "--save"]
port {
name = "http"
container_port = 8080
protocol = "TCP"
}
volume_mount {
name = "otp-data"
mount_path = "/var/opentripplanner"
}
}
volume {
name = "otp-data"
nfs {
server = var.nfs_server
path = "/mnt/main/osm-routing/otp-data"
}
}
}
}
}
}
resource "kubernetes_service" "otp" {
metadata {
name = "otp"
namespace = kubernetes_namespace.osm-routing.metadata[0].name
labels = {
app = "otp"
}
}
spec {
selector = {
app = "otp"
}
port {
port = 8080
target_port = 8080
}
}
}