apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-data spec: accessModes: [ReadWriteOnce] resources: requests: storage: ${POSTGRES_STORAGE:-2Gi} --- apiVersion: v1 kind: Service metadata: name: postgres spec: selector: app: postgres ports: - port: 5432 targetPort: 5432 --- apiVersion: apps/v1 kind: Deployment metadata: name: postgres spec: replicas: 1 # One volume, one writer. Rolling would start a second pod against the same # PVC before the first exits, and Postgres refuses to share a data directory. strategy: type: Recreate selector: matchLabels: app: postgres template: metadata: labels: app: postgres spec: containers: - name: postgres image: ${POSTGRES_IMAGE} envFrom: - secretRef: name: postgres env: # The image initialises into the volume root otherwise, and a # lost+found from the PVC makes it refuse to initdb. - name: PGDATA value: /var/lib/postgresql/data/pgdata ports: - containerPort: 5432 volumeMounts: - name: data mountPath: /var/lib/postgresql/data readinessProbe: exec: command: ["sh", "-c", "pg_isready -U $POSTGRES_USER -d $POSTGRES_DB"] initialDelaySeconds: 5 periodSeconds: 5 livenessProbe: exec: command: ["sh", "-c", "pg_isready -U $POSTGRES_USER -d $POSTGRES_DB"] initialDelaySeconds: 30 periodSeconds: 15 volumes: - name: data persistentVolumeClaim: claimName: postgres-data