soroban-abacus-flashcards/infra/terraform/redis.tf

121 lines
2.3 KiB
HCL

# 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"
}
}