温馨提示×

Linux下K8S存储如何配置

小樊
48
2025-10-12 00:54:36
栏目: 云计算

Linux下K8S存储配置指南
Kubernetes(K8S)的存储配置需根据场景选择合适的存储类型(如NFS、Ceph、HostPath等),其中NFS是最常用的网络存储方案,适用于多节点共享存储;Ceph提供高性能块存储,适合生产环境;HostPath仅用于单节点测试。以下是详细配置步骤:

一、NFS存储配置(最常用)

NFS(Network File System)通过TCP/IP网络共享目录,支持多节点同时读写,适合需要共享数据的场景(如Web服务器、数据库备份)。

1. 安装并配置NFS服务器

在Linux主机(如CentOS)上安装NFS服务,创建共享目录并设置权限:

# 安装NFS软件包
sudo yum install -y nfs-utils  # CentOS/RHEL
# sudo apt-get install -y nfs-kernel-server  # Ubuntu/Debian

# 创建共享目录并设置权限(允许所有用户读写)
sudo mkdir -p /mnt/nfs
sudo chown -R nobody:nogroup /mnt/nfs
sudo chmod 777 /mnt/nfs

# 配置NFS共享(允许所有IP访问,可根据需求限制)
echo "/mnt/nfs *(rw,sync,no_subtree_check)" | sudo tee /etc/exports

# 启动NFS服务并设置开机自启
sudo systemctl start nfs-server
sudo systemctl enable nfs-server

# 配置防火墙(允许NFS相关服务)
sudo firewall-cmd --permanent --add-service=nfs --add-service=mountd --add-service=rpc-bind
sudo firewall-cmd --reload

验证NFS共享是否生效:

showmount -e localhost  # 查看本机共享目录

若输出/mnt/nfs,说明NFS服务配置成功。

2. 在K8S中创建PersistentVolume(PV)和PersistentVolumeClaim(PVC)

PV是K8S中的存储资源,PVC是对PV的申请,两者绑定后供Pod使用。

