# Redis deployment for session storage and Socket.IO resource "kubernetes_deployment" "redis" { metadata { name = "redis" namespace = kubernetes_namespace.abaci.metadata[0].name labels = { app = "redis" } } spec { replicas = 1 selector { match_labels = { app = "redis" } } template { metadata { labels = { app = "redis" } } spec { container { name = "redis" image = "redis:7-alpine" args = ["redis-server", "--appendonly", "yes"] port { container_port = 6379 } resources { requests = { memory = "128Mi" cpu = "100m" } limits = { memory = "256Mi" cpu = "500m" } } volume_mount { name = "redis-data" mount_path = "/data" } liveness_probe { exec { command = ["redis-cli", "ping"] } initial_delay_seconds = 5 period_seconds = 10 } readiness_probe { exec { command = ["redis-cli", "ping"] } initial_delay_seconds = 5 period_seconds = 5 } } volume { name = "redis-data" persistent_volume_claim { claim_name = kubernetes_persistent_volume_claim.redis_data.metadata[0].name } } } } } } resource "kubernetes_persistent_volume_claim" "redis_data" { metadata { name = "redis-data" namespace = kubernetes_namespace.abaci.metadata[0].name } spec { access_modes = ["ReadWriteOnce"] resources { requests = { storage = "1Gi" } } storage_class_name = "local-path" # k3s default storage class } wait_until_bound = false # local-path uses WaitForFirstConsumer } resource "kubernetes_service" "redis" { metadata { name = "redis" namespace = kubernetes_namespace.abaci.metadata[0].name } spec { selector = { app = "redis" } port { port = 6379 target_port = 6379 } type = "ClusterIP" } }