Linux6.38 Kubernetes 集群存儲

文章目錄

  • 計算機系統
    • 5G云計算
      • 第三章 LINUX Kubernetes 集群存儲
        • 一、emptyDir存儲卷
          • 2.hostPath存儲卷
          • 3.nfs共享存儲卷
          • 4.PVC 和 PV

計算機系統

5G云計算

第三章 LINUX Kubernetes 集群存儲

容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運行重要應用時會出現一些問題。首先,當容器崩潰時,kubelet 會重啟它,但是容器中的文件將丟失——容器以干凈的狀態(鏡像最初的狀態)重新啟動。其次,在Pod中同時運行多個容器時,這些容器之間通常需要共享文件。Kubernetes 中的Volume抽象就很好的解決了這些問題。Pod中的容器通過Pause容器共享Volume

一、emptyDir存儲卷

當Pod被分配給節點時,首先創建emptyDir卷,并且只要該Pod在該節點上運行,該卷就會存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以讀取和寫入emptyDir卷中的相同文件,盡管該卷可以掛載到每個容器中的相同或不同路徑上。當出于任何原因從節點中刪除 Pod 時,emptyDir中的數據將被永久刪除

mkdir /opt/volumes
cd /opt/volumesvim pod-emptydir.yaml 
apiVersion: v1
kind: Pod
metadata:name: pod-emptydirnamespace: defaultlabels:app: myapptier: frontend
spec:containers:- name: myappimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80#定義容器掛載內容volumeMounts:#使用的存儲卷名稱,如果跟下面volume字段name值相同,則表示使用volume的這個存儲卷- name: html#掛載至容器中哪個目錄mountPath: /usr/share/nginx/html/- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: html#在容器內定義掛載存儲名稱和掛載路徑mountPath: /data/command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']#定義存儲卷volumes:#定義存儲卷名稱  - name: html#定義存儲卷類型emptyDir: {}kubectl apply -f pod-emptydir.yamlkubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod-emptydir   2/2     Running   0          10s   10.244.0.26   node01   <none>           <none>//在上面定義了2個容器,其中一個容器是輸入日期到index.html中,然后驗證訪問nginx的html是否可以獲取日期。以驗證兩個容器之間掛載的emptyDir實現共享。
curl 10.244.0.26
Fri Aug 11 06:48:59 UTC 2023
Fri Aug 11 06:49:01 UTC 2023
Fri Aug 11 06:49:03 UTC 2023
Fri Aug 11 06:49:05 UTC 2023
Fri Aug 11 06:49:07 UTC 2023
Fri Aug 11 06:49:09 UTC 2023
Fri Aug 11 06:49:11 UTC 2023
Fri Aug 11 06:49:13 UTC 2023
Fri Aug 11 06:49:15 UTC 2023
Fri Aug 11 06:49:17 UTC 2023
Fri Aug 11 06:49:19 UTC 2023
Fri Aug 11 06:49:21 UTC 2023

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述

2.hostPath存儲卷

hostPath卷將 node 節點的文件系統中的文件或目錄掛載到集群中
hostPath可以實現持久存儲,但是在node節點故障時,也會導致數據的丟失

//在 node01 節點上創建掛載目錄
mkdir -p /data/pod/volume1
echo 'node01.kb.com' > /data/pod/volume1/index.html//在 node02 節點上創建掛載目錄
mkdir -p /data/pod/volume1
echo 'node02.kb.com' > /data/pod/volume1/index.html//創建 Pod 資源
vim pod-hostpath.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-hostpathnamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1#定義容器掛載內容volumeMounts:#使用的存儲卷名稱,如果跟下面volume字段name值相同,則表示使用volume的這個存儲卷- name: html#掛載至容器中哪個目錄mountPath: /usr/share/nginx/html#讀寫掛載方式,默認為讀寫模式falsereadOnly: false#volumes字段定義了paues容器關聯的宿主機或分布式文件系統存儲卷volumes:#存儲卷名稱- name: html#路徑,為宿主機存儲路徑hostPath:#在宿主機上目錄的路徑path: /data/pod/volume1#定義類型,這表示如果宿主機沒有此目錄則會自動創建type: DirectoryOrCreatekubectl apply -f pod-hostpath.yaml//訪問測試
kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          9s      10.244.0.27   node01   <none>           <none>curl 10.244.0.27
node01.kb.com//刪除pod,再重建,驗證是否依舊可以訪問原來的內容
kubectl delete -f pod-hostpath.yaml  
kubectl apply -f pod-hostpath.yaml kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
pod-hostpath   1/1     Running   0          5s      10.244.0.28   node01   <none>           <none>curl  10.244.0.28
node01.kb.com

