CentOS上Kubernetes常见存储解决方案
本地存储直接使用节点上的物理介质(如HDD、SSD),适用于对延迟敏感但无需跨节点共享的场景。常见类型包括:
hostpath-pv.yaml):apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/k8s-storage
创建PVC(hostpath-pvc.yaml)并绑定到Pod(nginx-pod.yaml)即可使用。网络存储通过网络连接,支持跨节点共享,适用于需要高可用或数据共享的场景,主要包括NFS、GlusterFS、Ceph等。
NFS是轻量级网络文件系统,适合中小规模数据共享(如静态网站文件、日志收集)。
配置步骤:
sudo yum install -y nfs-utils
sudo mkdir -p /mnt/nfs
sudo chown -R nobody:nogroup /mnt/nfs
echo "/mnt/nfs *(rw,sync,no_subtree_check)" | sudo tee /etc/exports
sudo systemctl start nfs-server && sudo systemctl enable nfs-server
sudo firewall-cmd --permanent --add-service=nfs --add-service=mountd --add-service=rpc-bind
sudo firewall-cmd --reload
nfs-pv.yaml):apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /mnt/nfs
server: <NFS服务器IP>
nfs-pvc.yaml)并绑定到Pod(nginx-pod.yaml):apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nfs-volume
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: nfs-pvc
GlusterFS是分布式文件系统,支持水平扩展和高可用(通过副本机制),适合大规模数据存储(如图片、视频等非结构化数据)。
配置步骤:
sudo yum install -y centos-release-gluster
sudo yum install -y glusterfs-server glusterfs-fuse
sudo systemctl start glusterd && sudo systemctl enable glusterd
gluster peer probe <节点2IP>
gluster peer probe <节点3IP>
gluster volume create gv0 replica 3 <节点1IP>:/data/gluster/gv0 <节点2IP>:/data/gluster/gv0 <节点3IP>:/data/gluster/gv0 force
gluster volume start gv0
gluster-sc.yaml):apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gluster-sc
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://<gluster-manager-ip>:8080"
clusterid: "<gluster-cluster-id>"
restauthenabled: "true"
restuser: "admin"
restuserkey: "password"
reclaimPolicy: Retain
gluster-pvc.yaml)并绑定到Pod(wordpress-pod.yaml):apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: gluster-sc
resources:
requests:
storage: 10Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress
volumeMounts:
- mountPath: "/var/www/html"
name: wordpress-persistent-storage
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: gluster-pvc
Ceph是统一存储系统(支持块、文件、对象存储),适合企业级大规模存储(如数据库、备份)。
配置步骤(使用Rook Operator简化部署):
helm repo add rook-release https://charts.rook.io/release
helm install rook-ceph rook-release/rook-ceph --namespace rook-ceph
ceph-cluster.yaml):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
rook-ceph-block-sc.yaml):apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
clusterID: rook-ceph
pool: replicapool
imageFormat: "2"
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
reclaimPolicy: Delete
适用于企业级高性能存储需求。CSI是Kubernetes标准存储接口,支持第三方存储插件(如Longhorn、Portworx),实现动态存储管理。
Longhorn示例(分布式块存储):
helm repo add longhorn https://charts.longhorn.io
helm install longhorn longhorn/longhorn --namespace longhorn-system
longhorn StorageClass,PVC可直接引用:apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: longhorn-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: longhorn
resources:
requests:
storage: 5Gi
适用于需要分布式、高可用的块存储场景。StorageClass是Kubernetes的核心抽象,用于动态创建PV(无需手动创建)。通过StorageClass,用户只需声明PVC(指定存储大小、访问模式),Kubernetes会自动调用Provisioner(如NFS、Ceph)创建PV并绑定。
关键参数:
provisioner:存储插件(如kubernetes.io/glusterfs、rook-ceph.rbd.csi.ceph.com)。parameters:存储相关配置(如NFS路径、Ceph池名)。reclaimPolicy:PV回收策略(Retain保留数据、Delete删除数据)。volumeBindingMode:绑定模式(WaitForFirstConsumer延迟绑定,避免PV绑定到不可用节点)。