Kubernetes 上的 Postgres 运行 在 Pod 重建或集群重启时丢失数据
Postgres running on kubernetes looses data upon Pod recreation or cluster reboot
我有 postgres 容器 运行ning 在 GKE 上的 Pod
和 PersistentVolume
设置存储数据。但是,如果集群重新启动或 Pod
被删除,数据库中的所有数据都会丢失。
如果我运行kubectl delete <postgres_pod>
删除现有的Pod
并检查新创建的(kubernetes)Pod
要替换已删除的数据库,相应的数据库没有 Pod
被删除之前的数据。
这是我用来部署 postgres 的 yaml 文件。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: custom-storage
parameters:
type: pd-standard
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Retain
volumeBindingMode: Immediate
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-volume-claim
spec:
storageClassName: custom-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:11.5
resources: {}
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "dbname"
- name: POSTGRES_USER
value: "user"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts:
- mountPath: /var/lib/postgresql/
name: postgresdb
volumes:
- name: postgresdb
persistentVolumeClaim:
claimName: postgres-volume-claim
我仔细检查了 persistentVolumeReclaimPolicy
的值 Retain
。
我错过了什么?
集群是否在您每次删除 pod 时创建一个新卷?用 kubectl get pv
检查。
这是多区域集群吗?您的存储 class 不是配置区域磁盘,因此当 pod 从一个区域移动到另一个区域时,您可能会得到一个新磁盘。
可能与您的问题有关,postgres 容器参考建议安装在 /var/lib/postgresql/data/pgdata
并设置 PGDATA
环境变量:
https://hub.docker.com/_/postgres#pgdata
我有 postgres 容器 运行ning 在 GKE 上的 Pod
和 PersistentVolume
设置存储数据。但是,如果集群重新启动或 Pod
被删除,数据库中的所有数据都会丢失。
如果我运行kubectl delete <postgres_pod>
删除现有的Pod
并检查新创建的(kubernetes)Pod
要替换已删除的数据库,相应的数据库没有 Pod
被删除之前的数据。
这是我用来部署 postgres 的 yaml 文件。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: custom-storage
parameters:
type: pd-standard
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Retain
volumeBindingMode: Immediate
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: postgres-volume-claim
spec:
storageClassName: custom-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres
spec:
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:11.5
resources: {}
ports:
- containerPort: 5432
env:
- name: POSTGRES_DB
value: "dbname"
- name: POSTGRES_USER
value: "user"
- name: POSTGRES_PASSWORD
value: "password"
volumeMounts:
- mountPath: /var/lib/postgresql/
name: postgresdb
volumes:
- name: postgresdb
persistentVolumeClaim:
claimName: postgres-volume-claim
我仔细检查了 persistentVolumeReclaimPolicy
的值 Retain
。
我错过了什么?
集群是否在您每次删除 pod 时创建一个新卷?用 kubectl get pv
检查。
这是多区域集群吗?您的存储 class 不是配置区域磁盘,因此当 pod 从一个区域移动到另一个区域时,您可能会得到一个新磁盘。
可能与您的问题有关,postgres 容器参考建议安装在 /var/lib/postgresql/data/pgdata
并设置 PGDATA
环境变量:
https://hub.docker.com/_/postgres#pgdata