在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

3.nfs共享存儲卷
//在stor01節點上安裝nfs,并配置nfs服務
mkdir /data/volumes -p
chmod 777 /data/volumesvim /etc/exports
/data/volumes 192.168.80.0/24(rw,no_root_squash)systemctl start rpcbind
systemctl start nfsshowmount -e
Export list for kb6:
/data/volumes 192.168.58.0/24//master節點操作
vim pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-vol-nfsnamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlnfs:path: /data/volumesserver: stor01kubectl apply -f pod-nfs-vol.yamlkubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
pod-vol-nfs    1/1     Running   0          9s      10.244.0.29   node01   <none>           <none>//在nfs服務器上創建index.html
cd /data/volumes
vim index.html
<h1> nfs stor01</h1>//master節點操作
curl 10.244.0.29
<h1> nfs stor01</h1>kubectl delete -f pod-nfs-vol.yaml   #刪除nfs相關pod,再重新創建,可以得到數據的持久化存儲kubectl apply -f pod-nfs-vol.yamlkubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
pod-vol-nfs    1/1     Running   0          3s      10.244.0.30   node01   <none>           <none>curl 10.244.0.30
<h1> nfs 192.168.58.66</h1>

在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

4.PVC 和 PV

注:使用PVC創建Pod時不能使用NodeName來指定node節點親和性

PV 全稱叫做 Persistent Volume,持久化存儲卷。它是用來描述或者說用來定義一個存儲卷的,這個通常都是由運維工程師來定義

PVC 的全稱是 Persistent Volume Claim,是持久化存儲的請求。它是用來描述希望使用什么樣的或者說是滿足什么條件的 PV 存儲

PVC 的使用邏輯:在 Pod 中定義一個存儲卷(該存儲卷類型為 PVC),定義的時候直接指定大小,PVC 必須與對應的 PV 建立關系,PVC 會根據配置的定義去 PV 申請,而 PV 是由存儲空間創建出來的。PV 和 PVC 是 Kubernetes 抽象出來的一種存儲資源

上面介紹的PV和PVC模式是需要運維人員先創建好PV,然后開發人員定義好PVC進行一對一的Bond,但是如果PVC請求成千上萬,那么就需要創建成千上萬的PV,對于運維人員來說維護成本很高,Kubernetes提供一種自動創建PV的機制,叫StorageClass,它的作用就是創建PV的模板

創建 StorageClass 需要定義 PV 的屬性,比如存儲類型、大小等;另外創建這種 PV 需要用到的存儲插件,比如 Ceph 等。 有了這兩部分信息,Kubernetes 就能夠根據用戶提交的 PVC,找到對應的 StorageClass,然后 Kubernetes 就會調用 StorageClass 聲明的存儲插件,自動創建需要的 PV 并進行綁定

PV是集群中的資源。 PVC是對這些資源的請求,也是對資源的索引檢查

PV和PVC之間的相互作用遵循這個生命周期:

Provisioning(配置)—> Binding(綁定)—> Using(使用)—> Releasing(釋放) —>Recycling(回收)