PV配置(nfs-pv.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv  # PV名称
spec:
  capacity:
    storage: 5Gi  # 存储容量
  accessModes:
    - ReadWriteMany  # 多节点读写(NFS常用模式)
  nfs:
    path: /mnt/nfs  # NFS共享目录
    server: <NFS服务器IP>  # 替换为实际IP
  persistentVolumeReclaimPolicy: Retain  # 删除PVC后保留PV数据

PVC配置(nfs-pvc.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc  # PVC名称
spec:
  accessModes:
    - ReadWriteMany  # 必须与PV的accessModes一致
  resources:
    requests:
      storage: 5Gi  # 申请的存储容量(不超过PV容量)

应用配置:

kubectl apply -f nfs-pv.yaml -f nfs-pvc.yaml

验证PV和PVC状态:

kubectl get pv  # 查看PV状态(应为“Bound”)
kubectl get pvc  # 查看PVC状态(应为“Bound”)

3. 在Pod中使用PVC

通过PVC将NFS存储挂载到Pod的容器中:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # Pod名称
spec:
  containers:
  - name: nginx
    image: nginx:latest  # 使用Nginx镜像
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"  # 容器内挂载路径(Nginx默认网页目录)
      name: nfs-volume  # 卷名称(与下方volumes.name一致)
  volumes:
  - name: nfs-volume
    persistentVolumeClaim:
      claimName: nfs-pvc  # 引用上方PVC名称

应用Pod配置:

kubectl apply -f nginx-pod.yaml

验证挂载是否成功:

kubectl exec -it nginx-pod -- ls /usr/share/nginx/html  # 查看容器内挂载目录

若能看到NFS共享目录中的文件(如index.html),说明配置成功。

二、Ceph存储配置(生产级高性能)

Ceph是分布式存储系统,提供块存储(RBD)、对象存储(RGW)和文件存储(CephFS),适合需要高可用、高性能的生产环境。

1. 部署Ceph集群

使用Rook(K8S原生存储编排工具)快速部署Ceph集群:

# 添加Rook Helm仓库
helm repo add rook-release https://charts.rook.io/release
helm repo update

# 安装Rook Ceph Operator(在rook-ceph命名空间)
helm install rook-ceph rook-release/rook-ceph --namespace rook-ceph

等待Operator启动完成(可通过kubectl get pods -n rook-ceph查看Pod状态)。

2. 创建Ceph存储类(StorageClass)

存储类用于动态分配Ceph存储,以下是块存储(RBD)的配置示例:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block  # 存储类名称
provisioner: rook-ceph.rbd.csi.ceph.com  # Ceph RBD CSI驱动
parameters:
  clusterID: rook-ceph  # Ceph集群ID(与Operator配置一致)
  pool: replicapool  # Ceph存储池(需提前创建)
  imageFormat: "2"  # Ceph镜像格式(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  # 删除PVC后自动删除PV

应用存储类配置:

kubectl apply -f ceph-storageclass.yaml

3. 使用Ceph存储类创建PVC和Pod

通过存储类动态分配存储,无需手动创建PV:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ceph-pvc
spec:
  accessModes:
    - ReadWriteOnce  # 单节点读写(Ceph RBD常用模式)
  storageClassName: rook-ceph-block  # 引用上方存储类
  resources:
    requests:
      storage: 10Gi  # 申请的存储容量

应用PVC配置:

kubectl apply -f ceph-pvc.yaml

创建使用Ceph存储的Pod:

apiVersion: v1
kind: Pod
metadata:
  name: ceph-pod
spec:
  containers:
  - name: ceph-container
    image: busybox
    command: ["sleep", "3600"]
    volumeMounts:
    - mountPath: "/mnt/ceph"
      name: ceph-volume
  volumes:
  - name: ceph-volume
    persistentVolumeClaim:
      claimName: ceph-pvc

应用Pod配置:

kubectl apply -f ceph-pod.yaml

验证挂载是否成功:

kubectl exec -it ceph-pod -- df -h /mnt/ceph  # 查看容器内挂载的Ceph存储

三、HostPath存储(单节点测试用)

HostPath将Linux主机的目录挂载到Pod中,仅适用于单节点测试(如开发环境),不支持多节点共享。

1. 创建HostPath目录

在K8S节点上创建共享目录:

sudo mkdir -p /data/hostpath
sudo chmod 777 /data/hostpath

2. 创建PV和PVC

PV配置(hostpath-pv.yaml)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: hostpath-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/hostpath  # 主机目录
    type: DirectoryOrCreate  # 若目录不存在则创建

PVC配置(hostpath-pvc.yaml)

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: hostpath-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

应用配置:

kubectl apply -f hostpath-pv.yaml -f hostpath-pvc.yaml

3. 在Pod中使用PVC

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-pod
spec:
  containers:
  - name: hostpath-container
    image: nginx
    volumeMounts:
    - mountPath: "/usr/share/nginx/html"
      name: hostpath-volume
  volumes:
  - name: hostpath-volume
    persistentVolumeClaim:
      claimName: hostpath-pvc

应用Pod配置:

kubectl apply -f hostpath-pod.yaml

验证挂载是否成功:

kubectl exec -it hostpath-pod -- ls /usr/share/nginx/html  # 查看容器内挂载目录

若能看到主机/data/hostpath目录中的文件,说明配置成功。

注意事项

  • NFS:需确保所有K8S节点都能访问NFS服务器,且防火墙开放相关端口(2049、111等)。
  • Ceph:部署前需规划好存储池、PG数(Placement Group)等参数,确保存储性能。
  • HostPath:仅用于测试,生产环境不建议使用,因其无法保证数据持久性和多节点共享。

以上配置覆盖了K8S在Linux环境下的常见存储需求,可根据实际场景选择合适的方案。

0