kubernetes - Kubernetes StatefulSet - 不会在 pod 重启时恢复数据
问题描述
Kubernetes 版本 - 1.8
- 使用 pvc 为 postgres 数据库创建 statefulset
- 向数据库添加了一些表
- 通过将 statefulset 缩放为 0 然后再次缩放 1 来重新启动 pod
- 第 2 步中创建的表不再可用
在 docker-for-desktop 集群 k8s 版本 1.10 上尝试了另一个 scnario
- 使用 pvc 为 postgres 数据库创建 statefulset
- 向数据库添加了一些表
- 重新启动桌面版 docker
- 第 2 步中创建的表不再可用
k8s 清单
apiVersion: v1
kind: ConfigMap
metadata:
name: postgres-config
labels:
app: postgres
data:
POSTGRES_DB: kong
POSTGRES_USER: kong
POSTGRES_PASSWORD: kong
PGDATA: /var/lib/postgresql/data/pgdata
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: postgres-pv
labels:
app: postgres
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/postgresql/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
labels:
app: postgres
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
name: postgres
app: postgres
spec:
ports:
- name: pgql
port: 5432
targetPort: 5432
protocol: TCP
selector:
app: postgres
---
apiVersion: apps/v1beta2 # for k8s versions before 1.9.0 use apps/v1beta2 and before 1.8.0 use extensions/v1beta1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: "postgres"
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:9.6
imagePullPolicy: "IfNotPresent"
ports:
- containerPort: 5432
envFrom:
- configMapRef:
name: postgres-config
volumeMounts:
- mountPath: /var/lib/postgresql/data
name: postgredb
volumes:
- name: postgredb
persistentVolumeClaim:
claimName: postgres-pvc
---
解决方案
如果您有多个节点 - 您看到的问题是完全可以预料的。因此,如果您想在多节点集群中使用 hostPath 作为持久卷 - 您必须使用一些共享文件系统(如 Glusterfs 或 Ceph)并将 /mnt/postgresql/data 文件夹放在该共享文件系统上。
推荐阅读
- julia - 如何对包含向量的列表进行排序?
- javascript - 1 单击后未显示 YouTube 视频
- google-apps-script - 如何将一张工作表中的分配任务转移到另一张工作表?
- java - 如何使用 Lambda 表达式检索类的子集
- python - scrapy __init__ arg 中的 ValueError
- c++ - 访问二维向量时出现分段错误
- ios - 一起使用 XCUI 测试和 XC 测试
- php - 如何根据数据库中的值将复选框设置为“已选中”?
- php - 用 jquery 添加 PHP
- spring-boot - 是否有端点可以在 Spring Security OAuth 应用程序中获取配置的公共证书?