pv和pvc階段說明
Provisioning即 PV 的創建,可以直接創建 PV(靜態方式),也可以使用 StorageClass 動態創建
Binding將 PV 分配給 PVC
UsingPod 通過 PVC 使用該 Volume,并可以通過準入控制StorageProtection(1.9及以前版本為PVCProtection) 阻止刪除正在使用的 PVC
ReleasingPod 釋放 Volume 并刪除 PVC
Reclaiming回收 PV,可以保留 PV 以便下次使用,也可以直接從云存儲中刪除
PV 的狀態說明
Available(可用)表示可用狀態,還未被任何 PVC 綁定
Bound(已綁定)表示 PV 已經綁定到 PVC
Released(已釋放)表示 PVC 被刪掉,但是資源尚未被集群回收
Failed(失敗)表示該 PV 的自動回收失敗

一個PV從創建到銷毀的具體流程如下

1、一個PV創建完后狀態會變成Available,等待被PVC綁定。
2、一旦被PVC邦定,PV的狀態會變成Bound,就可以被定義了相應PVC的Pod使用
3、Pod使用完后會釋放PV,PV的狀態變成Released
4、變成Released的PV會根據定義的回收策略做相應的回收工作。有三種回收策略,Retain、Delete和Recycle。Retain就是保留現場,K8S集群什么也不做,等待用戶手動去處理PV里的數據,處理完后,再手動刪除PV。Delete策略,K8S會自動刪除該PV及里面的數據。Recycle方式,K8S會將PV里的數據刪除,然后把PV的狀態變成Available,又可以被新的PVC綁定使用

