一 持久存儲
1.1 持久存儲概述
默認情況下,運行容器使用容器內的臨時存儲。Pods由一個或多個容器組成,這些容器一起部署,共享相同的存儲和其他資源,可以在任何時候創建、啟動、停止或銷毀。使用臨時存儲意味着,當容器停止時,寫入容器內的文件系統的數據將丟失。
當容器在停止時也需要持久的保存數據時,OpenShift使用Kubernetes持久卷(PVs)為pod提供持久存儲。
1.2 持久存儲場景
通常用於數據庫,啟動一個數據庫的pod時提供的默認臨時存儲。如果銷毀並重新創建數據庫pod,則銷毀臨時存儲並丟失數據。如果使用持久存儲,則數據庫將數據存儲到pod外部的持久卷中。如果銷毀並重新創建pod,數據庫應用程序將繼續訪問存儲數據的相同外部存儲。
1.3 持久存儲相關概念
持久卷(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資源。
1.4 持久存儲插件
卷是掛載的文件系統,對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
1.5 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上。
1.6 Persistent Volume Storage Classes
PV Claims可以通過在storageClassName屬性中指定它的名稱來選擇性地請求特定的存儲類。只有與PVC具有相同存儲類名稱的請求類的pv才能綁定到PVC。
集群管理員可以為所有PVC設置一個默認存儲類,或者配置動態供應程序來服務一個或多個存儲類,這些存儲類將匹配可用PVC中的規範。
1.7 創建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。
1.8 使用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。
1 # setsebool -P virt_use_nfs=true
2 # setsebool -P virt_sandbox_use_nfs=true
1.9 NFS回收政策
NFS支持OpenShift的Recyclable插件,根據在每個持久卷上設置的策略處理自動執行回收任務。
默認情況下,持久卷被設置為Retain。Retain reclaim策略允許手動回收資源。當刪除pv claim時,持久卷仍然存在,並且認為該卷已被釋放。但它還不能用於另一個claim,因為來自前一個claim的數據仍然保留在卷上。此時管理員可以手動回收卷。
NFS卷及其回收策略設置為Recycle,表示在從claim中釋放后將被清除。例如,當將NFS回收策略設置為Recycle后,在刪除用戶綁定到該卷的pv claim之後,會在該卷上運行rm -rf命令。在它被回收之後,NFS卷可以直接綁定到一個新的pv claim。
1.10 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,才能訪問該卷。
1 [root@node ~]# showmount -e
2 Export list for master.lab.example.com:
3 /var/export/nfs-demo *
4 [root@services ~]# cat /etc/exports.d/nfs-demo.conf
5 /var/export/nfs-demo
6 ...
7 [root@services ~]# ls -lZ /var/export -d
8 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。
1.11 通過fsgroup使用塊存儲
fsGroup定義了pod的“file-system group”ID,該ID被添加到容器的supplemental group中。supplemental group ID應用於共享存儲,而fsGroup ID用於塊存儲。
塊存儲,如Ceph RBD、iSCSI和各種類型的雲存儲,通常專用於單個pod。與共享存儲不同,塊存儲由pod接管,這意味着pod(或image)定義中提供的用戶和組id應用於實際的物理塊設備,塊存儲通常不共享。
1.12 SELINUX和卷security
除了SCC之外,所有預定義的安全上下文約束都將seLinuxContext設置為MustRunAs。最可能匹配pod需求的SCC迫使pod使用SELinux策略。pod使用的SELinux策略可以在pod本身、image、SCC或project(提供默認值)中定義。
SELinux標籤可以在pod的securityContext中定義。,並支持user、role、type和level標籤。
1.13 ELinuxContext選項
如果不使用預先分配的值,則要求配置seLinuxOptions。使用seLinuxOptions作為默認值,從而針對seLinuxOptions驗證。
沒有提供默認,允許指定任何seLinuxOptions。
二 持久卷練習
2.1 前置準備
準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。
2.2 本練習準備
1 [student@workstation ~]$ lab deploy-volume setup
2.3 配置NFS
本實驗不詳解NFS的配置和創建,直接使用/root/DO280/labs/deploy-volume/config-nfs.sh腳本實現,具體腳本內容可通過以下方式查看。
同時NFS由services節點提供。
1 [root@services ~]# less -FiX /root/DO280/labs/deploy-volume/config-nfs.sh
2 [root@services ~]# /root/DO280/labs/deploy-volume/config-nfs.sh #創建NFS
3 Export directory /var/export/dbvol created.
4 [root@services ~]# showmount -e #確認驗證
2.4 node節點掛載NFS
1 [root@node1 ~]# mount -t nfs services.lab.example.com:/var/export/dbvol /mnt
2 [root@node1 ~]# mount | grep /mnt
3 [root@node1 ~]# ll -a /mnt/ #檢查相關權限
1 [root@node1 ~]# umount /mnt/ #卸載
提示:建議node2也做以上掛載測試,測試完成后建議下載,NFS共享在OpenShift需要的時候會自動掛載。
2.5 創建持久卷
1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
2 [student@workstation ~]$ less -FiX /home/student/DO280/labs/deploy-volume/mysqldb-volume.yml
3 apiVersion: v1
4 kind: PersistentVolume
5 metadata:
6 name: mysqldb-volume
7 spec:
8 capacity:
9 storage: 3Gi
10 accessModes:
11 - ReadWriteMany
12 nfs:
13 path: /var/export/dbvol
14 server: services.lab.example.com
15 persistentVolumeReclaimPolicy: Recycle
16 [student@workstation ~]$ oc create -f /home/student/DO280/labs/deploy-volume/mysqldb-volume.yml
17 [student@workstation ~]$ oc get pv #查看PV
18 NAME CAPACITYACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
19 mysqldb-volume 3Gi RWX Recycle Available 1m
2.6 創建項目
1 [student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
2 [student@workstation ~]$ oc new-project persistent-storage
2.7 部署應用
1 [student@workstation ~]$ oc new-app --name=mysqldb \
2 --docker-image=registry.lab.example.com/rhscl/mysql-57-rhel7 \
3 -e MYSQL_USER=ose \
4 -e MYSQL_PASSWORD=openshift \
5 -e MYSQL_DATABASE=quotes
6 [student@workstation ~]$ oc status #確認驗證
7 In project persistent-storage on server https://master.lab.example.com:443
8
9
10 svc/mysqldb - 172.30.39.72:3306
11 dc/mysqldb deploys istag/mysqldb:latest
12 deployment #1 deployed 58 seconds ago - 1 pod
2.8 配置持久卷
1 [student@workstation ~]$ oc describe pod mysqldb | grep -A2 'Volumes' #查看當前pod的Volume
2 Volumes:
3 mysqldb-volume-1:
4 Type: EmptyDir (a temporary directory that shares a pod's lifetime)
5 [student@workstation ~]$ oc set volumes dc mysqldb \
6 --add --overwrite --name=mysqldb-volume-1 -t pvc \
7 --claim-name=mysqldb-pvclaim \
8 --claim-size=3Gi \
9 --claim-mode='ReadWriteMany' #修改dc並創建PVC
10 [student@workstation ~]$ oc describe pod mysqldb | grep -E -A 2 'Volumes|ClaimName' #查看驗證
1 [student@workstation ~]$ oc get pvc #查看PVC
2 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3 mysqldb-pvclaim Bound mysqldb-volume 3Gi RWX 2m
2.9 端口轉發
1 [student@workstation ~]$ oc get pod
2 NAME READY STATUS RESTARTS AGE
3 mysqldb-2-r7wz8 1/1 Running 0 4m
4 [student@workstation ~]$ oc port-forward mysqldb-2-r7wz8 3306:3306
2.10 測試數據庫
1 [student@workstation ~]$ mysql -h127.0.0.1 -uose -popenshift \
2 quotes < /home/student/DO280/labs/deploy-volume/quote.sql #填充數據測試
3 [student@workstation ~]$ mysql -h127.0.0.1 -uose -popenshift \
4 quotes -e "select count(*) from quote;" #確認填充完成
5 [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol #查看NFS服務端數據
6 ……
7 drwxr-x---. 2 nfsnobody nfsnobody 54 Jul 21 23:43 quotes
8 ……
9 [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol/quotes
10 total 116
11 drwxr-x---. 2 nfsnobody nfsnobody 54 Jul 21 23:43 .
12 drwx------. 6 nfsnobody nfsnobody 4096 Jul 21 23:39 ..
13 -rw-r-----. 1 nfsnobody nfsnobody 65 Jul 21 23:39 db.opt
14 -rw-r-----. 1 nfsnobody nfsnobody 8584 Jul 21 23:43 quote.frm
15 -rw-r-----. 1 nfsnobody nfsnobody 98304 Jul 21 23:44 quote.ibd
2.11 刪除PV
1 [student@workstation ~]$ oc delete project persistent-storage #刪除項目
2 project "persistent-storage" deleted
3 [student@workstation ~]$ oc delete pv mysqldb-volume #刪除PV
4 persistentvolume "mysqldb-volume" deleted
2.12 驗證持久性
刪除PV后驗證數據是否會長期保留。
1 [student@workstation ~]$ ssh root@services ls -la /var/export/dbvol
2 ……
3 drwxr-x---. 2 nfsnobody nfsnobody 54 Jul 21 23:43 quotes
4 ……
5 [student@workstation ~]$ ssh root@services rm -rf /var/export/dbvol/* #使用rm才可以徹底刪除
三 私有倉庫持久存儲
3.1 創建私有倉庫持久卷
OCP內部倉庫是source-to-image(S2I)流程的一個重要組件,該流程用於從應用程序源代碼創建pod。S2I流程的最終輸出是一個容器image,它被推送到OCP內部倉庫,然後可以用於部署。
在生產環境中,通常建議為內部倉庫提供一個持久性存儲。否則,在重新創建registry pod之後,S2I創建的pod可能無法啟動。例如,在master節點重新啟動之後。
OpenShift安裝程序配置並啟動一個默認的持久倉庫,該倉庫使用NFS共享,由Inventory文件中的openshift_hosted_registry_storage_*變量定義。在生產環境中,Red Hat建議由外部專用的存儲提供持久性存儲,該服務器配置為彈性和高可用性。
高級安裝程序將NFS服務器配置為使用外部NFS服務器上的持久存儲,在[NFS]字段中定義的一個NFS服務器的列表。該服務器與openshift_hosted_registry_storage*變量一起使用,以配置NFS服務器。
示例配置:
1 [OSEv3:vars]
2 openshift_hosted_registry_storage_kind=nfs #定義OCP存儲後端
3 openshift_hosted_registry_storage_access_modes=['ReadWriteMany'] #定義訪問模式,默認為ReadWriteMany,表示允許多個節點以讀寫形式掛載
4 openshift_hosted_registry_storage_nfs_directory=/exports #定義NFS服務器上的NFS存儲目錄
5 openshift_hosted_registry_storage_nfs_options='*(rw,root_squash)' #定義存儲卷的NFS選項。這些選項被添加到/etc/ exports.d/openshift-ansible.exports中。rw選項允許對NFS卷進行讀寫訪問,root_squash選項阻止遠程連接的根用戶擁有root特權,併為nfsnobody分配用戶ID
6 openshift_hosted_registry_storage_volume_name=registry #定義要用於持久倉庫的NFS目錄的名稱
7 openshift_hosted_registry_storage_volume_size=40Gi #定義持久卷大小
8 ... output omitted ...
9 [nfs]
10 services.lab.example.com
在為持久倉庫安裝和配置存儲之後,OpenShift在OpenShift項目中創建一個名為register-volume的持久卷。持久性卷的容量為40gb,並且根據定義設置了Retain策略。同時默認項目中的pvc調用pv。
1 [student@workstation ~]$ oc describe pv registry-volume
2 Name: registry-volume #定義持久卷名
3 Labels: <none>
4 Annotations: pv.kubernetes.io/bound-by-controller=yes
5 StorageClass:
6 Status: Bound
7 Claim: default/registry-claim #定義使用持久卷的聲明
8 Reclaim Policy: Retain #默認持久卷策略,具有Retain策略的卷在從其聲明中釋放后不會被擦除
9 Access Modes: RWX #定義持久卷的訪問模式,由Ansible inventory文件的openshift_hosted_registry_storage_access_modes=['ReadWriteMany']變量定義
10 Capacity: 40Gi #定義持久卷的大小,由Ansible inventory文件的openshift_hosted_registry_storage_volume_size變量定義
11 Message:
12 Source: #定義存儲後端的位置和NFS共享
13 Type: NFS (an NFS mount that lasts the lifetime of a pod)
14 Server: services.lab.example.com
15 Path: /exports/registry
16 ReadOnly: false
17 Events: <none>
運行以下命令,確認OpenShift內部倉庫已配置registry-volume作為默認的PersistentVolumeClaim。
1 [user@demo ~] oc describe dc/docker-registry | grep -A4 Volumes
2 Volumes:
3 registry-storage:
4 Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
5 ClaimName: registry-claim
6 ReadOnly: false
OCP內部倉庫將image和metadata存儲為普通文件和文件夾,這意味着可以檢查PV源存儲,查看倉庫是否向其寫入了文件。
在生產環境中,這是通過訪問外部NFS服務器來完成的。但是,在本環境中,NFS共享是在services的VM上配置的,因此ssh至services查看,以便於驗證OCP內部倉庫成功將image存儲到持久存儲中。
示例:一個名為hello的應用程序在default命名空間中運行,下面的命令驗證圖像是否存儲在持久存儲中。
1 [user@demo ~] ssh root@master ls -l \
2 /var/export/registryvol/docker/registry/v2/repositories/default/
四 PV綜合實驗
4.1 前置準備
準備完整的OpenShift集群,參考《003.OpenShift網絡》2.1。
4.2 本練習準備
[student@workstation ~]$ lab storage-review setup
4.3 配置NFS
本實驗不詳解NFS的配置和創建,直接使用/root/DO280/labs/deploy-volume/config-nfs.sh腳本實現,具體腳本內容可通過以下方式查看。
同時NFS由services節點提供。
1 [root@services ~]# less -FiX /root/DO280/labs/storage-review/config-review-nfs.sh
2 [root@services ~]# /root/DO280/labs/storage-review/config-review-nfs.sh #創建NFS
3 [root@services ~]# showmount -e #確認驗證
4.4 創建持久卷
1 [student@workstation ~]$ oc login -u admin -p redhat https://master.lab.example.com
2 [student@workstation ~]$ less -FiX /home/student/DO280/labs/storage-review/review-volume-pv.yaml
3 apiVersion: v1
4 kind: PersistentVolume
5 metadata:
6 name: review-pv
7 spec:
8 capacity:
9 storage: 3Gi
10 accessModes:
11 - ReadWriteMany
12 nfs:
13 path: /var/export/review-dbvol
14 server: services.lab.example.com
15 persistentVolumeReclaimPolicy: Recycle
16 [student@workstation ~]$ oc create -f /home/student/DO280/labs/storage-review/review-volume-pv.yaml
17 [student@workstation ~]$ oc get pv #查看PV
18 NAME CAPACITYACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
19 review-pv 3Gi RWX Recycle Available 13s
4.5 部署模板
1 [student@workstation ~]$ less -FiX /home/student/DO280/labs/storage-review/instructor-template.yaml
2 [student@workstation ~]$ oc create -n openshift -f /home/student/DO280/labs/storage-review/instructor-template.yaml
3 #使用模板創建應用至openshift namespace中
4.6 創建項目
1 [student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
2 [student@workstation ~]$ oc new-project instructor
4.7 web部署應用
瀏覽器訪問: https://master.lab.example.com
選擇Catalog
選擇PHP,並使用instructor-template。
設置Application Hostname,然後直接下一步,模板會創建一個數據庫服務器。
單擊Continue to project overview以監視應用程序的構建過程。從提供的服務框架中,單擊講師。單擊部署配置#1條目旁邊的下拉箭頭,打開部署面板。當構建完成時,build部分的Complete旁邊應該出現一個綠色的複選標記。
4.8 端口轉發
1 [student@workstation ~]$ oc login -u developer -p redhat https://master.lab.example.com
2 [student@workstation ~]$ oc get pod
3 NAME READY STATUS RESTARTS AGE
4 instructor-1-9fmct 1/1 Running 0 43s
5 instructor-1-build 0/1 Completed 0 2m
6 mysql-1-f7rrq 1/1 Running 0 2m
7 [student@workstation ~]$ oc port-forward mysql-1-f7rrq 3306:3306
4.9 填充數據庫
1 [student@workstation ~]$ mysql -h127.0.0.1 -u instructor -ppassword \
2 instructor < /home/student/DO280/labs/storage-review/instructor.sql
3 [student@workstation ~]$ mysql -h127.0.0.1 -u instructor -ppassword instructor -e "select * from instructors;" #查看
4
4.10 測試訪問
workstations的瀏覽器訪問:http://instructor.apps.lab.example.com
4.11 測試添加數據
4.12 確認驗證
1 [student@workstation ~]$ lab storage-review grade #環境腳本判斷實驗
4.13 清理刪除
1 [student@workstation ~]$ oc login -uadmin -predhat
2 [student@workstation ~]$ oc delete project instructor
3 [student@workstation ~]$ oc delete pv review-pv
4 [student@workstation ~]$ ssh root@services
5 [root@services ~]# rm -rf /var/export/review-dbvol
6 [root@services ~]# rm -f /etc/exports.d/review-dbvol.exports
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※新北清潔公司,居家、辦公、裝潢細清專業服務
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※超省錢租車方案
※教你寫出一流的銷售文案?
※網頁設計最專業,超強功能平台可客製化