阅读量:52
CentOS上Kubernetes常见存储解决方案
一、本地存储(Local Storage)
本地存储直接使用节点上的物理介质(如HDD、SSD),适用于对延迟敏感但无需跨节点共享的场景。常见类型包括:
- EmptyDir:临时存储,Pod创建时生成,删除时自动清理,用于Pod内容器间共享数据(如缓存)。
- HostPath:将节点上的目录或文件挂载到Pod中,半持久化(Pod删除后数据仍保留在节点,但节点故障会导致数据丢失)。
配置示例:创建HostPath PV(hostpath-pv.yaml):创建PVC(apiVersion: v1 kind: PersistentVolume metadata: name: hostpath-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce hostPath: path: /data/k8s-storagehostpath-pvc.yaml)并绑定到Pod(nginx-pod.yaml)即可使用。
二、网络存储(Network Storage)
网络存储通过网络连接,支持跨节点共享,适用于需要高可用或数据共享的场景,主要包括NFS、GlusterFS、Ceph等。
1. NFS(Network File System)
NFS是轻量级网络文件系统,适合中小规模数据共享(如静态网站文件、日志收集)。
配置步骤:
- 安装NFS服务器(CentOS节点):
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 - Kubernetes配置:
- 创建PV(
nfs-pv.yaml):apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /mnt/nfs server: - 创建PVC(
nfs-pvc.yaml)并绑定到Pod(nginx-pod.yaml):apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5GiapiVersion: 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
- 创建PV(
2. GlusterFS
GlusterFS是分布式文件系统,支持水平扩展和高可用(通过副本机制),适合大规模数据存储(如图片、视频等非结构化数据)。
配置步骤:
- 安装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 - Kubernetes配置:
- 创建StorageClass(
gluster-sc.yaml):apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: gluster-sc provisioner: kubernetes.io/glusterfs parameters: resturl: "http://:8080" clusterid: "" restauthenabled: "true" restuser: "admin" restuserkey: "password" reclaimPolicy: Retain - 动态创建PVC(
gluster-pvc.yaml)并绑定到Pod(wordpress-pod.yaml):apiVersion: v1 kind: PersistentVolumeClaim metadata: name: gluster-pvc spec: accessModes: - ReadWriteMany storageClassName: gluster-sc resources: requests: storage: 10GiapiVersion: 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
- 创建StorageClass(
3. Ceph
Ceph是统一存储系统(支持块、文件、对象存储),适合企业级大规模存储(如数据库、备份)。
配置步骤(使用Rook Operator简化部署):
- 部署Rook Operator:
helm repo add rook-release https://charts.rook.io/release helm install rook-ceph rook-release/rook-ceph --namespace rook-ceph - 创建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 - 创建StorageClass(
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(Container Storage Interface)存储
CSI是Kubernetes标准存储接口,支持第三方存储插件(如Longhorn、Portworx),实现动态存储管理。
Longhorn示例(分布式块存储):
- 安装Longhorn:
helm repo add longhorn https://charts.longhorn.io helm install longhorn longhorn/longhorn --namespace longhorn-system - 使用Longhorn StorageClass:
Longhorn会自动创建
longhornStorageClass,PVC可直接引用:适用于需要分布式、高可用的块存储场景。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: longhorn-pvc spec: accessModes: - ReadWriteOnce storageClassName: longhorn resources: requests: storage: 5Gi
四、StorageClass动态置备
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绑定到不可用节点)。