kubectl explain pv    #查看pv的定義方式
FIELDS:apiVersion: v1kind: PersistentVolumemetadata:    #由于 PV 是集群級別的資源,即 PV 可以跨 namespace 使用,所以 PV 的 metadata 中不用配置 namespacename: speckubectl explain pv.spec    #查看pv定義的規格
spec:nfs:(定義存儲類型)path:(定義掛載卷路徑)server:(定義服務器名稱)accessModes:(定義訪問模型,有以下三種訪問模型,以列表的方式存在,也就是說可以定義多個訪問模式)- ReadWriteOnce          #(RWO)卷可以被一個節點以讀寫方式掛載。 ReadWriteOnce 訪問模式也允許運行在同一節點上的多個 Pod 訪問卷。- ReadOnlyMany           #(ROX)卷可以被多個節點以只讀方式掛載。- ReadWriteMany          #(RWX)卷可以被多個節點以讀寫方式掛載。
#nfs 支持全部三種;iSCSI 不支持 ReadWriteMany(iSCSI 就是在 IP 網絡上運行 SCSI 協議的一種網絡存儲技術);HostPath 不支持 ReadOnlyMany 和 ReadWriteMany。capacity:(定義存儲能力,一般用于設置存儲空間)storage: 2Gi (指定大小)storageClassName: (自定義存儲類名稱,此配置用于綁定具有相同類別的PVC和PV)persistentVolumeReclaimPolicy: Retain    #回收策略(Retain/Delete/Recycle)
#Retain(保留):當用戶刪除與之綁定的PVC時候,這個PV被標記為released(PVC與PV解綁但還沒有執行回收策略)且之前的數據依然保存在該PV上,但是該PV不可用,需要手動來處理這些數據并刪除該PV。
#Delete(刪除):刪除與PV相連的后端存儲資源。對于動態配置的PV來說,默認回收策略為Delete。表示當用戶刪除對應的PVC時,動態配置的volume將被自動刪除。(只有 AWS EBS, GCE PD, Azure Disk 和 Cinder 支持)
#Recycle(回收):如果用戶刪除PVC,則刪除卷上的數據,卷不會刪除。(只有 NFS 和 HostPath 支持)kubectl explain pvc   #查看PVC的定義方式
KIND:     PersistentVolumeClaim
VERSION:  v1
FIELDS:apiVersion	<string>kind	<string>  metadata	<Object>spec	<Object>#PV和PVC中的spec關鍵字段要匹配,比如存儲(storage)大小、訪問模式(accessModes)、存儲類名稱(storageClassName)
kubectl explain pvc.spec
spec:accessModes: (定義訪問模式,必須是PV的訪問模式的子集)resources:requests:storage: (定義申請資源的大小)storageClassName: (定義存儲類名稱,此配置用于綁定具有相同類別的PVC和PV)//NFS使用PV和PVC
1、配置nfs存儲
mkdir v{1,2,3,4,5}vim /etc/exports
/data/volumes/v1 192.168.58.0/24(rw,no_root_squash)
/data/volumes/v2 192.168.58.0/24(rw,no_root_squash)
/data/volumes/v3 192.168.58.0/24(rw,no_root_squash)
/data/volumes/v4 192.168.58.0/24(rw,no_root_squash)
/data/volumes/v5 192.168.58.0/24(rw,no_root_squash)exportfs -arvshowmount -e2、定義PV
//這里定義5個PV,并且定義掛載的路徑以及訪問模式,還有PV劃分的大小。
vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/volumes/v1server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/volumes/v2server: stor01accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/volumes/v3server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/volumes/v4server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/volumes/v5server: stor01accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 5Gikubectl apply -f pv-demo.yamlkubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
pv001   1Gi        RWO,RWX        Retain           Available                                   4s
pv002   2Gi        RWO            Retain           Available                                   4s
pv003   2Gi        RWO,RWX        Retain           Available                                   4s
pv004   4Gi        RWO,RWX        Retain           Available                                   4s
pv005   5Gi        RWO,RWX        Retain           Available                                   4s3、定義PVC
//這里定義了pvc的訪問模式為多路讀寫,該訪問模式必須在前面pv定義的訪問模式之中。定義PVC申請的大小為2Gi,此時PVC會自動去匹配多路讀寫且大小為2Gi的PV,匹配成功獲取PVC的狀態即為Bound
vim pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvcnamespace: default
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:name: pod-vol-pvcnamespace: default
spec:containers:- name: myappimage: ikubernetes/myapp:v1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: mypvckubectl apply -f pod-vol-pvc.yamlkubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON    AGE
pv001     1Gi        RWO,RWX        Retain           Available                                            19m
pv002     2Gi        RWO            Retain           Available                                            19m
pv003     2Gi        RWO,RWX        Retain           Bound       default/mypvc                            19m
pv004     4Gi        RWO,RWX        Retain           Available                                            19m
pv005     5Gi        RWO,RWX        Retain           Available                                            19mkubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc     Bound     pv003     2Gi        RWO,RWX                       22s4、測試訪問
//在存儲服務器上創建index.html,并寫入數據,通過訪問Pod進行查看,可以獲取到相應的頁面。
cd /data/volumes/v3/
echo "welcome to use pv3" > index.htmlkubectl get pods -o wide
pod-vol-pvc    1/1     Running   0          8m41s   10.244.0.31   node01   <none>           <none>curl  10.244.0.31 
welcome to use pv3

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

搭建 StorageClass + nfs-client-provisioner ,實現 NFS 的動態 PV 創建

Kubernetes 本身支持的動態 PV 創建不包括 NFS,所以需要使用外部存儲卷插件分配PV。詳見:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

卷插件稱為 Provisioner(存儲制配備器),NFS 使用的是 nfs-client,這個外部卷插件會使用已經配置好的 NFS 服務器自動創建 PV
Provisioner:用于指定 Volume 插件的類型,包括內置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)

