CentOS 上 Kubernetes 持久化存储实现指南
一、总体思路与关键概念
二、快速上手 HostPath 示例(仅用于测试)
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
三、生产可用方案 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
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
四、生产级分布式存储 Ceph 通过 Rook 部署
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 实践
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage-class
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer