1、nfs介绍和作用

        nfs卷能将 NFS (网络文件系统) 挂载到Pod 中。 不像 emptyDir 那样会在删除 Pod 的同时也会被删除,nfs卷的内容在删除 Pod 时会被保存,卷只是被卸载。

2、pv和pvc介绍

        pv持久卷是集群中的一块存储,可以由管理员事先制备,或者使用存储类来动态制备。
持久化存储,对存储资源进行抽象,对外提供可以调用的地方。

       pvc表达的是用户对存储的请求。概念上与Pod 类似。 Pod 会耗用节点资源,而 PVC 申领会耗用 PV 资源。Pod 可以请求特定数量的资源(CPU 和内存);同样 PVC 申领也可以请求特定的大小和访问模式 (例如,可以要求PV卷能够以 ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany 模式之一来挂载)。用于调用,不需要关心内部实现细节。

3、配置nfs服务器

        新准备一台虚拟机作为nfs服务器端,安装nfs,设置挂载路径

        3、1 安装nfs

$ yum install -y nfs-utils

        3、2 设置挂载路径

$ vi /etc/exports

# 添加如下内容
/data/nfs *{rw,no_root_squash}

        3、3 创建挂载路径

        注意:exports文件中设置的挂载路径必须存在

$ mkdir /data/nfs

4、k8s集群中的node节点安装nfs

        在所有k8s集群中的node节点安装nfs

$ yum install -y nfs-utils

5、启动nfs服务器端,开启nfs服务

$ systemctl start nfs

6、 验证node节点是否能够挂载到nfs服务器

$ showmount -e nfs服务器Ip

# 出现如下内容即代表可以挂载
Export list for 192.168.150.143:
/data/nfs *

7、创建pv

$ kubectl apply -f pv.yaml

# pv.yaml文件内容如下:
apiVersion: v1
kind: PersistentVolume          # 资源类型为pv
metadata:
  name: my-pv
spec:
  capacity:                     # 容量
    storage: 5Gi                # 5G
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs             # nfs挂载数据的目录地址
    server: 192.168.150.143     # nfs服务器端IP地址

8、创建pvc

$ kubectl apply -f pvc.yaml

# 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          # 5G容量

9、查看pvc是否绑定到pv

$ kubectl get pv,pvc
NAME                     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
persistentvolume/my-pv   5Gi        RWX            Retain           Bound    default/my-pvc                           19h

NAME                           STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
persistentvolumeclaim/my-pvc   Bound    my-pv    5Gi        RWX                           19h

可以看到pvc已经绑定到了pv上

10、查看nginx-dep1 Pod是否创建成功

$ kubectl get pods 
NAME                                            READY   STATUS    RESTARTS   AGE
nginx-dep1-58b7bf955f-7c7d8                     1/1     Running   0          20h
nginx-dep1-58b7bf955f-b5gpw                     1/1     Running   0          20h
nginx-dep1-58b7bf955f-rhfz8                     1/1     Running   0          20h

 可以看到nginx-dep1 的3个副本已经创建成功。

11、数据共享(nfs服务器上操作)

$ cd /data/nfs
$ vi index.html 
# 添加如下内容:
<h3>hello nfs</h3>

12、对外暴露应用

$ kubectl expose deployment ngin-dep1 --port=80 --target-port=80 --type=NodePort --name nginx

 查看service

$ kubectl get svc
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        13d
nginx            NodePort    10.103.95.41     <none>        80:31252/TCP   20h

 可以看到service已经成功创建成功。

13、浏览器端访问应用

通过IP:端口号在浏览器端访问nginx服务:

k8s部署使用NFS k8s使用nfs性能如何_kubernetes

 可以看到在nfs服务器端挂载路径下添加index.html文件后,Pod容器内容也相应发生了变化。