温馨提示×

CentOS上Kubernetes的持久化存储如何实现

小樊
37
2025-12-07 21:38:27
栏目: 云计算

CentOS 上 Kubernetes 持久化存储实现指南

一、总体思路与关键概念

  • 核心资源:PersistentVolume(PV)PersistentVolumeClaim(PVC)StorageClass。PV 描述后端存储,PVC 由应用申请,StorageClass 定义“如何动态创建 PV”。
  • 访问模式:ReadWriteOnce(RWO)ReadOnlyMany(ROX)ReadWriteMany(RWX),不同存储后端对模式支持不同。
  • 回收策略:Retain(保留数据,需手动清理)、Delete(删除 PV 及后端数据)、Recycle(已弃用)。
  • 典型后端:HostPath(单节点测试)、NFS(多节点共享)、Ceph RBD/CephFS(分布式块/文件)、GlusterFS、以及各类 CSI 插件(如 Longhorn、云盘 CSI)。
  • 节点准备:所有节点安装 nfs-utils(如使用 NFS),并按需开放防火墙端口与服务。

二、快速上手 HostPath 示例(仅用于测试)

  • 适用场景:单节点或固定节点调试,数据随节点保留,Pod 漂移后不跟随。
  • 示例清单(创建目录后应用):
apiVersion: v1
kind: PersistentVolume
metadata:
  name: hostpath-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/hostpath
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: hostpath-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: app
    image: nginx:1.25
    volumeMounts:
    - name: data
      mountPath: /usr/share/nginx/html
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: hostpath-pvc
  • 验证:
kubectl apply -f hostpath.yaml
kubectl get pv,pvc
kubectl exec -it test-pod -- ls /usr/share/nginx/html
  • 提示:生产环境不建议使用 HostPath;如需跨节点共享或高可用,请选择 NFS/Ceph/CSI。

三、生产可用方案 NFS 静态供给

  • 准备 NFS 服务器(在存储节点执行):
sudo yum install -y nfs-utils
sudo mkdir -p /mnt/nfs
echo "/mnt/nfs *(rw,sync,no_subtree_check)" | sudo tee -a /etc/exports
sudo systemctl enable --now nfs-server
sudo exportfs -a
# 防火墙
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
# 客户端(所有 K8s 节点)
sudo yum install -y nfs-utils
  • 创建 PV/PVC(示例):
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.56.115   # 替换为 NFS 服务器地址
    path: /mnt/nfs
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  • 在 Pod/Deployment 中引用上述 nfs-pvc 即可。
  • 说明:NFS 天然支持 RWX,适合多 Pod 共享;静态供给需预先创建 PV,也可结合外部自动供给器实现动态供给。

四、生产级分布式存储 Ceph 通过 Rook 部署

  • 适用场景:需要高可用、可扩展的块/对象/文件存储。
  • 部署步骤(使用 Helm):
kubectl create namespace rook-ceph
helm repo add rook-release https://charts.rook.io/release
helm install rook-ceph rook-release/rook-ceph --namespace rook-ceph
# 等待 Operator 就绪
kubectl get pods -n rook-ceph
# 创建 CephCluster(示例,按实际节点与磁盘调整)
cat <<EOF | kubectl apply -f -
apiVersion: ceph.rook.io/v1
kind: CephCluster
metadata:
  name: rook-ceph
  namespace: rook-ceph
spec:
  cephVersion:
    image: ceph/ceph:v16.2.6
  dataDirHostPath: /var/lib/rook
  useAllNodes: true
  useAllDevices: false
  devices:
    - name: /dev/sdb
  network:
    hostNetwork: false
EOF
  • 创建 StorageClass(由 Rook 提供的 Ceph CSI 驱动自动创建 PV),在应用内以 PVC 申请即可。
  • 提示:部署前确保节点满足资源与磁盘要求,并规划好 mon/osd/mgr 与网络。

五、动态供给与 StorageClass 实践

  • 作用:通过 StorageClass 定义“存储类型与供给方式”,应用创建 PVC 时自动创建 PV
  • 示例(静态供给的“占位” StorageClass,用于延迟绑定):
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-storage-class
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
  • 使用方式:创建上述 StorageClass 后,创建 PVC 指定该 storageClassName;若需真正的动态供给,请部署对应 CSI 或 NFS 外部供给器,并将其 provisioner 配置到 StorageClass

0