Kubernetes之PersistentVolumeClaim 静态与动态供给实现NFS网络存储(李作强)

PersistentVolume 静态供给

网络存储

NFS是一种很早的技术,单机的存储在服务器方面还是非常主流的,但nfs唯一的就是缺点比较大就是没有集群版,做集群化还是比较费劲的,文件系统做不了,这是一个很大的弊端,大规模的还是需要选择一些分布式的存储,nfs就是一个网络文件存储服务器,装完nfs之后,共享一个目录,其他的服务器就可以通过这个目录挂载到本地了,在本地写到这个目录的文件,就会同步到远程服务器上,实现一个共享存储的功能,一般都是做数据的共享存储,比如多台web服务器,肯定需要保证这些web服务器的数据一致性,那就会用到这个共享存储了,要是将nfs挂载到多台的web服务器上,网站根目录下,网站程序就放在nfs服务器上,这样的话。每个网站,每个web程序都能读取到这个目录,一致性的数据,这样的话就能保证多个节点,提供一致性的程序了。

单独拿一台服务器做nfs服务器,我们这里先搭建一台NFS服务器用来存储我们的网页根目录

[root@nfs ~]# yum install nfs-utils -y

暴露目录,让是让其他服务器能挂载这个目录

[root@nfs ~]# mkdir /opt/k8s

[root@nfs ~]# vim /etc/exports

/opt/k8s 192.168.0.0/24(rw,no_root_squash,no_all_squash,sync)   #给这个网段加上权限,可读可写

[root@nfs ~]# systemctl start nfs

[root@nfs ~]# systemctl enable nfs

 

所有只要去共享这个目录就要都去安装这个客户端:

[root@k8s-node2 ~]# yum install nfs-utils -y

[root@k8s-node2 ~]# mount -t nfs 192.168.0.23:/opt/k8s /mnt

[root@k8s-node2 ~]# cd /mnt

[root@k8s-node2 mnt]# df -h

 

在客户端创建一个文件:

[root@k8s-node2 mnt]# touch a.txt

去服务器端查看已经数据是否共享过来了:

[root@nfs ~]# cd /opt/k8s/

删除nfs服务器的数据也会删除

PersistentVolumeClaim动态供给:

静态供给的话,会需要我们手动去创建pv,如果没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态,就是说找不到合适的伴侣了,所以解决这两种问题,就给出了这种动态供给,主要是能够自动帮你创建pv,就是你需要多大的容量,就自动给你创建多大的容量,也就是pv,k8s帮你创建了,创建pvc的时候就需要找pv了,这个时候就交给这个存储类了,而存储类呢,去帮你创建这些pv,存储类呢,就是实现了对指定存储的一个支持,直接帮你去调用api去创建存储类,所以就不需要人工的去帮你创建pv了。 而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪个存储,然后呢帮你去连接,再帮你去自动创建pv。

 

 

其实它是一个基于NFS实现的一个pv供给,它大概流程是这样的,我们可能会创建一个statefulset有状态的应用存储,然后有一个管理的nfs-storageClass,因为nfs目前是不支持这个自动的创建pv的,我们可以利用社区实现的插件来完成这个pv的自动创建,也就是StorageClass这一块,创建完之后,然后pod再去引用。

这个是kubernetes支持的动态供给的存储插件

https://kubernetes.io/docs/concepts/storage/storage-classes/

这里面呢会告诉你哪些存储支持哪些不支持,支持的话就不用使用社区的存储类了,如果不支持就要去找社区的存储类了,打钩的都是支持的,没打钩的就是不支持的。

 

这个是那个社区给我们提供的插件,来看一下

https://github.com/kubernetes-incubator/external-storage

 

K8s默认是不支持的,我们可以使用这个nfs-client这里面提供的yaml,社区开发的一个组件,这个组件能帮你自动创建PV,在deploy里面,我们会用到class,这个就会声明了你使用。

哪个存储,哪个提供的,它会以一个应用的方式部署起来,另外一个会用到的就是rbac,这个存储类会访问API,所以要为他定义RBAC授权策略,还有deployment,它是定义了以组件的形式部署起来,这个组件里面会有一个镜像,直接下载这个镜像就可以了,它可以帮我们自动的去创建pv,其实就是它来做的,如果k8s支持的话,就直接去调了,但k8s对NFS没有支持,所有需要使用这么个社区的组件来实现了,这里会定义NFS服务器的地址还有数据卷的来源

 

[root@k8s-master demo]# mkdir nfs-client

[root@k8s-master demo]# cd nfs-client/

上传下载下来的官方文件:

[root@k8s-master nfs-client]# rz -E

 

先创建一下rbac,这里也不用定义,直接创建就可以了

[root@k8s-master nfs-client]# kubectl create -f rbac.yaml

这里需要修改一个我们NFS服务器的地址以及NFS服务器的挂载目录

[root@k8s-master nfs-client]# vim deployment.yaml 

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: zhaocheng172/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
#修改nfs挂载目录和nfs服务器的地址:
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.30.27
            - name: NFS_PATH
              value: /opt/k8s
      volumes:
        - name: nfs-client-root
          nfs:
            server: 192.168.30.27
            path: /opt/k8s

[root@k8s-master nfs-client]# kubectl create -f class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
#声明创建managed-nfs-storage,名字可以自定义
  name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
  archiveOnDelete: "false"

 

[root@k8s-master nfs-client]# kubectl create -f deployment.yaml

这里提供者就是fuseim.pri/ifs,在我们的class里面可以看到,storage需要告知使用者,使用者部署应用到k8s中,想使用这个自动供给,你必须告知它,它需要你在yaml文件里声明这个提供者,那就意味着提供者storageclass可以配置多个,可以是NFS,另一个是Ceph,另一个是云存储,都可以可以多个,只要它在创建应用时指定使用哪个storageclass,它就会在指定在哪个存储上创建自动pv

 

[root@k8s-master nfs-client]# kubectl get storageclass

这是我们动态供给的yaml格式,在pvc去指定我们的存储类storageClassName:  "managed-nfs-storage"

[root@k8s-master nfs-client]# vim pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
      - name: www
        mountPath: /usr/share/nginx/html
  volumes:
    - name: www
      persistentVolumeClaim:
        claimName: my-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

 

[root@k8s-master nfs-client]# kubectl create -f pod.yaml

查看我们的pv,pvc已经自动帮我们去创建,就不用我们手动再去创建pv了

 

[root@k8s-master nfs-client]# kubectl get pod

[root@k8s-master nfs-client]# kubectl get pv,pvc

而在我们nfs服务器上也能看到pvc的目录,现在我们就可以去用了

[root@localhost k8s]# ls

default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a wwwroot zhaocheng zhaochengcheng

[root@localhost k8s]# cd default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a/

[root@localhost default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a]# ls

[root@localhost default-my-pvc-pvc-a24d4a5e-8f9d-4478-bfe5-b86e2360ae5a]# echo "hello persistentvolumeclaim" > index.html

 

查看我们的容器pod

[root@k8s-master nfs-client]# kubectl exec -it my-pod bash

root@my-pod:/# cat /usr/share/nginx/html/index.html

hello persistentvolumeclaim

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值