Linux下K8S存储配置指南
Kubernetes(K8S)的存储配置需根据场景选择合适的存储类型(如NFS、Ceph、HostPath等),其中NFS是最常用的网络存储方案,适用于多节点共享存储;Ceph提供高性能块存储,适合生产环境;HostPath仅用于单节点测试。以下是详细配置步骤:
NFS(Network File System)通过TCP/IP网络共享目录,支持多节点同时读写,适合需要共享数据的场景(如Web服务器、数据库备份)。
在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服务配置成功。
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”)
通过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是分布式存储系统,提供块存储(RBD)、对象存储(RGW)和文件存储(CephFS),适合需要高可用、高性能的生产环境。
使用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状态)。
存储类用于动态分配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
通过存储类动态分配存储,无需手动创建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将Linux主机的目录挂载到Pod中,仅适用于单节点测试(如开发环境),不支持多节点共享。
在K8S节点上创建共享目录:
sudo mkdir -p /data/hostpath
sudo chmod 777 /data/hostpath
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
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目录中的文件,说明配置成功。
以上配置覆盖了K8S在Linux环境下的常见存储需求,可根据实际场景选择合适的方案。