持久卷-NFS
NFS卷是将现有的 NFS(网络文件系统)共享挂载到 Pod 中。NFS卷的内容被保留并且卷只是被卸载。这意味着 NFS 卷可以预先填充数据,而且可以在 pod 之间共享数据,如果有一个pod被删除不影响NFS中的数据。NFS 可以由多个pod写入器同时挂载。
一、NFS服务器搭建
先去搭建一个NFS服务器,这里以centos7 为例
#安装
[root@node ~]# yum -y install nfs-utils
#创建共享目录并设置权限
[root@node ~]# mkdir -p /data/nfs
[root@node ~]# chmod -R 777 /data/nfs/#编辑 /etc/exports
[root@node ~]# cat /etc/exports
/data/nfs *(rw,no_root_squash,sync)
[root@node ~]##生效
[root@node ~]# exportfs -r
[root@node ~]# exportfs
/data/nfs <world>
[root@node ~]#[root@node ~]# systemctl restart nfs
[root@node ~]# systemctl restart rpcbind
[root@node ~]# systemctl enable nfs
[root@node ~]# systemctl enable rpcbind#客户端测试
[root@master ~]# showmount -e 192.168.200.85
Export list for 192.168.200.85:
/nfs/data *
[root@master ~]#
以上操作没有问题接下来在Kubernetes 环境下做下一步操作
二、K8S创建 PV和PVC
编写PV yaml 文件
[root@master ~]# cat PV.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
labels:
pv: pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/nfs
server: 192.168.200.85
创建PV yaml 文件
[root@master ~]# kubectl apply -f PV.yaml
persistentvolume/pv created
查看PV状态
[root@master ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv 5Gi RWO Recycle Available nfs 53s
编写PVC yaml 文件
[root@master ~]# cat PVC.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: nfs
selector:
matchLabels:
pv: pv
[root@master ~]#
创建PVCyaml 文件
[root@master ~]# kubectl apply -f PVC.yaml
persistentvolumeclaim/pvc created
查看PVC状态
[root@master ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc Bound pv 5Gi RWO nfs 52s
以上操作没有问题接下来编写2个pod挂载操作
三、编写pod挂载,多个pod之间共享数据
编写2个pod同时也写service访问pod
#第一个
[root@master ~]# cat Pod1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod1
name: pod1
namespace: default
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: mynginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv
ports:
- containerPort: 80
volumes:
- name: pv
persistentVolumeClaim:
claimName: pvc
---
apiVersion: v1
kind: Service
metadata:
name: pod1
namespace: default
spec:
selector:
run: pod1
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
[root@master ~]##第二个
[root@master ~]# cat Pod2.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: pod2
name: pod2
namespace: default
spec:
containers:
- image: nginx:latest
imagePullPolicy: IfNotPresent
name: mynginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv
ports:
- containerPort: 80
volumes:
- name: pv
persistentVolumeClaim:
claimName: pvc
---
apiVersion: v1
kind: Service
metadata:
name: pod2
namespace: default
spec:
selector:
run: pod2
ports:
- port: 80
targetPort: 80
nodePort: 30081
type: NodePort
[root@master ~]#
创建Pod
[root@master ~]# kubectl apply -f Pod1.yaml
pod/pod1 configured
service/pod1 unchanged
[root@master ~]# kubectl apply -f Pod2.yaml
pod/pod2 configured
service/pod2 unchanged
[root@master ~]#
查看pod状态
[root@master ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/pod1 1/1 Running 0 6m7s
pod/pod2 1/1 Running 0 2m28sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5h27m
service/pod1 NodePort 10.106.113.149 <none> 80:30080/TCP 6m7s
service/pod2 NodePort 10.98.46.251 <none> 80:30081/TCP 2m28s
[root@master ~]#
进入pod查看是否挂载
[root@master ~]# kubectl exec pod1 df |grep data
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
192.168.200.85:/data/nfs 104846336 2040832 102805504 2% /usr/share/nginx/html
[root@master ~]# kubectl exec pod2 df |grep data
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
192.168.200.85:/data/nfs 104846336 2040832 102805504 2% /usr/share/nginx/html这里可以看到两个pod数据挂载成功
四、测试nfs共享
这里去测试一下共享是否可用,首先在pod1 中创建一个文件index.html文件并打开网站访问
[root@master ~]# kubectl exec -it pod1 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
root@pod1:/# echo 'pod:pod1 <br><h1>hi Pod1</h1>' >> /usr/share/nginx/html/index.html
root@pod1:/#以上在pod1中创建了一个index.html文件
测试网站访问
pod1:
pod2:
去NFS服务中查看是否有这个index文件
以上可以看到 在Pod1 创建的文件在NFS服务器中是存在的
接下来删了Pod1 文件是否存在
这里可以看到index文件还是存在的。完