############################################################### # PersistentVolume – host-path storage (works on minikube) ############################################################### apiVersion: v1 kind: PersistentVolume metadata: name: postgres-pv labels: type: local app: postgres spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: standard hostPath: path: /mnt/data/postgres type: DirectoryOrCreate --- ############################################################### # PersistentVolumeClaim ############################################################### apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pvc namespace: todo-app labels: app: postgres spec: accessModes: - ReadWriteOnce storageClassName: standard resources: requests: storage: 2Gi --- ############################################################### # Secret – credentials for PostgreSQL ############################################################### apiVersion: v1 kind: Secret metadata: name: postgres-secret namespace: todo-app type: Opaque stringData: POSTGRES_USER: "postgres" POSTGRES_PASSWORD: "postgres123" POSTGRES_DB: "tododb" --- ############################################################### # StatefulSet – PostgreSQL database ############################################################### apiVersion: apps/v1 kind: StatefulSet metadata: name: postgres namespace: todo-app labels: app: postgres tier: database spec: serviceName: "postgres-headless" replicas: 1 selector: matchLabels: app: postgres template: metadata: labels: app: postgres tier: database spec: containers: - name: postgres image: postgres:16-alpine imagePullPolicy: IfNotPresent ports: - containerPort: 5432 name: postgres env: - name: POSTGRES_USER valueFrom: secretKeyRef: name: postgres-secret key: POSTGRES_USER - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: postgres-secret key: POSTGRES_PASSWORD - name: POSTGRES_DB valueFrom: secretKeyRef: name: postgres-secret key: POSTGRES_DB - name: PGDATA value: /var/lib/postgresql/data/pgdata resources: requests: cpu: "100m" memory: "256Mi" limits: cpu: "500m" memory: "512Mi" volumeMounts: - name: postgres-storage mountPath: /var/lib/postgresql/data - name: init-sql mountPath: /docker-entrypoint-initdb.d livenessProbe: exec: command: - pg_isready - -U - postgres initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: - pg_isready - -U - postgres initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: postgres-storage persistentVolumeClaim: claimName: postgres-pvc - name: init-sql configMap: name: postgres-init-sql