k8s存储卷和动态创建pv

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

1、kubernetes中的存储卷

1、为什么需要存储卷



  • 在摆设pod的时间,启动时需要配置文件
  • 另有产生的临时的数据,需要多个容器共享
  • 另有数据库的持久化数据
  • 另有一个最紧张的一点就是默认环境下,容器的文件在磁盘上是临时存放的,如果这个容器需要删除的话,这些数据也就会消失,之前的配置就没有了,所以需要存储卷来存储之前的配置
2、emptyDir(临时存储卷)



  • 顾名思义,就是一个临时存储数据的,可以实现pod中的容器之间共享目录数据,但是没有持久化的数据,存储卷会随着pod的竣事而竣事
  1. # 这个字段
  2. kubectl explain pod.spec.volumes.emptyDir
  3. medium # 指定emptydir卷的存储位置,Default和Memory
  4. sizeLimit # 用于指定存储卷的大小
复制代码
1、emptydir实现

  1. [root@master mnt]# cat n1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: n1
  8.   name: n1
  9. spec:
  10.   nodeName: node1
  11.   containers:
  12.   - image: docker.io/library/nginx:latest
  13.     imagePullPolicy: IfNotPresent
  14.     name: n1
  15.     resources: {}
  16.     volumeMounts:
  17.     - name: empty
  18.       mountPath: /var/empty
  19.   volumes:
  20.   - name: empty
  21.     emptyDir: {}
  22.   dnsPolicy: ClusterFirst
  23.   restartPolicy: Always
  24. status: {}
  25. [root@master pods]# kubectl get pod n1 -o jsonpath='{.metadata.uid}'
  26. 1c580bb2-23ab-4116-9996-065fa87a03dd
  27. # 进入到/var/lib/kubelet/pods/这个目录,就可以看到临时存储挂载的目录了
复制代码
3、hostPath(节点存储卷)



  • 就是将node节点上面的目录以文件挂载到pod容器指定目录上面去
  • 但是有一个缺点,如果这个pod调度在别的节点上面的话,那么就不能实现跨node节点的pod共享资源了,但是可以指定这个pod不停调度在这个节点上面去即可
  • 能在单独的一个节点上面持久化存储数据
1、hostPath字段

  1. [root@master mnt]# kubectl explain pod.spec.volumes.hostPath
  2. type # 字段的取值为DirectoryOCreate 如果给定的路径上面什么都不存在的话,那么就需要创建空目录,默认是这个
  3. # Directory 就是路径上面必须存在目录
复制代码
2、hostPath实现

  1. [root@master mnt]# cat n1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: n1
  8.   name: n1
  9. spec:
  10.   nodeName: master
  11.   containers:
  12.   - image: docker.io/library/nginx:latest
  13.     imagePullPolicy: IfNotPresent
  14.     name: n1
  15.     resources: {}
  16.     volumeMounts:
  17.     - name: hostpath
  18.       mountPath: /var/hostpath
  19.   volumes:
  20.   - name: hostpath
  21.     hostPath:
  22.       path: /var/hostpath
  23.   dnsPolicy: ClusterFirst
  24.   restartPolicy: Always
  25. status: {}
复制代码
4、nfs(网络共享)



  • 就是搭建一个NFS,然后使用共享目录提供出去,如许的话,不需要关心pod调度在哪一个节点上面去了,都可以获取到之前的配置了
  1. [root@master mnt]# cat /etc/exports
  2. /mnt/nfs *(rw)
  3. [root@master mnt]# cat n1.yaml
  4. apiVersion: v1
  5. kind: Pod
  6. metadata:
  7.   creationTimestamp: null
  8.   labels:
  9.     run: n1
  10.   name: n1
  11. spec:
  12.   nodeName: master
  13.   containers:
  14.   - image: docker.io/library/nginx:latest
  15.     imagePullPolicy: IfNotPresent
  16.     name: n1
  17.     resources: {}
  18.     volumeMounts:
  19.     - name: nfs
  20.       mountPath: /var/nfs
  21.   volumes:
  22.   - name: nfs
  23.     nfs:
  24.       server: 10.104.43.227  # nfs的ip地址
  25.       path: /mnt/nfs   # nfs提供的挂载的目录
  26.   dnsPolicy: ClusterFirst
  27.   restartPolicy: Always
  28. status: {}
