Kubernetes StatefulSet集群重启后数据无法持久化求助
问题分析与修复方案
PostgreSQL 数据丢失问题
核心错误
PostgreSQL官方镜像默认将数据存储在/var/lib/postgresql/data路径下,但你的StatefulSet中将持久化卷挂载到了/postgresql/data,容器内的PostgreSQL根本不会往这个自定义路径写数据,导致每次重启后数据都存在容器的临时存储里,集群关闭后就丢失了。
修复后的配置
StatefulSet 修正
apiVersion: apps/v1 kind: StatefulSet metadata: namespace: postgresql name: postgresql spec: serviceName: postgresql selector: matchLabels: app: postgresql replicas: 1 template: metadata: labels: app: postgresql spec: containers: - name: postgresql image: postgres:latest volumeMounts: - name: postgresql-pv mountPath: /var/lib/postgresql/data # 修正为PostgreSQL默认数据路径 envFrom: - configMapRef: name: postgresql-config volumes: - name: postgresql-pv persistentVolumeClaim: claimName: postgresql-pvc
额外优化(可选)
PersistentVolume中的hostPath路径无需转义,修正为:
hostPath: path: "/var/lib/postgresql/data" type: "DirectoryOrCreate"
转义符不影响功能,但去掉后更规范。
TeamCity-Server 数据丢失问题
核心错误
- 挂载路径与容器默认路径不匹配:jetbrains/teamcity-server镜像的默认数据、日志路径和你配置的挂载路径完全不符,数据根本没写入持久化卷。
- 资源命名不匹配:StatefulSet中的卷名称和对应的PersistentVolumeClaim名称不一致,可能导致挂载失败。
- ConfigMap 未指定命名空间:TeamCity的其他资源都在
teamcity-server命名空间下,但ConfigMap没指定namespace,会默认创建在default命名空间,容器无法读取到数据库配置。
修复后的配置
ConfigMap 修正(添加命名空间)
apiVersion: v1 kind: ConfigMap metadata: namespace: teamcity-server # 补充命名空间 name: teamcity-server-config labels: app: teamcity-server data: database.properties: | connectionProperties.user=x connectionProperties.password=x connectionUrl=jdbc:x
StatefulSet 修正(路径匹配+命名匹配)
apiVersion: apps/v1 kind: StatefulSet metadata: namespace: teamcity-server name: teamcity-server spec: serviceName: teamcity-server selector: matchLabels: app: teamcity-server replicas: 1 template: metadata: labels: app: teamcity-server teamcity: server spec: containers: - name: teamcity-server image: jetbrains/teamcity-server imagePullPolicy: Always volumeMounts: - name: teamcity-server-datadir-pv # 修正卷名称,与PVC一致 mountPath: /data/teamcity_server/datadir # 镜像默认数据目录 - name: teamcity-server-log-pv # 修正卷名称,与PVC一致 mountPath: /opt/teamcity/logs # 镜像默认日志目录 - name: teamcity-server-backup-pv # 修正卷名称,与PVC一致 mountPath: /data/teamcity_server/datadir/backup # 镜像默认备份目录 - name: teamcity-server-database-properties-pv mountPath: /data/teamcity_server/datadir/config/database.properties subPath: database.properties ports: - containerPort: 8111 volumes: - name: teamcity-server-datadir-pv persistentVolumeClaim: claimName: teamcity-server-datadir-pvc - name: teamcity-server-log-pv persistentVolumeClaim: claimName: teamcity-server-log-pvc - name: teamcity-server-backup-pv persistentVolumeClaim: claimName: teamcity-server-backup-pvc - name: teamcity-server-database-properties-pv configMap: name: teamcity-server-config items: - key: database.properties path: database.properties
额外优化(可选)
PersistentVolume中的hostPath路径去掉转义符,比如:
hostPath: path: "/var/lib/teamcity_server/data" type: "DirectoryOrCreate"
验证步骤
- 先删除原有资源:
kubectl delete -f <你的原有配置文件>.yaml - 应用修正后的配置:
kubectl apply -f <修正后的配置文件>.yaml - 启动集群后,写入测试数据,关闭再重启集群,检查数据是否保留。
内容的提问来源于stack exchange,提问作者Rodrigo Duarte
相关产品推荐
相关产品推荐

