# ============================================= # PersistentVolume — PostgreSQL data storage # Host-path volume that stores database files. # ============================================= apiVersion: v1 kind: PersistentVolume metadata: name: postgres-pv labels: app: postgres spec: capacity: storage: 1Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /mnt/taskmanager/postgres --- # ============================================= # PersistentVolumeClaim — PostgreSQL # Binds to postgres-pv for database storage. # ============================================= apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pvc namespace: taskmanager labels: app: postgres spec: accessModes: - ReadWriteOnce storageClassName: manual resources: requests: storage: 1Gi --- # ============================================= # PersistentVolume — Redis data storage # Host-path volume for Redis append-only file. # ============================================= apiVersion: v1 kind: PersistentVolume metadata: name: redis-pv labels: app: redis spec: capacity: storage: 500Mi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: /mnt/taskmanager/redis --- # ============================================= # PersistentVolumeClaim — Redis # Binds to redis-pv for cache persistence. # ============================================= apiVersion: v1 kind: PersistentVolumeClaim metadata: name: redis-pvc namespace: taskmanager labels: app: redis spec: accessModes: - ReadWriteOnce storageClassName: manual resources: requests: storage: 500Mi --- # ============================================= # StatefulSet — PostgreSQL 16 # Manages the primary relational database. # Uses the PVC above for persistent storage. # The init.sql ConfigMap is mounted so the DB # schema is created automatically on first run. # ============================================= apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres namespace: taskmanager labels: app: postgres spec: serviceName: postgres replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: postgres:16-alpine ports: - containerPort: 5432 env: - name: POSTGRES_DB value: taskmanager - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secret key: username - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: password volumeMounts: - name: postgres-data mountPath: /var/lib/postgresql/data - name: init-sql mountPath: /docker-entrypoint-initdb.d/init.sql subPath: init.sql readinessProbe: exec: command: - pg_isready - -U - taskuser - -d - taskmanager initialDelaySeconds: 10 periodSeconds: 5 livenessProbe: exec: command: - pg_isready - -U - taskuser - -d - taskmanager initialDelaySeconds: 30 periodSeconds: 10 resources: requests: memory: "128Mi" cpu: "100m" limits: memory: "512Mi" cpu: "500m" volumes: - name: postgres-data persistentVolumeClaim: claimName: postgres-pvc - name: init-sql configMap: name: postgres-init --- # ============================================= # StatefulSet — Redis 7 # Manages the in-memory caching layer. # Uses the redis-pvc for AOF persistence. # ============================================= apiVersion: apps/v1 kind: StatefulSet metadata: name: redis namespace: taskmanager labels: app: redis spec: serviceName: redis replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis:7-alpine args: ["redis-server", "--appendonly", "yes"] ports: - containerPort: 6379 volumeMounts: - name: redis-data mountPath: /data readinessProbe: exec: command: ["redis-cli", "ping"] initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: exec: command: ["redis-cli", "ping"] initialDelaySeconds: 15 periodSeconds: 10 resources: requests: memory: "64Mi" cpu: "50m" limits: memory: "256Mi" cpu: "200m" volumes: - name: redis-data persistentVolumeClaim: claimName: redis-pvc