复制代码
2、kubernetes中的数据卷pv和pvc

1、根本先容pv和pvc



  • pv是一个从存储装备空间中逻辑划分创建出来的可持久化的存储对象,也就是磁盘中分出来一部门用于做成pv,就是一些硬盘等
  • 持久卷声明PVC,对pv存储资源的请求和和绑定,相当于是格式化吧,pod使用的一种存储卷的类型
1、pv的状态

生命周期描述Available(可用)pv的创建,直接创建pv的静态方式,还没有被pvc绑定bindingpv和pvc绑定后即可Released(已开释)体现PVC被删除了,但是PV还没被回收failed(失败)体现pv自动回收失败 2、accessModes字段

访问模式描述ReadWriteOnce(rwo)读写的权限,但是只能被单个的node挂载ReadOnMany(rox)只读的,允许被多个node挂载ReadWriteMany(rwx)读写的权限,允许被多个node挂载 3、回收计谋



  • 就是pv的一些计谋
  • Retain的话就是PVC删除的时间,pv会被保存在集群中,不会被删除,也不会自动的清算里面的数据,但是pvc被删除后,pv仍然存在,需要手动删除pv大概清算里面的数据,就可以再次使用
  • Recycle 当PVC被删除时,pv中的所有文件会被清除掉,这个计谋只有NFS和HostPath的PV支持,就是清算存储中的文件,然后就能使用了
  • Delete 当删除pvc的时间,pv会被自动删除,相关的数据也会被删除掉
2、创建的pvc的思路



  • 起首需要搭建一个MFS服务器,提供一个对外的共享文件夹,然后创建pv,以这个文件夹为例,如许PV就创建出来了,然后创建一个PVC,绑定即可,就能使用了PVC了
  1. [root@master mnt]# cat pv-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv1
  6. spec:
  7.   nfs:
  8.     path: /mnt/nfs
  9.     server: 10.104.43.227
  10.   accessModes:
  11.   - ReadWriteMany
  12.   capacity:
  13.     storage: 2Gi
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolumeClaim
  17. metadata:
  18.   name: pvc1
  19. spec:
  20.   accessModes:  # pvc的访问模式,需要与上面保持的一致即可
  21.   - ReadWriteMany
  22.   resources:  # pvc需要的大小
  23.     requests:
  24.       storage: 2Gi
  25. [root@master mnt]# cat n1.yaml
  26. apiVersion: v1
  27. kind: Pod
  28. metadata:
  29.   creationTimestamp: null
  30.   labels:
  31.     run: n1
  32.   name: n1
  33. spec:
  34.   nodeName: master
  35.   containers:
  36.   - image: docker.io/library/nginx:latest
  37.     imagePullPolicy: IfNotPresent
  38.     name: n1
  39.     resources: {}
  40.     volumeMounts:  
  41.     - name: pvc1
  42.       mountPath: /usr/share/nginx/html
  43.   volumes:
  44.   - name: pvc1
  45.     persistentVolumeClaim: # 使用pvc挂载
  46.       claimName: pvc1
  47.   dnsPolicy: ClusterFirst
  48.   restartPolicy: Always
  49. status: {}
复制代码
3、动态的创建PV



  • 上面的静态有一个缺点,就是如果需要大量的pv,就需要创建许多的pv,因此的话,就会有一个动态的创建pv的出来,创建出来
1、自动创建的思路

  1. # 因为安装这个自动创建pv的插件,也就是供应商,所以的话就需要sa和权限
复制代码


  • 起首创建一个nfs服务器
  • 然后创建sa和账户
  • 然后创建供应商,绑定sa和nfs服务器,如许的话自动创建pvc,这个供应商就会自动的创建pv出来,与pvc进行绑定,然而,这个pv就是从这个nfs服务器提供的目录里面进行划分的
  • 如许的话就实现了自动创建pv的操作
