一 持久存盤
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接收自己的一組訪問模式,描述特定的持久卷的功能, 訪問模式見下表:1.6 Persistent Volume Storage Classes
PV Claims可以通過在storageClassName屬性中指定它的名稱來選擇性地請求特定的存盤類,只有與PVC具有相同存盤類名稱的請求類的pv才能系結到PVC, 集群管理員可以為所有PVC設定一個默認存盤類,或者配置動態供應程式來服務一個或多個存盤類,這些存盤類將匹配可用PVC中的規范,1.7 創建pv和PVC資源
pv是集群中的資源,pvc是對這些資源的請求,也充當對資源的claim檢查,pv與PVCs的相互作用具有以下生命周期:- 創建持久卷
- 定義持久卷宣告
- 使用持久存盤
1.8 使用NFS的PV
OpenShift使用隨機uid運行容器,因此將Linux用戶從OpenShift節點映射到NFS服務器上的用戶并不能正常作業,作為OpenShift pv使用的NFS共享必須遵從如下配置:- 屬于nfsnobody用戶和組,
- 擁有rwx------權限(即0700),
- 使用all_squash選項
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選項
- MustRunAs
- RunAsAny
二 持久卷練習
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: falseOCP內部倉庫將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 setup4.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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/49257.html
標籤:Linux
上一篇:Nginx 如何自定義變數?
