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

如何让GKE节点池内的自定义文件夹在节点重启后持久化?

问题分析与解决方案

核心问题

你当前的存储配置存在两个致命错误,导致文件夹重启后丢失:

  1. 存储类与PV类型不匹配:你的StorageClass使用kubernetes.io/gce-pd(GCE云磁盘驱动),但定义的PersistentVolume是local类型(节点本地存储),两者完全不兼容。
  2. 指向临时存储路径:GKE节点(尤其是容器优化操作系统COS)的/mnt/disks属于临时存储区域,节点重启后会被重置为初始状态,无法持久化数据。

解决方案:使用GCE PD云磁盘(推荐)

GCE PD是Google Cloud提供的持久化云磁盘,节点重启、重建都不会丢失数据,是最可靠的方案。

步骤1:清理错误配置

先删除现有的错误PV和PVC:

kubectl delete pv some-pv
kubectl delete pvc some-pvc

步骤2:修正PVC配置

创建绑定GCE PD的PVC,不需要手动指定PV,Kubernetes会自动创建并绑定对应的GCE PD:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: some-pvc
  namespace: default
spec:
  storageClassName: some-storage
  accessModes:
    - ReadWriteOnce  # GCE PD 默认支持单节点读写,如需多节点读写请用Regional PD(见下文)
  resources:
    requests:
      storage: 10Gi  # 根据实际需求调整存储大小

步骤3:修改StatefulSet,自动创建文件夹

添加initContainer在Pod启动前自动创建abc和def文件夹,确保容器启动时目录已存在:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: test
spec:
  selector:
    matchLabels:
      app: test
  serviceName: "test"
  template:
    metadata:
      labels:
        app: test
    spec:
      initContainers:
      - name: prepare-folders
        image: busybox:latest
        command: ["sh", "-c", "mkdir -p /mnt/disks/abc /mnt/disks/def"]
        volumeMounts:
        - mountPath: /mnt/disks/
          name: test-vol
      containers:
      - name: test
        image: some.gcr.io/some-project/test:latest
        imagePullPolicy: "Always"
        volumeMounts:
            - mountPath: /mnt/disks/
              name: test-vol
      volumes:
        - name: test-vol
          persistentVolumeClaim:
            claimName: some-pvc
      nodeSelector:
        node-pool: some-node

可选:支持多节点读写(ReadWriteMany)

如果需要多个Pod同时读写该存储,需将StorageClass修改为Regional PD(跨可用区同步的云磁盘):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: some-storage
provisioner: kubernetes.io/gce-pd
reclaimPolicy: Retain
parameters:
  type: pd-ssd
  replication-type: regional-pd
  zones: us-central1-a, us-central1-b  # 替换为你的集群所在区域的可用区
allowVolumeExpansion: true
volumeBindingMode: Immediate

注意:Regional PD需要Kubernetes 1.14+版本,且节点需分布在指定的多个可用区。


备选方案:使用节点本地SSD(仅限特殊场景)

如果必须使用节点本地存储(比如追求极致IO性能),需先为GKE节点池添加本地SSD:

  1. 创建节点池时添加--local-ssd-count=1参数(或在控制台勾选本地SSD选项)
  2. 本地SSD在节点上的默认挂载路径为/mnt/disks/ssd0(持久化,节点重启不会丢失,但节点重建会丢失)

修正Local PV配置

kind: PersistentVolume
apiVersion: v1
metadata:
  name: some-local-pv
spec:
  storageClassName: local-storage
  persistentVolumeReclaimPolicy: Retain
  accessModes:
    - ReadWriteOnce
  capacity:
    storage: 375Gi  # 单块本地SSD容量为375Gi
  local:
    path: "/mnt/disks/ssd0"
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: node-pool
          operator: In
          values:
          - some-node

配套Local存储类

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/local-volume
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer

之后PVC配置绑定该Local PV,StatefulSet同样可通过initContainer创建文件夹。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:00:12