介绍
NFS是一种基于TCP/IP传输的网络文件系统协议,最初由sun公司开发,通过NFS协议。客户机可以向访问本地目录一样访问远程NFS服务器中的共享资源。
NFS也是NAS存储设备必然支持的一种协议,但是因为没有用户认证机制,而且数据在网络上明文传输、安全性很差,所以一般只能在局域网中使用。
一、NFS
使用NFS持久化存储,必须要保证NFS服务器和所有Node节点上都部署了NFS服务,否则无法进行挂载。
1. 部署nfs
1.1 找一台服务器作为nfs服务端
- 在nfs服务器上安装nfs服务,并且设置挂载路径为
/data/nfs
# 安装nfs yum install -y nfs-utils # 设置挂载路径 vim /etc/exports
/data/nfs *(rw,no_root_squash)
1.2 检查:
执行如下命令,不报错即可。如果报错说明配置文件/etc/exports
有问题,会有提示,修改/etc/exports文件即可。
exportfs -r # 不报错即可
1.3 创建挂载路径
挂载路径需要自己创建,这里的挂在路径为:/data/nfs
mkdir /data cd/data mkdir nfs
1.4 在nfs服务器启动nfs服务
systemctl start nfs ps -ef | grep nfs
2. 所有node节点部署nfs服务
在k8s集群的所有node节点上安装nfs,以保证能够挂载成功
yum install -y nfs-utils
3. 测试—部署nginx应用,使用nfs持久网络存储
- 在pv目录下创建
nfs-nginx.yaml
文件,将下述代码复制进去:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep1 spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 192.168.2.6 ## nfs服务器IP path: /data/nfs ## nfs服务器挂在路径
运行yaml文件
kubevtl apply -f nfs-nginx.yaml
查看pod
kubectl get pods
- 在nfs服务器中,目录/data/nfs/下创建
index.yaml
文件,编辑文件内容
- 进入master中创建的pod,查看index.yaml文件存在,查看内容
kubectl exec -it [pod 名称] bash ls /usr/share/nginx/html cat /usr/share/nginx/html/index.html
- 暴露端口号
kubectl expose deployment nginx-dep1 --port=80 --target-port=80 --type=NodePort
查看端口号
kubectl get svc
5、IP+端口号访问nginx网页,显示编辑的内容
看到以上内容说明挂载成功。
二、 PV和PVC
2.1 PV
持久化存储,对存储资源进行抽象,对外提供可以调用的地方(生产者)
2.2 PVC
用于调用,不需要关心内部实现细节(消费者)
2.3 实现流程
pv相当于物理主机,pvc相当于电脑中的C盘D盘等存储磁盘,必须依赖于主机存在,类似于pvc必须要绑定pv
2.4 PV&PVC挂载步骤
- 在master节点上创建pv目录,在pv目录下创建两个yaml文件,
pv.yaml
和pvc.yaml
,yaml文件内容如下,复制到对应yaml文件中:
pv.yaml内容:
apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /data/nfs ## nfs服务器中挂在路径 server: 192.168.2.6 ## nfs服务器IP
pvc.yaml内容:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-dep1 spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot persistentVolumeClaim: claimName: my-pvc --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
运行两个yaml文件
kubectl apply -f pv.yaml kubectl apply -f pvc.yaml
查看
kubectl get pods kubectl get pv,pvc
进入任意一个创建的pod中,由于副本数为3,所以我们随便进一个pod里,就会有和nfs服务器一样的index.html文件
kubectl exec -it nginx-dep1-58b7bf955f-7s8hp bash
下图是master节点上,进入pod内的index.hml
下图是nfs服务器上挂载路径下的index.html