You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 数据丢失问题

核心错误

  1. 挂载路径与容器默认路径不匹配:jetbrains/teamcity-server镜像的默认数据、日志路径和你配置的挂载路径完全不符,数据根本没写入持久化卷。
  2. 资源命名不匹配:StatefulSet中的卷名称和对应的PersistentVolumeClaim名称不一致,可能导致挂载失败。
  3. 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"

验证步骤

  1. 先删除原有资源:kubectl delete -f <你的原有配置文件>.yaml
  2. 应用修正后的配置:kubectl apply -f <修正后的配置文件>.yaml
  3. 启动集群后,写入测试数据,关闭再重启集群,检查数据是否保留。

内容的提问来源于stack exchange,提问作者Rodrigo Duarte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:25:26