K8S 经典实战案例:NFS+StorageClass+PV/PVC+Deployment

本篇文章分享一下在 Kubernetes (K8s) 中搭建 NFS 存储,并实现 PersistentVolume (PV)、PersistentVolumeClaim (PVC)、动态存储卷StorageClass,以及通过 Deployment 使用这些存储卷的完整流程,可以按照以下步骤进行。

实验步骤:

配置 NFS 服务器创建 StorageClass创建 PV创建 PVC创建 Deployment,并挂载 PVC 到应用

挂载验证实验架构图

图片

步骤 1: 配置 NFS 服务器

首先,在 Kubernetes 集群外部的服务器上,我们需要搭建一个后端存储:NFS 服务器。

NFS服务器IP地址:10.0.0.103

(1) 安装 NFS 服务

复制
yum install -y nfs-utils1.

(2) 创建共享目录

复制
mkdir -p /data/nfs1.

(3) 配置 NFS 共享目录

编辑 /etc/exports 文件以设置 NFS 共享目录。

复制
vim /etc/exports1.

在文件中添加以下行:

复制
/data/nfs *(rw,sync,no_subtree_check)1.

将 /data/nfs 目录以读写(rw)方式对所有客户端(*)共享。

(4) 启动 NFS 服务

启动并将NFS服务设置开机自启

复制
systemctl enable --now nfs-server1.

(5) 导出共享目录

使共享目录立即生效:

复制
exportfs -a showmount -e1.2.

(6) 配置防火墙

如果启用了防火墙,需要允许 NFS 服务的相关端口:

复制
firewall-cmd --per --add-service=nfs firewall-cmd --per --add-service=mountd firewall-cmd --per --add-service=rpc-bind firewall-cmd --reload1.2.3.4.
步骤 2: 配置StorageClass

在 Kubernetes 中,我们将使用 StorageClass 来动态配置存储卷。通过 PVC 绑定现有的 NFS 存储。

(1) 创建 StorageClass 配置

创建一个名为 nfs-storage-class.yaml 的文件,内容如下:

复制
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-storage-class provisioner: kubernetes.io/no-provisioner # NFS 不需要动态 provisioner reclaimPolicy: retain # 默认值是 Delete volumeBindingMode: WaitForFirstConsumer # 等待 Pod 使用 PVC 时才绑定 PV,默认使用 Immediate 模式:立即绑定1.2.3.4.5.6.7.

(2) 应用 StorageClass 配置

复制
kubectl apply -f nfs-storage-class.yaml1.

检查StorageClass状态

复制
[root@k8s-master data]# kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-storage-class kubernetes.io/no-provisioner Delete WaitForFirstConsumer false 14s1.2.3.
步骤 3: 创建 PV

创建一个 PersistentVolume (PV),将它指向 NFS 共享的目录。

(1) 创建 PV 配置文件

创建一个 nfs-pv.yaml 文件,内容如下:

复制
apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 10Gi # 定义 PV 的存储容量 volumeMode: Filesystem accessModes: - ReadWriteMany # 允许多个 Pod 同时访问此 PV persistentVolumeReclaimPolicy: Retain # 释放 PVC 后保留 PV 数据 storageClassName: nfs-storage-class # 与 StorageClass 名称一致 nfs: path: /data/nfs # NFS 共享目录的路径 server: 10.0.0.103 # 替换为实际的 NFS 服务器 IP1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.

(2) 应用 PV 配置

复制
kubectl apply -f nfs-pv.yaml1.

检查 PV 的状态:

复制
[root@k8s-master data]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-pv 5Gi RWX Retain Available nfs-storage-class 5s1.2.3.

如果 PV 配置正确,它应该处于 Available 状态。

步骤 4: 创建PVC

创建一个 PersistentVolumeClaim (PVC),它请求使用 NFS 存储。

(1) 创建 PVC 配置文件

创建一个 nfs-pvc.yaml 文件,内容如下:

复制
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany # 允许多个 Pod 同时访问 volumeMode: Filesystem resources: requests: storage: 3Gi # 请求的存储容量,不能大于PV容量 storageClassName: nfs-storage-class # 与 StorageClass 名称一致1.2.3.4.5.6.7.8.9.10.11.12.

(2) 应用 PVC 配置

应用 PVC 配置文件:

复制
kubectl apply -f nfs-pvc.yaml1.

检查 PVC 的状态:

复制
[root@k8s-master data]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-pvc Pending nfs-storage-class 4m30s1.2.3.

【温馨提示】由于在声明StorageClass时,将volumeBindingMode设置为WaitForFirstConsumer,等待 Pod 使用 PVC 时才绑定 PV,所以现在的PVC是Pending状态,没有绑定对应的Pod。

如果volumeBindingMode设置为Immediate,则会立即绑定,显示为Bound。

步骤 5: 挂载 PVC

创建一个 Deployment,并将 PVC 挂载到 Pod 中。

(1) 创建 Deployment 配置文件

创建一个名为 nginx-deployment.yaml 的文件,内容如下:

复制
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 1 # 部署 1 个副本(Pod) selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.m.daocloud.io/nginx:1.25 volumeMounts: - mountPath: /usr/share/nginx/html # 将 PVC 挂载到此目录 name: nfs-volume volumes: - name: nfs-volume persistentVolumeClaim: claimName: nfs-pvc # 挂载 PVC1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.

(2) 应用 Deployment 配置

复制
kubectl apply -f nginx-deployment.yaml1.

(3) 再次检查PVC状态

复制
[root@k8s-master data]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-pvc Bound nfs-pv 5Gi RWX nfs-storage-class 10m1.2.3.

此时可以看到已经是Bound状态,说明已经和Pod产生了关联。

(4) 检查 Pod 状态

使用以下命令检查 Pod 状态:

复制
[root@k8s-master data]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-645c47fd8b-sjv5m 1/1 Running 0 8m35s1.2.3.

确保 Pod 正在运行并没有错误。

【温馨提示】如果使用NFS作为后端存储,需要在每个节点上安装NFS客户端,不然Pod无法连接NFS,导致创建Pod失败。

步骤 6: 验证挂载

验证 Nginx Pod 是否正确挂载了 NFS 存储。

(1) 进入 Pod 检查挂载

首先,通过 kubectl exec 命令进入 Pod,检查 /usr/share/nginx/html 目录,看看是否已挂载 NFS 存储

复制
[root@k8s-master data]# kubectl exec -it nginx-deployment-645c47fd8b-sjv5m -- /bin/bash root@nginx-deployment-645c47fd8b-sjv5m:/# ls /usr/share/nginx/html kube-system-es-pv-claim-pvc-ef2cc9a4-d836-49fe-8d30-b9c98238f5b5 root@nginx-deployment-645c47fd8b-sjv5m:/#1.2.3.4.

如果一切正常,你应该能够看到 NFS 存储中的内容。如果是空的,那就意味着 Nginx Pod 已经成功挂载了 NFS 存储卷。

(2) 测试验证

测试:给index.html文件增加内容

复制
root@nginx-deployment-645c47fd8b-sjv5m:/usr/share/nginx/html# echo "hello nginx" > index.html1.

验证:进入后端NFS挂载目录查看:

复制
[root@harbor ~]# cd /data/nfs [root@harbor nfs]# ls index.html kube-system-es-pv-claim-pvc-ef2cc9a4-d836-49fe-8d30-b9c98238f5b5 [root@harbor nfs]# cat index.html hello nginx1.2.3.4.5.

可以看到在Pod里面创建的数据已经存储到NFS存储中。

至此,整个持久化存储的环境已经搭建完成。

阅读剩余
THE END