1、在stor01節點上安裝nfs,并配置nfs服務
mkdir /opt/k8s
chmod 777 /opt/k8s/vim /etc/exports
/opt/k8s 192.168.58.0/24(rw,no_root_squash,sync)systemctl restart nfs2、創建 Service Account,用來管理 NFS Provisioner 在 k8s 集群中運行的權限,設置 nfs-client 對 PV,PVC,StorageClass 等的規則vim nfs-client-rbac.yaml
#創建 Service Account 賬戶,用來管理 NFS Provisioner 在 k8s 集群中運行的權限
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner
---
#創建集群角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: nfs-client-provisioner-clusterrole
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["list", "watch", "create", "update", "patch"]- apiGroups: [""]resources: ["endpoints"]verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
#集群角色綁定
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-clusterroleapiGroup: rbac.authorization.k8s.iokubectl apply -f nfs-client-rbac.yaml3、使用 Deployment 來創建 NFS Provisioner
NFS Provisioner(即 nfs-client),有兩個功能:一個是在 NFS 共享目錄下創建掛載點(volume),另一個則是將 PV 與 NFS 的掛載點建立關聯。#由于 1.20 版本啟用了 selfLink,所以 k8s 1.20+ 版本通過 nfs provisioner 動態生成pv會報錯,解決方法如下:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false       #添加這一行- --advertise-address=192.168.58.20
......kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl delete pods kube-apiserver -n kube-system 
kubectl get pods -n kube-system | grep apiserver#創建 NFS Provisioner
vim nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-client-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisioner   	  #指定Service Account賬戶containers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage       #配置provisioner的Name,確保該名稱與StorageClass資源中的provisioner名稱保持一致- name: NFS_SERVERvalue: stor01           #配置綁定的nfs服務器- name: NFS_PATHvalue: /opt/k8s          #配置綁定的nfs服務器目錄volumes:              #申明nfs數據卷- name: nfs-client-rootnfs:server: stor01path: /opt/k8skubectl apply -f nfs-client-provisioner.yaml kubectl get pod
NAME                                   READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-cd6ff67-sp8qd   1/1     Running   0          14s4、創建 StorageClass,負責建立 PVC 并調用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯vim nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage     #這里的名稱要和provisioner配置文件中的環境變量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false"   #false表示在刪除PVC時不會對數據目錄進行打包存檔,即刪除數據;為ture時就會自動對數據目錄進行打包存檔,存檔文件以archived開頭kubectl apply -f nfs-client-storageclass.yamlkubectl get storageclass
NAME                      PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client-storageclass   nfs-storage   Delete          Immediate           false                  3s5、創建 PVC 和 Pod 測試vim test-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-nfs-pvc#annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"     #另一種SC配置方式
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclass    #關聯StorageClass對象resources:requests:storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:name: test-storageclass-pod
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand:- "/bin/sh"- "-c"args:- "sleep 3600"volumeMounts:- name: nfs-pvcmountPath: /mntrestartPolicy: Nevervolumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-nfs-pvc      #與PVC名稱保持一致kubectl apply -f test-pvc-pod.yaml//PVC 通過 StorageClass 自動申請到空間
kubectl get pvc
NAME           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS              AGE
test-nfs-pvc   Bound    pvc-87153711-814d-486c-87c6-154721e3c53b   2Gi        RWX            nfs-client-storageclass   5s//查看 NFS 服務器上是否生成對應的目錄,自動創建的 PV 會以 ${namespace}-${pvcName}-${pvName} 的目錄格式放到 NFS 服務器上
ls /opt/k8s/
default-test-nfs-pvc-pvc-87153711-814d-486c-87c6-154721e3c53b//進入 Pod 在掛載目錄 /mnt 下寫一個文件,然后查看 NFS 服務器上是否存在該文件
kubectl exec -it test-storageclass-pod sh
/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt//發現 NFS 服務器上存在,說明驗證成功
cat /opt/k8s/test.txt

在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/39558.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39558.shtml
英文地址,請注明出處:http://en.pswp.cn/news/39558.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

編寫 loading、加密解密 發布NPM依賴包,并實施落地使用

你的 Loading 開箱即可用的 loading&#xff0c; 說明&#xff1a;vue3-loading 是一個方便在 Vue 3 項目中使用的加載指示器組件的 npm 插件。它允許您輕松地在項目中添加加載動畫&#xff0c;提升用戶體驗。 目錄 你的 Loading&#x1f30d; 安裝&#x1f6f9; 演示地址&…

C# WPF 無焦點自動獲取USB 二維碼掃碼槍內容,包含中文

