🎹 个人简介:大家好,我是 金鱼哥,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缩写 | 描述 |
---|---|---|
ReadWriteOnce | RWO | 卷可以被单个节点挂载为读/写 |
ReadOnlyMany | ROX | 卷可以由许多节点以只读方式挂载 |
ReadWriteMany | RWX | 卷可以被许多节点挂载为读/写 |
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
图上示例,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
提示:若已经拥有一个完整环境,可不执行。
📑本练习准备
[student@workstation ~]$ lab deploy-volume setup
📑配置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 *
📑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/
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
📑创建项目
[student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
[student@workstation ~]$ oc new-project persistent-storage
📑部署应用
[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.
📑配置持久卷
[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
📑端口转发
[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
📑测试数据库
[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
📑删除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
📑验证持久性并清除实验
删除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
💡总结
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第六章 DO280分配持久性存储 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾 红帽认证专栏系列:
RHCSA专栏: 戏说 RHCSA 认证
RHCE专栏: 戏说 RHCE 认证
此文章收录在RHCA专栏: RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!