• DO280分配持久性存储


    🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
    📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
    💬格言:努力不一定成功,但要想成功就必须努力🔥

    🎈支持我:可点赞👍、可收藏⭐️、可留言📝

    📜持久存储

    📑持久存储概述

    默认情况下,运行容器使用容器内的临时存储。Pods由一个或多个容器组成,这些容器一起部署,共享相同的存储和其他资源,可以在任何时候创建、启动、停止或销毁。使用临时存储意味着,当容器停止时,写入容器内的文件系统的数据将丢失。

    当容器在停止时也需要持久的保存数据时,OpenShift使用Kubernetes持久卷(PVs)为pod提供持久存储。


    📑持久存储场景

    通常用于数据库,启动一个数据库的pod时提供的默认临时存储。如果销毁并重新创建数据库pod,则销毁临时存储并丢失数据。如果使用持久存储,则数据库将数据存储到pod外部的持久卷中。如果销毁并重新创建pod,数据库应用程序将继续访问存储数据的相同外部存储。


    📑持久存储相关概念

    持久卷(PV)是OpenShift资源,它只由OpenShift管理员创建和销毁。持久卷资源表示所有OpenShift节点都可以访问的网络连接存储。


    持久性存储组件:

    OCP使用Kubernetes持久卷(PV)技术,允许管理员为集群提供持久性存储。开发人员使用持久性卷声明(PVC)请求PV资源,而不需要了解具体的底层存储基础设施。

    Persistent Volume:PV是OpenShift集群中的资源,由PersistentVolume API对象定义,它表示集群中由管理员提供的现有网络存储的一部分。它是集群中的资源,就像节点是集群资源一样。PV的生命周期独立于使用PV的任何单独pod。

    Persistent Volume Claim:pvc由PersistentVolumeClaim API对象定义,该对象表示开发人员对存储的请求。它与pod类似,pod消耗节点资源,而pvc消耗PV资源。


    📑持久存储插件

    卷是挂载的文件系统,对pods及其容器可用,并且可以由许多本地或网络连接的存储进行备份。OpenShift使用插件来支持以下不同的后端用于持久存储:

    • NFS
    • GlusterFS
    • OpenStack Cinder
    • Ceph RBD
    • AWS Elastic Block Store (EBS)
    • GCE Persistent Disk
    • iSCSI
    • Fibre Channel
    • Azure Disk and Azure File
    • FlexVolume (allows for the extension of storage back-ends that do not have a built-in plug-in)
    • VMWare vSphere
    • Dynamic Provisioning and Creating Storage Classes
    • Volume Security
    • Selector-Label Volume Binding

    📑PV访问模式

    PV可以以resource provider的任何方式挂载在主机上,provider具有不同的功能,并且每个持久卷的访问模式都设置为该特定卷支持的特定模式。例如,NFS可以支持多个读/写客户端,但是特定的NFS PV可以在服务器上作为只读导出。

    每个PV接收自己的一组访问模式,描述特定的持久卷的功能。

    访问模式见下表:

    访问模式CLI缩写描述
    ReadWriteOnceRWO卷可以被单个节点挂载为读/写
    ReadOnlyManyROX卷可以由许多节点以只读方式挂载
    ReadWriteManyRWX卷可以被许多节点挂载为读/写

    PV claims与具有类似访问模式的卷匹配。唯一的两个匹配标准是访问模式和大小。claim的访问模式表示请求。因此,可以授予用户更大的访问权限,但绝不能减少访问权限。例如,如果一个claim请求RWO,但是惟一可用的卷是NFS PV (RWO+ROX+RWX),那么claim将匹配NFS,因为它支持RWO。

    所有具有相同模式的卷都被分组,然后按大小(从最小到最大)排序。

    master上负责将PV绑定到PVC上的service接收具有匹配模式的组,并在每个组上迭代(按大小顺序),直到一个大小匹配为止,然后将PV绑定到PVC上。


    📑Persistent Volume Storage Classes

    PV Claims可以通过在storageClassName属性中指定它的名称来选择性地请求特定的存储类。只有与PVC具有相同存储类名称的请求类的pv才能绑定到PVC。

    集群管理员可以为所有PVC设置一个默认存储类,或者配置动态供应程序来服务一个或多个存储类,这些存储类将匹配可用PVC中的规范。


    📑创建PV和PVC资源

    pv是集群中的资源,pvc是对这些资源的请求,也充当对资源的claim检查。PV与PVCs的相互作用具有以下生命周期:

    • 创建持久卷

    集群管理员创建任意数量的pv,这些pv表示集群用户可以通过OpenShift API使用的实际存储的信息。

    • 定义持久卷声明

    用户创建具有特定存储量、特定访问模式和可选存储类的PVC。master监视新的pvc,要么找到匹配的PV,要么等待存储类创建一个供应程序,然后将它们绑定在一起。

    • 使用持久存储

    Pods使用claims作为卷。集群检查查找绑定卷的声明,并为pod绑定该卷。对于那些支持多种访问模式的卷,用户在将其声明用作pod中的卷时指定需要哪种模式。

    一旦用户有了一个claim,并且该claim被绑定,绑定的PV就属于用户,使用过程中该PV都属于该用户。用户通过在pod的Volume中包含一个持久的卷claim来调度pod并访问其声明的pv。


    📑使用NFS的PV

    OpenShift使用随机uid运行容器,因此将Linux用户从OpenShift节点映射到NFS服务器上的用户并不能正常工作。作为OpenShift pv使用的NFS共享必须遵从如下配置:

    • 属于nfsnobody用户和组。
    • 拥有rwx------权限(即0700)。
    • 使用all_squash选项

    示例配置:

    /var/export/vol *(rw,async,all_squash)

    其他NFS export选项,例如sync和async,与OpenShift无关。如果使用任何一个选项,OpenShift都可以工作。但是,在高延迟环境中,添加async选项可以加快NFS共享的写操作(例如,将image push到仓库的场景)。

    使用async选项更快,因为NFS服务器在处理请求时立即响应客户端,而不需要等待数据写到磁盘。

    当使用sync选项时,则相反,NFS服务器只在数据写到磁盘之后才响应客户端。

    注意:NFS共享文件系统大小和用户配额对OpenShift没有影响。PV大小在PV资源定义中指定。如果实际文件系统更小,则PV被创建并绑定。如果PV更大,OpenShift不会将使用的空间限制为指定的PV大小,并且允许容器使用文件系统上的所有空闲空间。OpenShift自身提供了存储配额和存储位置限制,可用于控制项目中的资源分配。

    默认的SELinux策略不允许容器访问NFS共享。必须在每个OpenShift实例节点中更改策略,方法是将virt_use_nfs和virt_sandbox_use_nfs变量设置为true。

    # setsebool -P virt_use_nfs=true

    # setsebool -P virt_sandbox_use_nfs=true


    📑NFS回收政策

    NFS支持OpenShift的Recyclable插件,根据在每个持久卷上设置的策略处理自动执行回收任务。

    默认情况下,持久卷被设置为Retain。Retain reclaim策略允许手动回收资源。当删除pv claim时,持久卷仍然存在,并且认为该卷已被释放。但它还不能用于另一个claim,因为来自前一个claim的数据仍然保留在卷上。此时管理员可以手动回收卷。

    NFS卷及其回收策略设置为Recycle,表示在从claim中释放后将被清除。例如,当将NFS回收策略设置为Recycle后,在删除用户绑定到该卷的pv claim之后,会在该卷上运行rm -rf命令。在它被回收之后,NFS卷可以直接绑定到一个新的pv claim。


    📑Supplemental group

    Supplemental group是常规的Linux组。当一个进程在Linux中运行时,它有一个UID、一个GID和一个或多个Supplemental group。可以为容器的主进程设置这些属性。

    Supplemental groupid通常用于控制对共享存储的访问,比如NFS和GlusterFS,而fsGroup用于控制对块存储(如Ceph的RBD活iSCSI)的访问。

    OpenShift共享存储插件挂载卷,以便使挂载上的POSIX权限与目标存储上的权限匹配。例如,如果目标存储的所有者ID是1234,组ID是5678,那么宿主节点和容器中的挂载将具有相同的ID。因此,容器的主进程必须匹配一个或两个id,才能访问该卷。

    [root@node ~]# showmount -e
    Export list for master.lab.example.com:
    /var/export/nfs-demo *
    [root@services ~]# cat /etc/exports.d/nfs-demo.conf
    /var/export/nfs-demo
    ...
    [root@services ~]# ls -lZ /var/export -d
    drwx------. 10000000 650000 unconfined_u:object_r:usr_t:s0 /var/export/nfs-demo
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    图上示例,UID 10000000和组650000可以访问/var/export/nfs-demo export。通常,容器不应该作为root用户运行。在这个NFS示例中,如果容器不是作为UID 10000000运行的,并且不是组650000的成员,那么这些容器就不能访问NFS export。


    📑通过fsgroup使用块存储

    fsGroup定义了pod的“file-system group”ID,该ID被添加到容器的supplemental group中。supplemental group ID应用于共享存储,而fsGroup ID用于块存储。

    块存储,如Ceph RBD、iSCSI和各种类型的云存储,通常专用于单个pod。与共享存储不同,块存储由pod接管,这意味着pod(或image)定义中提供的用户和组id应用于实际的物理块设备,块存储通常不共享。


    📑SELINUX和卷security

    除了SCC之外,所有预定义的安全上下文约束都将seLinuxContext设置为MustRunAs。最可能匹配pod需求的SCC迫使pod使用SELinux策略。pod使用的SELinux策略可以在pod本身、image、SCC或project(提供默认值)中定义。

    SELinux标签可以在pod的securityContext中定义。,并支持user、role、type和level标签。


    📑SELinuxContext选项

    • MustRunAs

    如果不使用预先分配的值,则要求配置seLinuxOptions。使用seLinuxOptions作为默认值,从而针对seLinuxOptions验证。

    • RunAsAny

    没有提供默认,允许指定任何seLinuxOptions。


    📜课本练习

    📑环境准备

    [student@workstation ~]$ lab install-prepare setup
    [student@workstation ~]$ cd /home/student/do280-ansible
    [student@workstation do280-ansible]$ ./install.sh
    
    • 1
    • 2
    • 3

    提示:若已经拥有一个完整环境,可不执行。


    📑本练习准备

    [student@workstation ~]$ lab deploy-volume setup
    
    • 1

    📑配置NFS

    本实验不详解NFS的配置和创建,直接使用/root/DO280/labs/deploy-volume/config-nfs.sh脚本实现,具体脚本内容可通过以下方式查看。

    同时NFS由services节点提供。

    [root@services ~]# less -FiX /root/DO280/labs/deploy-volume/config-nfs.sh
    [root@services ~]# /root/DO280/labs/deploy-volume/config-nfs.sh		#创建NFS
    Export directory /var/export/dbvol created.
    [root@services ~]# showmount -e						#确认验证
    Export list for services.lab.example.com:
    /exports/prometheus-alertbuffer  *
    /exports/prometheus-alertmanager *
    /exports/prometheus              *
    /exports/etcd-vol2               *
    /exports/logging-es-ops          *
    /exports/logging-es              *
    /exports/metrics                 *
    /exports/registry                *
    /var/export/dbvol                *
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    📑node节点挂载NFS

    [root@node1 ~]# mount -t nfs services.lab.example.com:/var/export/dbvol /mnt
    [root@node1 ~]# mount | grep /mnt
    services.lab.example.com:/var/export/dbvol on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.25.250.11,local_lock=none,addr=172.25.250.13)
    [root@node1 ~]# ll -a /mnt/		#检查相关权限
    total 0
    drwx------.  2 nfsnobody nfsnobody   6 Mar  3 15:38 .
    dr-xr-xr-x. 17 root      root      224 Aug 16  2018 ..
    [root@node1 ~]# umount /mnt/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    node2也做以上挂载测试,测试完成后建议下载,NFS共享在OpenShift需要的时候会自动挂载。


    📑创建持久卷

    [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
    [student@workstation ~]$ less -FiX /home/student/DO280/labs/deploy-volume/mysqldb-volume.yml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysqldb-volume
    spec:
      capacity:
        storage: 3Gi
      accessModes:
      - ReadWriteMany
      nfs:
        path: /var/export/dbvol
        server: services.lab.example.com
      persistentVolumeReclaimPolicy: Recycle
    
    [student@workstation ~]$ oc create -f /home/student/DO280/labs/deploy-volume/mysqldb-volume.yml
    [student@workstation ~]$ oc get pv		#查看PV
    NAME               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                   STORAGECLASS   REASON    AGE
    etcd-vol2-volume   1G         RWO            Retain           Bound       openshift-ansible-service-broker/etcd                            5d
    mysqldb-volume     3Gi        RWX            Recycle          Available                                                                    4s
    registry-volume    40Gi       RWX            Retain           Bound       default/registry-claim  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    📑创建项目

    [student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
    [student@workstation ~]$ oc new-project persistent-storage
    
    • 1
    • 2

    📑部署应用

    [student@workstation ~]$ oc new-app --name=mysqldb \
    --docker-image=registry.lab.example.com/rhscl/mysql-57-rhel7 \
    -e MYSQL_USER=ose \
    -e MYSQL_PASSWORD=openshift \
    -e MYSQL_DATABASE=quotes
    [student@workstation ~]$ oc status		#确认验证
    In project persistent-storage on server https://master.lab.example.com:443
    
    svc/mysqldb - 172.30.234.19:3306
      dc/mysqldb deploys istag/mysqldb:latest 
        deployment #1 deployed 45 seconds ago - 1 pod
    
    
    2 infos identified, use 'oc status -v' to see details.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    📑配置持久卷

    [student@workstation ~]$ oc describe pod mysqldb | grep -A2 'Volumes'	   
    #查看当前pod的Volume
    Volumes:
      mysqldb-volume-1:
        Type:    EmptyDir (a temporary directory that shares a pod's lifetime)
    
    
    [student@workstation ~]$ oc set volumes dc mysqldb \
    --add --overwrite --name=mysqldb-volume-1 -t pvc \
    --claim-name=mysqldb-pvclaim \
    --claim-size=3Gi \
    --claim-mode='ReadWriteMany'		#修改dc并创建PVC
    
    
    [student@workstation ~]$ oc describe pod mysqldb | grep -E -A 2 'Volumes|ClaimName'	#查看验证
    Volumes:
      mysqldb-volume-1:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  mysqldb-pvclaim
        ReadOnly:   false
      default-token-fp8gq:
    [student@workstation ~]$ oc get pvc
    NAME              STATUS    VOLUME           CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    mysqldb-pvclaim   Bound     mysqldb-volume   3Gi        RWX                           1m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    📑端口转发

    [student@workstation ~]$ oc get pod
    NAME              READY     STATUS    RESTARTS   AGE
    mysqldb-2-7npfx   1/1       Running   0          6m
    [student@workstation ~]$ oc port-forward mysqldb-2-7npfx 3306:3306
    Forwarding from 127.0.0.1:3306 -> 3306
    
    • 1
    • 2
    • 3
    • 4
    • 5

    📑测试数据库

    [student@workstation ~]$ mysql -h127.0.0.1 -uose -popenshift \
    quotes < /home/student/DO280/labs/deploy-volume/quote.sql	#填充数据测试
    [student@workstation ~]$ mysql -h127.0.0.1 -uose -popenshift \
    quotes -e "select count(*) from quote;"				              #确认填充完成
    [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol	#查看NFS服务端数据
    ……
    drwxr-x---. 2 nfsnobody nfsnobody     8192 Mar  3 16:14 performance_schema
    -rw-------. 1 nfsnobody nfsnobody     1676 Mar  3 16:14 private_key.pem
    -rw-r--r--. 1 nfsnobody nfsnobody      452 Mar  3 16:14 public_key.pem
    drwxr-x---. 2 nfsnobody nfsnobody       54 Mar  3 16:32 quotes
    -rw-r--r--. 1 nfsnobody nfsnobody     1079 Mar  3 16:14 server-cert.pem
    -rw-------. 1 nfsnobody nfsnobody     1680 Mar  3 16:14 server-key.pem
    ……
    [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol/quotes
    total 212
    drwxr-x---. 2 nfsnobody nfsnobody    54 Mar  3 16:32 .
    drwx------. 6 nfsnobody nfsnobody  4096 Mar  3 16:14 ..
    -rw-r-----. 1 nfsnobody nfsnobody    65 Mar  3 16:14 db.opt
    -rw-r-----. 1 nfsnobody nfsnobody  8584 Mar  3 16:32 quote.frm
    -rw-r-----. 1 nfsnobody nfsnobody 98304 Mar  3 16:32 quote.ibd
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    📑删除PV

    [student@workstation ~]$ oc delete project persistent-storage	   # 删除项目
    project "persistent-storage" deleted
    [student@workstation ~]$ oc login -u admin -p redhat
    [student@workstation ~]$ oc delete pv mysqldb-volume		   # 删除PV
    persistentvolume "mysqldb-volume" deleted
    
    • 1
    • 2
    • 3
    • 4
    • 5

    📑验证持久性并清除实验

    删除PV后验证数据是否会长期保留。

    [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol
    ……
    drwxr-x---. 2 nfsnobody nfsnobody       54 Mar  3 16:32 quotes
    ……
    [student@workstation ~]$ ssh root@services rm -rf /var/export/dbvol/*	#使用rm才可以彻底删除
    [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol
    total 0
    drwx------. 2 nfsnobody nfsnobody  6 Mar  3 16:38 .
    drwxr-xr-x. 3 root      root      19 Mar  3 15:38 ..
    [student@workstation ~]$ lab deploy-volume cleanup
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    💡总结

    RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。

    以上就是【金鱼哥】对 第六章 DO280分配持久性存储 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。

    💾红帽认证专栏系列:
    RHCSA专栏:戏说 RHCSA 认证
    RHCE专栏:戏说 RHCE 认证
    此文章收录在RHCA专栏:RHCA 回忆录

    如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。

    如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

  • 相关阅读:
    React Native 工程基础建设
    天锐绿盾透明加密、半透明加密、智能加密这三种不同加密模式的区别和适用场景——@德人合科技-公司内部核心文件数据、资料防止外泄系统
    LLM之Prompt(二):清华提出Prompt 对齐优化技术BPO
    清华美院「后羿雕塑」像外国人,引全网争议.....
    怒刷LeetCode的第24天(Java版)
    IDEA使用过程中遇到的问题及解决办法(不断更新中...)
    2023年软件测试之功能测试(完整版)
    揭秘提升远程团队协作效率的秘密武器:这款在线白板工具不容错过!
    (一)使用Mybatis实现在student数据库中插入一个学生信息
    基于springboot书籍推荐系统设计与实现的源码+文档
  • 原文地址:https://blog.csdn.net/qq_41765918/article/details/125420662