C# WPF 無焦點自動獲取USB 二維碼掃碼槍內容&#xff0c;包含中文 前言項目背景 需要預知的知識實現方案第一步 安裝鍵盤鉤子第二步 獲取輸入的值第3 步 解決中文亂碼問題分析解決思路工具函數 結束 前言 USB接口的掃碼槍基本就相當于一個電腦外設&#xff0c;等同于一個快速輸…

Oracle Data Redaction與Data Pump

如果表定義了Redaction Policy&#xff0c;導出時數據會脫敏嗎&#xff1f;本文解答這個問題。 按照Oracle文檔Advanced Security Guide第13章&#xff0c;13.6.5的Tutorial&#xff0c;假設表HR.jobs定義了Redaction Policy。 假設HR用戶被授予了訪問目錄對象的權限&#xf…

Unity引擎使用InteriorCubeMap采樣制作假室內效果

Unity引擎制作假室內效果 大家好&#xff0c;我是阿趙。 ??這次來介紹一種使用CubeMap做假室內效果的方式。這種技術名叫InteriorCubeMap&#xff0c;是UE引擎自帶的節點效果。我這里是在Unity引擎里面的實現。 一、效果展示 這個假室內效果&#xff0c;要動態看才能看出效…

柏睿向量數據庫Rapids VectorDB賦能企業級大模型構建及智能應用

ChatGPT的問世,在為沉寂已久的人工智能重新注入活力的同時,也把長期默默無聞的向量數據庫推上舞臺。今年4月以來,全球已有4家知名向量數據庫公司先后獲得融資,更加印證了向量數據庫在AI大模型時代的價值。 什么是向量數據庫? 在認識向量數據庫前,先來了解一下最常見的關…

【業務功能篇62】Spring boot maven多模塊打包時子模塊報錯問題

程序包 com.xxx.common.utils不存在或者xxx找不到符號 我們項目中一般都是會分成多個module模塊&#xff0c;做到解耦&#xff0c;方便后續做微服務拆分模塊&#xff0c;可以直接就每個模塊進行打包拎出來執行部署這樣就會有模塊之間的調用&#xff0c;比如API模塊會被Service…

【SpringBoot】SpringBoot獲取不到用戶真實IP怎么辦

文章目錄 前言問題原因解決方案修改Nginx配置文件SpringBoot代碼實現 前言 項目部署后發現服務端無法獲取到客戶端真實的IP地址&#xff0c;這是怎么回事呢&#xff1f;給我都整懵逼了&#xff0c;經過短暫的思考&#xff0c;我發現了問題的真兇&#xff0c;那就是我們使用了N…

Vue基礎

Vue基礎 Vue應用 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><!-- 開發環境版本 --><script src"https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script> </head&g…

