金鱼哥RHCA回忆录:DO280分配持久性存储

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 第六章 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缩写 描述
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 回忆录

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

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

相关实践学习
块存储快速入门
块存储是阿里云为云服务器ECS提供的块设备产品。通过体验挂载数据盘、分区格式化数据盘(Linux)、创建云盘快照、重新初始化数据盘、使用快照回滚云盘和卸载数据盘等功能,带您快速入门块存储。
目录
相关文章
|
消息中间件 运维 算法
金鱼哥RHCA回忆录:CL210OpenStack操作的故障排除--章节实验
第九章 OpenStack操作的故障排除--章节实验
620 2
金鱼哥RHCA回忆录:CL210OpenStack操作的故障排除--章节实验
|
存储 运维 Shell
金鱼哥戏说RHCE认证:管理变量和事实--管理变量
第四章 管理变量和事实--管理变量
87 0
金鱼哥戏说RHCE认证:管理变量和事实--管理变量
|
运维 安全 Linux
|
运维 监控 测试技术
|
缓存 运维 监控
|
存储 运维 关系型数据库
金鱼哥RHCA回忆录:DO280私有仓库持久存储与章节实验
第六章 DO280私有仓库持久存储与章节实验
160 0
金鱼哥RHCA回忆录:DO280私有仓库持久存储与章节实验
|
存储 Kubernetes 监控
金鱼哥RHCA回忆录:DO280安装和配置Metric系统
第八章 安装和配置Metric系统
264 0
 金鱼哥RHCA回忆录:DO280安装和配置Metric系统
|
JSON 运维 负载均衡
金鱼哥RHCA回忆录:DO280管理应用部署--RC
第七章 DO280管理应用部署--RC
254 0
金鱼哥RHCA回忆录:DO280管理应用部署--RC
|
运维 Kubernetes 负载均衡
金鱼哥RHCA回忆录:DO280OpenShift网络--平台网络实现
第三章 OpenShift网络--平台网络实现
228 0
金鱼哥RHCA回忆录:DO280OpenShift网络--平台网络实现
|
消息中间件 人工智能 运维
金鱼哥RHCA回忆录:CL210云应用程序自动化(理论)
第八章 云应用程序自动化(理论)
160 0
金鱼哥RHCA回忆录:CL210云应用程序自动化(理论)