|NO.Z.00194|——————————|^^ 标准 ^^|——|KuberNetes&持久存储.V07|——|PV&PVC.v03|挂载NFS类型PV|
一、PV&PVC挂载NFS类型PV
### --- 创建了一个NFS的PV配置文件
~~~ # 创建挂载目录
[root@k8s-node01 ~]# mkdir -p /data/testDir
### --- 查看NFS服务端主机IP地址
[root@k8s-node01 ~]# ip addr
ens33: inet 192.168.1.14/24
### --- 书写nfs类型pv的yaml文件
[root@k8s-master01 ~]# vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0001
spec:
capacity:
storage: 5Gi # 容量
volumeMode: Filesystem
accessModes:
- ReadWriteMany # 多点读写,读写类型
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs-slow
mountOptions: # 可以不写的
- hard
- nfsvers=4.1
nfs:
path: /data/k8s-data/testDir # 挂载目录
server: 192.168.1.14 # NFSserver地址
二、创建一个PV
### --- 创建PV
[root@k8s-master01 ~]# kubectl create -f nfs-pv.yaml
persistentvolume/pv0001 created
### --- 查看PV的状态
~~~ # 若是使用者想要使用这个PV,需要创建一个PVC去申请
~~~ 注:现在的状态是Available,
~~~ 注:PV的状态:
[root@k8s-master01 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0001 5Gi RWX Recycle Available nfs-slow 13s
Available: // 空闲的PV,没有被任何PVC绑定。
Bound: // 已经被PVC绑定
Released: // PVC被删除,但是资源未被重新使用
Failed: // 自动回收失败。
三、创建一个PVC,绑定到指定类型的PV:配置文件
[root@k8s-master01 ~]# vim nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteMany
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: nfs-slow
### --- 注释:
name: myclaim // 这个名称可以随便写,是PVC的名称
accessModes:
- ReadWriteMany // 读写类型
storage: 2Gi // 存储是要比PV的空间要小,不可以比它高
storageClassName: nfs-slow // 要和PV的ClassName保持一致。
四、创建PVC
### --- 创建PVC
[root@k8s-master01 ~]# kubectl create -f nfs-pvc.yaml
persistentvolumeclaim/myclaim created
### --- 查看创建的PVC
~~~ 注:创建完成之后直接绑定到PV0001了
~~~ 状态;它的状态也变成了Bound,我们查看一下PV的状态
[root@k8s-master01 ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
myclaim Bound pv0001 5Gi RWX nfs-slow 7s
### --- 此刻Pod就可以直接使用它了
~~~ 注:PV的状态也变成了Bound,
~~~ CLAIM:绑定的PVC是谁。
[root@k8s-master01 ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv0001 5Gi RWX Recycle Bound default/myclaim nfs-slow
五、Pod去使用这个PVC;创建nfs.pv.pvc.yaml配置文件
### --- 创建所使用的Pod的yaml文件
[root@k8s-master01 ~]# vim demo-nginx.nfs.pv.pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "15"
creationTimestamp: "2020-03-16T14:36:14Z"
generation: 16
labels:
app: demo-nginx
name: demo-nginx
namespace: default
resourceVersion: "2644673"
selfLink: /apis/apps/v1/namespaces/default/deployments/demo-nginx
uid: ca0c135f-31a3-464c-b1f2-10f88e9f1c90
spec:
progressDeadlineSeconds: 600
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: demo-nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 1
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: demo-nginx
spec:
containers:
- command:
- sh
- -c
- sleep 36000000000
image: nginx
imagePullPolicy: IfNotPresent
name: nginx2
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /mnt
name: cache-volume
- mountPath: /tmp/nfs
name: nfs-test
- command:
- sh
- -c
- sleep 36000000000
image: nginx
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: web
protocol: TCP
resources:
limits:
cpu: 100m
memory: 270Mi
requests:
cpu: 100m
memory: 70Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /etc/nginx/nginx.conf
name: config-volume
subPath: etc/nginx/nginx.conf
- mountPath: /mnt/
name: config-volume-non-subpath
- mountPath: /tmp/1
name: test-hostpath
- mountPath: /tmp/2
name: cache-volume
- mountPath: /tmp/pvc
name: pvc-test
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
shareProcessNamespace: true
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /etc/hosts
type: File
name: test-hostpath
- configMap:
defaultMode: 420
items:
- key: nginx.conf
path: etc/nginx/nginx.conf
name: nginx-conf
name: config-volume
- configMap:
defaultMode: 420
name: nginx-conf
name: config-volume-non-subpath
- emptyDir:
medium: Memory
name: cache-volume
- name: nfs-test
nfs:
path: /data/k8s-data/testDir
server: 192.168.1.14
- name: pvc-test
persistentVolumeClaim:
claimName: myclaim
### --- 注释说明:
~~~ # 挂载地址配置
- mountPath: /tmp/pvc
name: pvc-test
~~~ # NFS配置
nfs:
path: /data/k8s-data/testDir
server: 192.168.1.14
- name: pvc-test // 新加一个名称
persistentVolumeClaim: // 类型
claimName: myclaim // PVC的名称;要和PV绑定下PVC的人名词保持一致
### --- nfs下创建一个共享目录
~~~ 创建并授权挂载目录
[root@k8s-node01 ~]# mkdir -p /data/k8s-data/testDir
### --- 授权可以访问该共享目录的用户
[root@k8s-node01 ~]# vim /etc/exports
/data/nfs/ 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
/data/k8s-data/ 192.168.1.0/24(rw,sync,no_subtree_check,no_root_squash)
[root@k8s-node01 ~]# exportfs -r
[root@k8s-node01 ~]# systemctl reload nfs-server
### --- 在k8s-master01下直接挂载测试
~~~ 在每个节点安装nfs的插件,不然识别不了。
[root@k8s-master01 ~]# yum install -y nfs-utils
[root@k8s-master01 ~]# mount -t nfs 192.168.1.14:/data/k8s-data/ /mnt/
六、replace这个pod,给nginx去挂载这个PVC;验证结果
### --- 查看pod
[root@k8s-master01 ~]# kubectl create -f demo-nginx.nfs.pv.pvc.yaml
deployment.apps/demo-nginx created
[root@k8s-master01 ~]# kubectl get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 121 9d 172.25.244.211 k8s-master01 <none> <none>
demo-nginx-67ff7f7bb5-cvfjn 2/2 Running 0 4m3s 172.27.14.221 k8s-node02 <none> <none>
demo-nginx-67ff7f7bb5-rvvcp 2/2 Running 0 4m3s 172.25.92.83 k8s-master02 <none> <none>
### --- 进入容器
[root@k8s-master01 ~]# kubectl exec -ti demo-nginx-67ff7f7bb5-rvvcp -c nginx -- bash
root@demo-nginx-67ff7f7bb5-rvvcp:/# df -Th
192.168.1.14:/data/k8s-data/testDir nfs4 95G 3.8G 92G 4% /tmp/pvc
### --- 写入文件
root@demo-nginx-67ff7f7bb5-rvvcp:/# echo ****yanqi_pv.test**** >> /tmp/pvc/yanqi_pv+pvc.test
### --- 在nfs服务端查看文件是否写入同步
~~~ 文件已经同步完成。说明这个NFS挂载成功。
[root@k8s-node01 ~]# cat /data/k8s-data/testDir/yanqi_pv+pvc.test
****yanqi_pv.test****
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了