2、动态创建的实现

1、创建一个nfs服务器和账户和绑定权限

  1. # 创建一个nfs服务器
  2. [root@master mnt]# cat /etc/exports
  3. /mnt/nfs *(rw)
  4. # 这样的话,这个账户就创建出来了,并且赋予了权限
  5. [root@master pvc]# cat s1.yaml
  6. apiVersion: v1
  7. kind: ServiceAccount
  8. metadata:
  9.   creationTimestamp: null
  10.   name: s1
  11. ---
  12. apiVersion: rbac.authorization.k8s.io/v1
  13. kind: ClusterRoleBinding
  14. metadata:
  15.   name: s1-role-binding
  16. roleRef:
  17.   apiGroup: rbac.authorization.k8s.io
  18.   kind: ClusterRole
  19.   name: cluster-admin
  20. subjects:
  21. - apiGroup: ""
  22.   kind: ServiceAccount
  23.   name: s1
  24.   namespace: default
复制代码
2、创建一个供应商

  1. [root@master pvc]# cat nfs-provisioner.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     app: nfs-provisioner
  8.   name: nfs-provisioner
  9. spec:
  10.   replicas: 1
  11.   selector:
  12.     matchLabels:
  13.       app: nfs-provisioner
  14.   strategy: {}
  15.   template:
  16.     metadata:
  17.       creationTimestamp: null
  18.       labels:
  19.         app: nfs-provisioner
  20.     spec:
  21.       serviceAccountName: s1
  22.       containers:
  23.       - image: uhub.service.ucloud.cn/k8s-q7/nfs-subdir-external-provisioner:v4.0.0  # 供应商镜像
  24.         name: nfs-client-provisioner
  25.         imagePullPolicy: IfNotPresent
  26.         volumeMounts:
  27.         - name: nfs-client-root
  28.           mountPath: /persistentvolumes
  29.         env:
  30.         - name: PROVISIONER_NAME  # 配置provisioner的name,这个名字需要与后面创建动态类一样名字
  31.           value: nfs-storage
  32.         - name: NFS_SERVER  # 配置绑定NFS的服务器
  33.           value: 10.104.43.227
  34.         - name: NFS_PATH  # NFS服务器目录
  35.           value: /mnt/nfs
  36.       volumes:
  37.       - name: nfs-client-root
  38.         nfs:
  39.           server: 10.104.43.227
  40.           path: /mnt/nfs
复制代码
3、创建一个存储类(storage class)

  1. [root@master pvc]# cat storage.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: storage1
  6. provisioner: nfs-storage  # 名字与provisioner的一致
  7. [root@master pvc]# kubectl get storageclasses.storage.k8s.io
  8. NAME       PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  9. storage1   nfs-storage   Delete          Immediate           false                  9m52s
复制代码
4、创建一个pvc的pod

  1. [root@master pvc]# cat pvc1.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc1
  6. spec:
  7.   accessModes:
  8.   - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 2Gi
  12.   storageClassName: storage1
  13. [root@master pvc]# kubectl get pvc
  14. NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  15. pvc1   Bound    pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d   2Gi        RWX            storage1       9m8s
  16. [root@master pvc]# kubectl get pv
  17. NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
  18. pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d   2Gi        RWX            Delete           Bound    default/pvc1   storage1                9m10s
  19. # 这个nfs目录也会创建一个目录来使用
  20. [root@master nfs]# pwd
  21. /mnt/nfs
  22. [root@master nfs]# ls
  23. default-pvc1-pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d
复制代码
3、总结



  • 动态的创建pv,就是先创建一个底座,也就是提供存储的NFS,然后创建一个供应商,连接这个NFS,创建一个动态的存储类连接这个供应商,如许的话,就能创建pvc的时间,自动的创建pv了
  • 查看pod的uid
  1. [root@master nfs]# kubectl get pod n1 -o jsonpath='{.metadata.uid}'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表