vue所有UI庫通用)tree-select 下拉多選(設置 maxTagPlaceholder 隱藏 tag 時顯示的內容,支持鼠標懸浮展示更多

如果可以實現記得點贊分享&#xff0c;謝謝老鐵&#xff5e; 1.需求描述 引用的下拉樹形結構支持多選&#xff0c;限制選中tag的個數&#xff0c;且超過制定個數&#xff0c;鼠標懸浮展示更多已選中。 2.先看下效果圖 3.實現思路 首先根據API文檔&#xff0c;先設置maxTagC…

【Docker】Docker network之bridge、host、none、container以及自定義網絡的詳細講解

&#x1f680;歡迎來到本文&#x1f680; &#x1f349;個人簡介&#xff1a;陳童學哦&#xff0c;目前學習C/C、算法、Python、Java等方向&#xff0c;一個正在慢慢前行的普通人。 &#x1f3c0;系列專欄&#xff1a;陳童學的日記 &#x1f4a1;其他專欄&#xff1a;CSTL&…

TCP/IP網絡江湖初探:物理層的奧秘與傳承(物理層上篇-基礎與本質)

〇、引言 在這個數字時代,計算機網絡如同廣袤的江湖,數據在其中暢游,信息傳遞成為了生活的常態。然而,在這個充滿虛擬奇觀的網絡江湖中,隱藏著一個不容忽視的存在,那就是物理層,這個江湖的基石。就如同江湖中的土地一樣,物理層作為計算機網絡的基礎,承載著數據的最初轉…

STM32 CubeMX (uart_IAP串口)簡單示例

STM32 CubeMX STM32 CubeMX &#xff08;串口IAP&#xff09; STM32 CubeMXIAP有什么用&#xff1f;整體思路 一、STM32 CubeMX 設置時鐘樹UART使能UART初始化設置 二、代碼部分文件移植![在這里插入圖片描述](https://img-blog.csdnimg.cn/0c4841d8328b4169a8833f15fe3d670c.p…

PHP Smarty中的緩存如何實現?

歡迎來到PHP Smarty的緩存世界&#xff01;這里是一個簡單的指南&#xff0c;幫助你理解如何在這個強大的模板引擎中啟用和配置緩存。 首先&#xff0c;讓我們先了解一下什么是緩存。簡單來說&#xff0c;緩存就是將需要花費大量時間處理的數據或資源存儲起來&#xff0c;以便…

2023/8/16總結

這幾天完成了私信的功能點&#xff0c;用websocket做的。 這是大概的界面&#xff0c;參考的是微信 用戶可以搜索好友&#xff1a; 如果不存在是下面這樣&#xff0c;存在就會在左邊的聊天里面顯示有這個人選項 發送消息 接下來需要把推薦算法給做了

文件IO編程 1 2

頭文件包含路徑 linux 操作系統分為兩大空間&#xff1a;用戶空間和內核空間 這樣劃分&#xff0c;是為了保護內核的核心組件&#xff0c;不被輕易訪問和修改 系統調用&#xff1a;安全的訪問內核空間 其核心是&#xff1a;函數API&#xff08;API&#xff1a;用戶編程接口&…

svn文章五:問題排查與修復 - 出了問題怎么辦?SVN故障排除與修復指南

文章五&#xff1a;問題排查與修復 - “出了問題怎么辦&#xff1f;SVN故障排除與修復指南” 概述&#xff1a;在使用SVN時&#xff0c;難免會遇到一些問題和錯誤。在這篇文章中&#xff0c;我們將教您如何進行故障排查和修復&#xff0c;保護您的SVN倉庫和數據安全。 1. 引言…

K8S系列文章之 Docker安裝使用Kafka

通過Docker拉取鏡像的方式進行安裝 照例先去DockerHub找一下鏡像源&#xff0c;看下官方提供的基本操作&#xff08;大部分時候官方教程比網上的要清晰一些&#xff0c;并且大部分教程可能也是翻譯的官方的操作步驟&#xff0c;所以直接看官方的就行&#xff09; 老實說Kafka…

“深入剖析JVM內部原理:解密Java虛擬機的奧秘“

標題&#xff1a;深入剖析JVM內部原理&#xff1a;解密Java虛擬機的奧秘 摘要&#xff1a;本文將深入探討Java虛擬機&#xff08;JVM&#xff09;的內部原理&#xff0c;包括其架構、內存管理、垃圾回收機制、即時編譯器等關鍵組成部分。通過解密JVM的奧秘&#xff0c;我們將更…

【Vue3】Vue3 UI 框架 | Element Plus —— 創建并優化表單

安裝 # NPM $ npm install element-plus --save // 或者&#xff08;下載慢切換國內鏡像&#xff09; $ npm install element-plus -S// 可以選擇性安裝 less npm install less less-loader -D // 可以選擇性配置 自動聯想src目錄Element Plus 的引入和注入 main.ts import…

解決VSCode CPU高占問題的方法

如果你也遇到VSCode的CPU占用過高的問題&#xff0c;可以嘗試使用官方自帶的插件Bisect&#xff08;擴展二分查找&#xff09;功能來查找具體是哪個擴展出了問題。 找到“糟糕”的擴展可能很容易&#xff0c;也可能很困難。 打開擴展視圖 ( CtrlShiftX )&#xff0c;禁用擴展&…