006.OpenShift持久性存儲

来源:https://www.cnblogs.com/itzgr/archive/2020/06/21/13172031.html
-Advertisement-
Play Games

一 持久存儲 1.1 持久存儲概述 預設情況下,運行容器使用容器內的臨時存儲。Pods由一個或多個容器組成,這些容器一起部署,共用相同的存儲和其他資源,可以在任何時候創建、啟動、停止或銷毀。使用臨時存儲意味著,當容器停止時,寫入容器內的文件系統的數據將丟失。 當容器在停止時也需要持久的保存數據時,O ...


一 持久存儲

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選項

  • MustRunAs
如果不使用預先分配的值,則要求配置seLinuxOptions。使用seLinuxOptions作為預設值,從而針對seLinuxOptions驗證。
  • RunAsAny
沒有提供預設,允許指定任何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						#確認驗證
  clipboard

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/		#檢查相關許可權
  clipboard
  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'	#查看驗證
  clipboard
  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							#確認驗證
  clipboard

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 clipboard 選擇Catalog clipboard 選擇PHP,並使用instructor-template。 clipboard 設置Application Hostname,然後直接下一步,模板會創建一個資料庫伺服器。 clipboard 單擊Continue to project overview以監視應用程式的構建過程。從提供的服務框架中,單擊講師。單擊部署配置#1條目旁邊的下拉箭頭,打開部署面板。當構建完成時,build部分的Complete旁邊應該出現一個綠色的覆選標記。 clipboard clipboard

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 
clipboard

4.10 測試訪問

clipboardworkstations的瀏覽器訪問:http://instructor.apps.lab.example.com<
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 日常經常能看到緩入緩出的動畫效果,如: 1,帶緩入緩出效果的滾動條: 2,帶緩入緩出效果的呼吸燈: 像上面這種效果,就是用到了三角函數相關的知識,下麵將從頭開始一步步去講解如何實現這種效果。 一、基礎知識 (一)三角函數 常用的三角函數有正弦函數(sin)、餘弦函數(cos)、正切函數(tan)。在 ...
  • 前幾天在用線程池執行一些任務時運到一種情形,就是回調方法中使用到了非同步方法,但是回調方法貌似不支持async await的寫法。這時候我應該如何處理呢?是使用Task.Result來獲取返回結果,還是使用GetAwaiter.GetResult()呢?本文就來探討下吧。 作者:依樂祝 原文地址:ht ...
  • 前言:銳浪報表是一種中國式報表的報表開發工具。博主使用銳浪報表有一段時間了,積累了一些經驗希望能幫助你快速掌握並使用 第一章:集成項目 首先我們先去銳浪報表官網下載並安裝銳浪報表。 創建WPF應用程式。(C/S端使用銳浪報表基本都一樣) 添加銳浪報表的引用,在資源管理器目錄中找到引用並右鍵,點擊添加 ...
  • 這裡分享嵌入式領域有用有趣的項目/工具以及一些熱點新聞,農曆年分二十四節氣,希望在每個交節之日準時發佈一期。 ...
  • 一 REPLICATION CONTROLLERS 1.1 RC概述 RC確保pod指定數量的副本一直運行。如果pod被殺死或被管理員顯式刪除,複製控制器將自動部署相應的pod。類似地,如果運行的pod數量超過所需的數量,它會根據需要刪除pod,以匹配指定的副本計數。 RC的定義主要包括: 所需的副 ...
  • 安裝zsh 和 oh-my-zsh安裝zshyum install zsh安裝gityum install git切換預設shellchsh -s /bin/zshclone from GitHubgit clone git://github.com/robbyrussell/oh-my-zsh.g... ...
  • 我們都知道,Vim 是 Linux 下一種非常重要的文本編輯器,我們可以用它來看代碼、改代碼,很多高手直接將 Vim 打造成一款強大的 IDE 用來寫代碼。 但是,對於新手而言,Vim 相對於其它編輯器而言,更難入門。Vim 是無圖形界面的編輯器,一切操作全靠指令,而且指令又非常多非常雜,學習起來非 ...
  • Dockerfile介紹及常用指令,包括FROM,RUN,還提及了 COPY,ADD,EXPOSE,WORKDIR等,其實 Dockerfile 功能很強大,它提供了十多個指令。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...