如何让GKE节点池内的自定义文件夹在节点重启后持久化?
问题分析与解决方案
核心问题
你当前的存储配置存在两个致命错误,导致文件夹重启后丢失:
- 存储类与PV类型不匹配:你的StorageClass使用
kubernetes.io/gce-pd(GCE云磁盘驱动),但定义的PersistentVolume是local类型(节点本地存储),两者完全不兼容。 - 指向临时存储路径: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:
- 创建节点池时添加
--local-ssd-count=1参数(或在控制台勾选本地SSD选项) - 本地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
相关产品推荐
相关产品推荐

