• 云原生技术持久化存储PV与PVC


    目录
    • 1.PV与PVC
      • PV:
      • PVC:
    • 2.PV资源回收
      • Retain:保留资源
      • Delete:删除数据
      • Recycle:回收(弃用)
    • 3.访问模式
    • 4.存储分类
      • 文件存储(Filesystem):
      • 块存储(block):
      • 对象存储:
    • 5.创建PV卷
      • 5.1.实例:创建NAS/NFS类型的PV
      • 创建一个PV
      • 5.2.实例:创建一个hostPath类型的PV
    • 6.PVC
      • 6.1.Pod与PVC与PV的关系
      • 6.2.创建一个PVC挂载到Pod

    1.PV与PVC

    PV:

    持久卷(PersistentVolume)简称PV,是集群中的一块存储,可以由管理员事先供应。
    可以配置NFS、Ceph等常用存储配置,相对于volumes,提供了更多的功能,如生命周期管理、大小的限制。

    PV 卷的供应有两种方式:静态供应或动态供应。

    静态:

    集群管理员预先创建许多PV,在PV的定义中能够体现存储资源的特性。

    动态:

    集群管理员无须预先创建PV,而是通过StorageClass的设置对后端存储资源进行描述,标记存储的类型和特性。用户通过创建PVC对存储类型进行申请,系统将自动完成PV的创建及与PVC的绑定。如果PVC声明的Class为空"",则说明PVC不使用动态模式。

    PVC:

    持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。就像Pod消耗Node的资源一样,PVC消耗PV资源。PVC可以申请存储空间的大小(size)和访问模式。

    由管理员创建PV连接到后端存储,使用人员或管理员创建PVC使用PV资源。

    2.PV资源回收

    当用户不再使用其存储卷时,他们可以从 API 中将 PVC 对象删除,从而允许 该资源被回收再利用。PV 对象的回收策略告诉集群,当其被 从申领中释放时如何处理该数据卷。 目前,数据卷可以被 Retained(保留)、Recycled(回收)或 Deleted(删除)。

    Retain:保留资源

    保留策略可以管理员手动回收资源,当PVC被删除后,PV仍然存在,对应的数据卷被视为"已释放(released)",管理员可以手动回收资源。

    Delete:删除数据

    需要插件支持,如果支持,那么删除PVC时也会自动删除PV和相关的后端存储资源;动态卷默认为delete。

    Recycle:回收(弃用)

    回收策略已被弃用,代替者为动态供应。如果下层的卷插件支持,回收策略 Recycle 会在卷上执行一些基本的 擦除(rm -rf /thevolume/*)操作,之后允许该卷用于新的 PVC 申领。

    3.访问模式

    ReadWriteOnce

    卷可以被一个节点以读写方式挂载。 ReadWriteOnce 访问模式也允许运行在同一节点上的多个 Pod 访问卷,缩写为RWO。

    ReadOnlyMany

    卷可以被多个节点以只读方式挂载,缩写为ROX。

    ReadWriteMany

    卷可以被多个节点以读写方式挂载,缩写为RWX。

    ReadWriteOncePod

    卷可以被单个 Pod 以读写方式挂载。 如果你想确保整个集群中只有一个 Pod 可以读取或写入该 PVC, 请使用ReadWriteOncePod 访问模式。这只支持 CSI 卷以及需要 Kubernetes 1.22 以上版本,缩写为RWOP。

    注意: 你的存储支不支持这种访问模式,具体情况查看:官方文档

    4.存储分类

    文件存储(Filesystem):

    一些数据可能需要多个节点使用,比如用户头像、用户上传文件等,实现方式:NFS、NAS、FTP等;NFS和FTP不推荐。

    块存储(block):

    一些数据只能被一个节点使用,或者是一块裸盘整个挂载使用,比如数据库、redis等,实现方式是Ceph、GlusterFS、公有云等。

    对象存储:

    由程序代码直接实现的一种存储方式,云原生应用无状态化常用的实现方式;实现方式:一般是符合53标准的云存储,比如AWS的53存储、Minio等。

    5.创建PV卷

    列举两个实例,其他类型可参考官网,因为我这资源有限。

    5.1.实例:创建NAS/NFS类型的PV

    生产不推荐NFS。可以使用NAS。

    准备一台NFS服务器

    第一步:准备一台NFS服务器,我这个装的有点多,你也可以只安装nfs服务器

    1. [root@localhost ~]# yum -y install nfs* rpcbind

    第二步:所有节点安装nfs客户端,不然不能识别,每一个需要挂载nfs的节点都需要装

    1. [root@k8s-master01 ~]# yum -y install nfs-utils

    第三步:在服务端创建共享目录

    1. [root@k8s-master01 ~]# yum -y install nfs-utils

    第四步:服务端配置共享目录

    1. [root@localhost ~]# cat /etc/exports
    2. /data/k8s/ *(rw,sync,no_subtree_check,no_root_squash)
    3. [root@localhost ~]# exportfs -r
    4. [root@localhost ~]# systemctl restart nfs rpcbind

    第五步:有另外一台机器挂载共享目录测试是否成功

    1. [root@k8s-master01 hgfs]# mount -t nfs 192.168.10.6:/data/k8s /mnt
    2. [root@k8s-master01 mnt]# mkdir hah
    3. [root@k8s-master01 mnt]# ls
    4. 111.txt hah
    5. # 在nfs服务端查看
    6. [root@localhost k8s]# ls
    7. 111.txt hah

    创建一个PV

    第一步:编写一个PV的yaml文件

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: pv-nfs
    5. spec:
    6. capacity:
    7. storage: 2Gi
    8. volumeMode: Filesystem
    9. accessModes:
    10. - ReadWriteOnce
    11. persistentVolumeReclaimPolicy: Recycle
    12. storageClassName: nfs-slow
    13. nfs:
    14. path: /data/k8s
    15. server: 192.168.10.6

    对上面的yaml文件做一下说明:

    通用的开头就不说了

    capacity:容量配置,这个pv使用多大容量,当然需要后端存储支持才行

    volumeMode:卷的模式,目录4有说明

    accessModes:PV的访问模式,目录3有说明

    accessClassName:PV的类,特定的PV只能绑定特定的PVC

    persistentVolumeReclaimPolicy:回收策略,目录2有说明

    nfs:NFS服务配置,里面包含共享目录和服务端IP

    第二步:执行yaml文件创建此PV;注意PV的成功跟后端存储正不正常没什么关系。

    1. [root@k8s-master01 ~]# kubectl create -f pv-nfs.yaml
    2. persistentvolume/pv-nfs created
    3. [root@k8s-master01 ~]# kubectl get pv
    4. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    5. pv-nfs 2Gi RWO Recycle Available nfs-slow 54s

    第三步:说一下PV的状态(STATUS)

    Available:可用,没有被PVC绑定的空闲资源

    Bound:已绑定,已经被PVC绑定

    Released:已释放,PVC被删除,资源未被重新使用

    Failed:失败,自动回收失败

    5.2.实例:创建一个hostPath类型的PV

    当你没有一个可靠的存储,但是数据又不能丢失,可以挂载到宿主机的路径,即使重启数据还在。

    第一步:创建一个pv-host.yaml文件

    1. apiVersion: v1
    2. kind: PersistentVolume
    3. metadata:
    4. name: host-pv-volume
    5. labels:
    6. type: local
    7. spec:
    8. storageClassName: hostpath
    9. capacity:
    10. storage: 1Gi
    11. accessModes:
    12. - ReadWriteOnce
    13. hostPath:
    14. path: "/mnt/data" # 宿主机路径

    第二步:执行yaml文件创建PV

    1. [root@k8s-master01 ~]# kubectl create -f pv-host.yaml
    2. persistentvolume/host-pv-volume created
    3. 您在 /var/spool/mail/root 中有新邮件
    4. [root@k8s-master01 ~]# kubectl get pv
    5. NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
    6. host-pv-volume 1Gi RWO Retain Available hostpath 9s
    7. pv-nfs 2Gi RWO Recycle Available nfs-slow 30m

    6.PVC

    6.1.Pod与PVC与PV的关系

    由一张图说一下PV与PVC的绑定,Pod又是怎么挂载PVC

    首先创建一个PV,它的名字是pv-nfs,storageClassName名字是nfs-slow(这个名字不唯一,就是说其他PV也可以叫这个名字)

    然后创建一个PVC,它的名字是test-pv-claim,storageClassName名字是nfs-slow(PVC绑定PV也是根据这个名字判断,根据上一点说的特性也就是说一个PVC可以绑定多个storageClassName名字是nfs-slow的PV)注意PVC设置的资源大小要等于小于PV。

    最后Pod使用的时候创建一个volumes,这个名字是test-pv-storage,这个volumes使用的PVC资源要写PVC的name,也就是test-pv-claim;等Pod中的容器挂载资源的时候挂载的名字是volumes的name,也就是test-pv-storage。

    6.2.创建一个PVC挂载到Pod

    注意:pvc要和Pod在同一个命名空间,而pv不需要;因为都是在默认空间,就没指定,需要注意。

    第一步:编写一个PVC的yaml文件

    1. apiVersion: v1
    2. kind: PersistentVolumeClaim
    3. metadata:
    4. name: test-pv-claim
    5. spec:
    6. accessModes:
    7. - ReadWriteOnce
    8. volumeMode: Filesystem
    9. resources:
    10. requests:
    11. storage: 2Gi # 小于等于pv
    12. storageClassName: nfs-slow

    第二步:执行yaml文件创建PVC;从下面这个状态来看已经绑定成功了,绑定了pv-nfs,类型为nfs-slow,都是前面指定的。

    1. [root@k8s-master01 ~]# kubectl create -f pvc-nfs.yaml
    2. persistentvolumeclaim/test-pv-claim created
    3. [root@k8s-master01 ~]# kubectl get pvc
    4. NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
    5. test-pv-claim Bound pv-nfs 2Gi RWO nfs-slow 20s

    第三步:创建Pod挂载PVC

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. labels:
    5. app: dp-nginx
    6. name: dp-nginx
    7. spec:
    8. replicas: 1
    9. selector:
    10. matchLabels:
    11. app: dp-nginx
    12. strategy: {}
    13. template:
    14. metadata:
    15. labels:
    16. app: dp-nginx
    17. spec:
    18. volumes:
    19. - name: test-pv-storage
    20. persistentVolumeClaim:
    21. claimName: test-pv-claim
    22. containers:
    23. - image: nginx
    24. name: nginx
    25. volumeMounts:
    26. - mountPath: "/usr/share/nginx/html"
    27. name: test-pv-storage

    第四步:创建Pod,进入Pod查看挂载情况

    1. [root@k8s-master01 ~]# kubectl replace -f dp-nginx.yaml
    2. deployment.apps/dp-nginx replaced
    3. [root@k8s-master01 ~]# kubectl get pod
    4. NAME READY STATUS RESTARTS AGE
    5. dp-nginx-fcd88d6f8-prxcd 1/1 Running 0 22s
    6. [root@k8s-master01 ~]# kubectl exec -ti dp-nginx-fcd88d6f8-prxcd -- bash
    7. root@dp-nginx-fcd88d6f8-prxcd:/# df -Th
    8. Filesystem Type Size Used Avail Use% Mounted on
    9. overlay overlay 17G 5.2G 12G 31% /
    10. tmpfs tmpfs 64M 0 64M 0% /dev
    11. tmpfs tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
    12. shm tmpfs 64M 0 64M 0% /dev/shm
    13. /dev/mapper/centos-root xfs 17G 5.2G 12G 31% /etc/hosts
    14. 192.168.10.6:/data/k8s nfs4 17G 2.4G 15G 14% /usr/share/nginx/html
    15. tmpfs tmpfs 3.8G 12K 3.8G 1% /run/secrets/kubernetes.io/serviceaccount
    16. tmpfs tmpfs 2.0G 0 2.0G 0% /proc/acpi
    17. tmpfs tmpfs 2.0G 0 2.0G 0% /proc/scsi
    18. tmpfs tmpfs 2.0G 0 2.0G 0% /sys/firmware
    19. # 可以看到10.6的共享目录已经挂载到了/nginx/html下

    第五步:测试,在nfs服务器共享目录下创建资源,进入Pod容器内查看是否存在

    1. # nfs服务器中创建资源
    2. [root@localhost k8s]# ls
    3. 111.txt hah
    4. # 在Pod的nginx容器中查看
    5. root@dp-nginx-fcd88d6f8-prxcd:/# cd /usr/share/nginx/html/
    6. root@dp-nginx-fcd88d6f8-prxcd:/usr/share/nginx/html# ls
    7. 111.txt hah
    8. # 内容存在,说明创建成功

    以上就是云原生技术持久化存储PV与PVC的详细内容,更多关于云原生持久化存储PV与PVC的资料请关注我们其它相关文章!

    时间: 2022-03-17

    云原生自动化应用于docker仓库私有凭据secret创建

    目录 Secret Secret的创建 应用于docker私有仓库的secret 其他 Secret Secret 是一种包含少量敏感信息例如密码.令牌或密钥的对象. 这样的信息可能会被放在 Pod 规约中或者镜像中. 使用 Secret 意味着你不需要在应用程序代码中包含机密数据.(这段话来自官网) 使用过程与ConfigMap类似 与ConfigMap不同的是: ConfigMap用于明文,Secret用于加密文件,如:密码 ConfigMap是没有类型的,但是Secret有类型(type)

    Docker搭建私有仓库之Harbor的步骤

    Harbor Harbor是构建企业级私有docker镜像的仓库的开源解决方案,它是Docker Registry的更高级封装, 它除了提供友好的Web UI界面,角色和用户权限管理,用户操作审计等功能外,它还整合了K8s的插件(Add-ons)仓库,即Helm通过chart方式下载,管理,安装K8s插件,而chartmuseum可以提供存储chart数据的仓库[注:helm就相当于k8s的yum].另外它还整合了两个开源的安全组件,一个是Notary,另一个是Clair,Notary类似于私有

    Docker Registry 私有仓库搭建详细步骤

    Docker  Registry 私有仓库搭建 官方已经提供了很多版本的 Linux 镜像,直接从官方仓库(Public Repositories)下载就可以了.如果考虑到安全性和速度,我们可能会想在自己局域网里架设一个私有仓库(Private Repositories)来放我们自己的镜像,Docker-Registry 正是我们需要的工具. 本次搭建 docker-registry server (dev) (v0.9.0) 添加docker用户和目录 为了安全起见,我们可以添加一个用户doc

    实现onmouseover和onmouseout应用于RadioButtonList或CheckBoxList控件上

    一直想实现onmouseover和onmouseout应用于RadioButtonList或CheckBoxList控件上,今晚终于有时间实现它.此功能就是当鼠标经过时RadioButtonList或CheckBoxList每一个Item时,让Item有特效显示,离开时,恢复原样.可以看到效果: RadioButtonList效果: CheckBoxList效果: 这资实现数据,Insus.NET准备了五行(Five Phases) 创建一个对象[Five Phases]:FivePhases.

    使用Nexus创建Docker仓库的方法步骤

    使用 Docker 官方的 Registry 创建的仓库,面临着这样的问题,比如删除镜像后空间默认不会回收,造成空间被占用.比较常见的做法是使用 Nexus 来管理企业的工具包. Nexus 不仅可以创建 Docker 仓库,也可以 NPM.Maven 等多种类型的仓库. 启动 Nexus 容器 $ docker run -d --name nexus3 --restart=always \ -p 8081:8081 \ -p 8082:8082 \ --mount src=nexus-data

    Maven一键部署Springboot到Docker仓库为自动化做准备(推荐)

    1 前言 前面<Springboot整合MongoDB的Docker开发,其它应用也类似>讲解了如何做Docker开发.如何把Springboot应用打包成一个镜像,但它是手动的,本文将讲解如何通过maven一键打包部署. 2 两个maven插件搞定 可以使用maven插件实现一键部署,这两个插件还是同一个公司的产品,就是著名的音乐流服务平台Spotify. 2.1 spotify/docker-maven-plugin 2.1.1 基础用法 该插件可以实现镜像打包和push到仓库,无Dock

    详解js私有作用域中创建特权方法

    本文实例分享了js私有作用域中创建特权方法,供大家参考,具体内容如下 特权方法就是有权访问私有变量和私有函数的公有方法: function MyObject(){ var privateVariable = 10; function privateFunction(){ return false; } this.publicMethod = function(){ privateVariable ++; return privateFunction(); }; } var x = new MyO

    Docker搭建私有仓库(registry与Harbor)的实现

    随着docker使用的镜像越来越多,就需要有一个保存镜像的地方,这就是仓库.目前常用的两种仓库:公共仓库和私有仓库.最方便的就是使用公共仓库上传和下载,下载公共仓库的镜像是不需要注册的,但是上传时,是需要注册的. 私有仓库最常用的就是registry.Harbor两种,那接下来详细介绍如何创建私有仓库. 一.搭建registry私有仓库 1)案例描述 两台docker服务器,dockerA创建registry私有仓库,dockerB用于测试! 2)案例实例 (1)DockerA服务器的操作 [r

    Docker搭建私有镜像仓库的方法

    和Mavan的管理一样,Dockers不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库. 使用私有仓库有许多优点: 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可: 提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用. 现在Docker用处越来越多了,所以今天就想着搭建一个私有镜像仓库来维护内部我们自己的镜像. 环境 CentOS 7.x Docker 1.12.6 安装 docker-

    Docker 搭建私有仓库(registry、harbor)

    为什么要弄私有仓库,大多是为了速度,我们再私有仓库中的push和pull的速度是特别快的. 利用registry快速搭建 https://hub.docker.com/_/registry/ Run a local registry: Quick Version $ docker run -d -p 5000:5000 --restart always --name registry registry:2 Now, use it from within Docker: $ docker pull

    Docker仓库常用命令详解

    登录 docker login 通过执行docker login命令来输入用户名.密码和邮箱来完成注册和登录.注册成功后,本地用户目录的.dockercfg中将保存着用户认证的信息. 从仓库拉取镜像 docker pull [镜像名] 搜索镜像 docker search [想要搜索的镜像名] 例如: C:\Users\kunta>docker search centos NAME DESCRIPTION STARS OFFICIAL AUTOMATED centos The official
     
  • 相关阅读:
    Cannot read property 'createElement' of undefined
    Another git process seems to be running in this repository
    React第一次渲染为何容易出现TypeError: Cannot read property 'XX' of undefined
    哟,来看看JS里面变量声明方式
    工欲善其事,必先利其器(一)
    ==与===
    day day up
    代码不规范,同事皮锤现(下)
    代码不规范,同事皮锤现(中)
    医学影像调窗技术
  • 原文地址:https://www.cnblogs.com/aspirant/p/16348649.html
Copyright © 2020-2023  润新知