k8s——Pod容器中的存儲方式及PV、PVC

一、Pod容器中的存儲方式

? 需要存儲方式前提:容器磁盤上的文件的生命周期是短暫的,這就使得在容器中運行重要應用時會出現一些問題。

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

二、emptyDir存儲卷

? 2.1?emptyDir存儲卷概念

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

? 2.2?emptyDir存儲卷實例

為了更方便查看將之前的pod刪除
kubectl delete pod --all
查看節點是否有污點,有則清除
kubectl describe nodes node01|grep Taints
kubectl describe nodes node02|grep Taints

?

? 2.2.1?創建文件夾

? 2.2.2?編輯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: xzq#掛載至容器中哪個目錄mountPath: /usr/share/nginx/html/- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentvolumeMounts:- name: xzq#在容器內定義掛載存儲名稱和掛載路徑mountPath: /data/command: ['/bin/sh','-c','while true;do echo $(date) >> /data/index.html;sleep 2;done']#定義存儲卷volumes:#定義存儲卷名稱 ?- name: xzq#定義存儲卷類型emptyDir: {}

? 2.2.3?運行yaml,查看pod

在上面定義了2個容器,其中一個容器是輸入日期到index.html中,然后驗證訪問nginx的html是否可以獲取日期。以驗證兩個容器之間掛載的emptyDir實現共享。?

? 2.2.4?訪問nginx和data下的內容相同

? 2.2.5?進入myapp發現內容相同

三、hostPath存儲卷

? 3.1?hostPath存儲卷概念

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

? 3.2?hostPath存儲卷示列

可以使用此命令查看相關標簽配置:kubectl explain pod.spec.volumes .hostpath

? 3.3?在node1下操作

?

? 3.4?在node2操作

?

? 3.5?在master下操作

? 3.5.1?編輯yaml文件

#創建 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: DirectoryOrCreate

?

? 3.5.2?運行yaml文件

?

? 3.5.3?成功訪問pod-hostpath

?

? 3.5.4?刪除后重新運行

?

? 3.5.5?切換到pod-hostpath下編輯內容遠程登錄

?

? 3.5.6?在node1下查看內容是否相同?

?

四、nfs共享存儲卷

準備一臺新機器,安裝nfs,主機名stor01

在stor01節點上安裝nfs,并配置nfs服務

? 4.1?nfs共享存儲卷示例

? 4.1.1?stor01節點操作

? 4.1.1.1?關閉防火墻,重設名

? 4.1.1.2?查看是否安裝nfs,在stor01節點上安裝nfs,并配置nfs服務

注釋:

  • rw: 表示掛載該共享目錄的主機具有讀寫權限,可以對共享目錄進行讀寫操作。
  • no_root_squash: 表示不對遠程 root 用戶的權限進行限制,即遠程 root 用戶擁有和本地 root 用戶相同的權限,不會被映射為匿名用戶。這樣做可能存在一定的安全風險,因為遠程 root 用戶以 root 權限訪問共享目錄。

? 4.1.1.3?啟動服務,配置exports

? 4.1.2?node02節點操作

? 4.1.3?node01節點操作

? 4.1.4?master節點操作

? 4.1.4.1?編輯yaml
apiVersion: v1
kind: Pod
metadata:name: myapp01-nfsnamespace: default
spec:containers:- name: myappimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentvolumeMounts:- name: nfsmountPath: /usr/share/nginx/htmlreadOnly: falserestartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node02volumes:- name: nfsnfs:path: /data/volumesserver: stor01
---
apiVersion: v1
kind: Pod
metadata:name: myapp02-nfsnamespace: default
spec:containers:- name: myappimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentvolumeMounts:- name: nfsmountPath: /usr/share/nginx/htmlreadOnly: falserestartPolicy: AlwaysnodeSelector:kubernetes.io/hostname: node01volumes:- name: nfsnfs:path: /data/volumesserver: 192.168.91.106

? 4.1.4.2?運行yaml文件

? 4.1.5?stor01節點操作

? 4.1.6?master節點操作

? 4.1.7?刪除nfs相關pod,再重新創建,可以得到數據的持久化存儲

總結:刪除nfs相關pod,再重新創建,可以得到數據的持久化存儲?

五、PV和PVC

? 5.1?PV、PVC概念

  • PV 全稱叫做 Persistent volume是持久化存儲卷。它是用來描述或者說用來定義一個存儲卷的,這個通常都是由運維工程師來定義。
  • PVC 的全稱是 Persistent Volume claim是持久化存儲的請求。它是用來描述希望使用什么樣的或者說是滿足什么條件的 PV 存儲。

? 5.2?PVC的使用邏輯

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

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

? 5.3?storageclass插件

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

  • 存儲: 存儲工程師運維
  • PV: k8s 管理員運維
  • PVC: ?用戶維護

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

? 5.4?PV和PVC之間的相互作用遵循的生命周期

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

  1. Provisioning,即 PV 的創建,可以直接創建 PV(靜態方式),也可以使用 StorageClass 動態創建
  2. Binding,將 PV 分配給 PVC
  3. Using,Pod 通過 PVC 使用該 Volume,并可以通過準入控制StorageProtection(1.9及以前版本為PVCProtection) 阻止刪除正在使用的 PVC
  4. Releasing,Pod 釋放 Volume 并刪除 PVC
  5. Reclaiming,回收 PV,可以保留 PV 以便下次使用,也可以直接從云存儲中刪除

? ? 根據這 5 個階段,PV 的狀態有以下 4 種:

  • ?Available(可用):表示可用狀態,還未被任何 PVC 綁定
  • ?Bound(已綁定):表示 PV 已經綁定到 PVC
  • ?Released(已釋放):表示 PVC 被刪掉,但是資源尚未被集群回收
  • ?Failed(失敗):表示該 PV 的自動回收

? 5.5?一個PV從創建到銷毀的流程

  • 一個PV創建完后狀態會變成Available,等待被PVC綁定。
  • 一旦被PVC邦定,PV的狀態會變成Bound,就可以被定義了相應PVC的Pod使用。
  • Pod使用完后會釋放PV,PV的狀態變成Released。
  • 變成Released的PV會根據定義的回收策略做相應的回收工作。有三種回收策略,Retain、Delete和Recycle。

? 6.5?三種回收策略

  • Retain就是保留現場,K8S集群什么也不做,等待用戶手動去處理PV里的數據,處理完后,再手動刪除PV。
  • Delete策略,K8S會自動刪除該PV及里面的數據。
  • Recycle方式,K8S會將PV里的數據刪除,然后把PV的狀態變成Available,又可以被新的PVC綁定使用。

? 6.5.1?查看pv的定義方式

? 6.5.2?查看pv定義的規格

? 6.5.3?查看PVC的定義方式

PV和PVC中的spec關鍵字段要匹配,比如存儲(storage)大小、訪問模式(accessModes)

七、部署NFS使用PV和PVC?

? 7.1?創建文件夾

? 7.2?配置nfs存儲

? 7.3?定義PV

這里定義5個PV,并且定義掛載的路徑以及訪問模式,還有PV劃分的大小??

? 7.3.1?編輯yaml?

apiVersion: v1
kind: PersistentVolume
metadata:name: pv001labels:name: pv001
spec:nfs:path: /data/volumes/v1server: 192.168.91.106accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv002labels:name: pv002
spec:nfs:path: /data/volumes/v2server: 192.168.91.106accessModes: ["ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv003labels:name: pv003
spec:nfs:path: /data/volumes/v3server: 192.168.91.106accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv004labels:name: pv004
spec:nfs:path: /data/volumes/v4server: 192.168.91.106accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:name: pv005labels:name: pv005
spec:nfs:path: /data/volumes/v5server: stor01 #可以是nfs機器的ip地址也可以是主機名,此處主機名,驗證下accessModes: ["ReadWriteMany","ReadWriteOnce"]capacity:storage: 5Gi

配置文件解析

  • apiVersion: 指定了 Kubernetes API 的版本,這里使用的是 v1 版本。
  • kind: 指定了 Kubernetes 資源的類型,這里是 PersistentVolume,表示持久卷。
  • metadata: 元數據部分,包含了持久卷的名稱和標簽信息。
  • spec: 規范部分,定義了持久卷的詳細配置。
  • nfs: 指定了該持久卷使用 NFS 存儲,包括 NFS 服務器地址和路徑。
  • accessModes: 指定了持久卷的訪問模式,可以是 ReadWriteOnce(單個節點讀寫)、ReadOnlyMany(多個節點只讀)或 ReadWriteMany(多個節點讀寫)。
  • capacity: 指定了持久卷的容量大小。

? 7.3.2?運行yaml文件

? 7.4?定義PVC

這里定義了pvc的訪問模式為多路讀寫,該訪問模式必須在前面pv定義的訪問模式之中。定義PVC申請的大小為2Gi,此時PVC會自動去匹配多路讀寫且大小為2Gi的PV,匹配成功獲取PVC的狀態,即為Bound

? 7.4.1?編輯yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mypvc #定義pvc的名稱namespace: default
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:name: pod-vol-pvcnamespace: default
spec:containers:- name: myappimage: soscscs/myapp:v1volumeMounts:- name: html #與下面定義的存儲卷名稱一致mountPath: /usr/share/nginx/htmlvolumes:- name: html #定義的是pvc的名稱persistentVolumeClaim:claimName: mypvc #通過名稱調用定義的pvc

? 7.4.2?運行yaml

? 7.5?測試訪問

? ? 在存儲服務器上創建index.html,并寫入數據,通過訪問Pod進行查看,可以獲取到相應的頁面

? 7.5.1?在nfs存儲服務器上

? 7.5.2?master上操作

kubectl get pods -o wide
curl?
?

靜態創建PV的步驟:

  • 準備好存儲設備和共享目錄
  • 準備創建PV資源的配置文件,定義訪問模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany、ReadWriteMany)、存儲空間大小、回收策略(Retain、Recycle、Delete)、存儲設備類型、storageClassName等
  • 準備創建PVC資源的配置文件,定義訪問模式(必要條件,必須是PV支持的訪問模式)、存儲空間大小(默認就近選擇大于等于指定大小的PV)、storageClassName等來綁定PV
  • 創建Pod資源掛載PVC存儲卷,定義卷類型為persistentVolumeClaim,并在容器配置中定義存儲卷掛載點路徑?

八、搭建StorageClass+NFS,實現NFS的動態PV創建

? Kubernetes 本身支持的動態 PV 創建不包括 NFS,所以需要使用外部存儲卷插件分配PV。

? 詳見官網 ?https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

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

  • 內置插件:kubernetes.io/aws-ebs 是用于 AWS Elastic Block Store(EBS)的內置插件。它能夠動態地創建和管理 AWS EBS 存儲。
  • 外部插件 : ceph.com/cephfs,這是 Ceph 文件系統的外部插件。此外,nfs-client 也是一個外部插件,用于與 NFS 服務器集成,實現動態創建 PV。

搭建 StorageClass + NFS

  1. 創建StorageClass。
  2. 創建PVC綁定

搭建StorageClass+NFS,大致有以下幾個步驟:

  • 搭建一個可用的NFS Server
  • 創建Service Account.這是用來管控NFS provisioner在k8s集群中運行的權限。
  • 創建StorageClass.負責建立PV并調用NFS provisioner進行預定的工作,并讓PV與PVC建立管理。
  • 創建NFS provisioner.有兩個功能,一個是在NFS共享目錄下創建掛載點(volume),另一個則是建了PV并將PV與NFS的掛載點建立關聯

? 8.1??在stor01節點上安裝nfs,并配置nfs服務

  • 創建一個名為/opt/k8s的目錄:mkdir /opt/k8s
  • 將/opt/k8s目錄的權限設置為777:chmod 777 /opt/k8s/
  • 使用vim編輯/etc/exports文件,添加如下行,允許192.168.246.0/24網段的主機以讀寫模式掛載/opt/k8s目錄,并且不進行root權限轉換(norootsquash),并同步寫入(sync):
  • 重啟NFS服務:systemctl restart nfs

? 8.2?創建 Service Account

? 8.2.1?編輯yaml

創建 Service Account,用來管理 NFS Provisioner 在 k8s 集群中運行的權限,設置 nfs-client 對 PV,PVC,StorageClass 等的規則

#創建 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.io

這段YAML文件定義了在Kubernetes中創建一個Service Account以及相關的ClusterRole和ClusterRoleBinding來管理NFS Provisioner的權限。

  • ServiceAccount部分定義了一個名為nfs-client-provisioner的Service Account,用于代表NFS Provisioner在集群中運行時的身份。
  • ClusterRole部分定義了一個名為nfs-client-provisioner-clusterrole的ClusterRole,包含了對于Persistent Volumes(PV)、Persistent Volume Claims(PVC)、StorageClasses等資源的訪問權限規則。這些規則包括獲取、列出、監視、創建和刪除PV、PVC,以及獲取、列出、監視StorageClasses等操作。
  • ClusterRoleBinding部分定義了一個名為nfs-client-provisioner-clusterrolebinding的ClusterRoleBinding,將前面定義的ClusterRole綁定到先前定義的Service Account上,以確保該Service Account擁有相應的權限。

通過這些定義,可以確保NFS Provisioner在Kubernetes集群中具有適當的權限,以管理PV、PVC和StorageClasses等資源。

? 8.2.2?運行yaml

? 8.3?使用 Deployment 來創建 NFS Provisioner

? 8.3.1添加啟動selflink

? ? NFS Provisione(即 nfs-client),有兩個功能:一個是在 NFS 共享目錄下創建掛載點(volume),另一個則是將 PV 與 NFS 的掛載點建立關聯

? ? 通過Deployment創建NFS Provisioner的實例,可以確保其在集群中始終處于運行狀態,并且可以根據需要進行水平擴展。這樣,Kubernetes集群中的應用程序可以方便地訪問和使用NFS存儲,而無需手動管理PV和NFS之間的關聯關系。

由于 1.20 版本啟用了 selfLink,所以 k8s 1.20+ 版本通過 nfs provisioner 動態生成pv會報錯,解決方法如下:

???????# 修改kube-apiserver.yaml文件,設置kube-apiserver的參數vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:containers:- command:- kube-apiserver- --feature-gates=RemoveSelfLink=false  # 添加這一行,開啟RemoveSelfLink特性- --advertise-address=192.168.91.103 
......# 應用kube-apiserver.yaml文件的更改
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml# 刪除kube-apiserver的Pod以便更改生效
kubectl delete pods kube-apiserver -n kube-system # 檢查kube-apiserver的Pod是否重新啟動
kubectl get pods -n kube-system | grep apiserver

? 8.3.2?檢測是否重新啟動

? 8.3.3?編輯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: /persistentvolumes #掛載路徑env:- 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: stor01   #nfs服務器的主機名或IP也可以path: /opt/k8s

? 8.3.4?在node1和node2下解壓壓縮包

? 8.3.5?創建 StorageClass,負責建立 PVC 并調用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯

? 8.3.5.1?編輯yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client-storageclass
provisioner: nfs-storage #這里的名稱要和provisioner配置文件中的環境變量PROVISIONER_NAME保持一致
parameters:archiveOnDelete: "false" 
#false表示在刪除PVC時不會對數據進行存檔,即刪除數據, #false表示在刪除PVC時不會對數據目錄進行打>
包存檔,即刪除數據;為ture時就會自動對數據目錄進行打包存檔,存檔文件以archived開頭

? 8.3.5.2?運行yaml

  • kubectl apply -f nfs-client-storageclass.yaml: 通過 Kubernetes 的命令行工具 kubectl 應用(或創建)nfs-client-storageclass.yaml 文件中定義的資源,這里是一個 StorageClass。
  • kubectl get storageclass: 通過 kubectl 獲取當前 Kubernetes 集群中所有的 StorageClass 列表。這可以用于確認上一步的 StorageClass 是否成功創建。

? 8.3.6?編輯yaml文件

# 定義持久卷聲明(PersistentVolumeClaim),用于請求持久卷
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-nfs-pvc  # 持久卷聲明的名稱
spec:accessModes:- ReadWriteMany  # 訪問模式設置為讀寫多個節點storageClassName: nfs-client-storageclass  # 關聯的存儲類對象resources:requests:storage: 1Gi  # 請求的存儲容量為1Gi---
# 定義Pod,用于使用持久卷
apiVersion: v1
kind: Pod
metadata:name: test-storageclass-pod  # Pod 的名稱
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand:- "/bin/sh"- "-c"args:- "sleep 3600"  # 命令參數,讓容器保持運行狀態volumeMounts:- name: nfs-pvc  # 指定掛載的持久卷名稱mountPath: /mnt  # 掛載路徑restartPolicy: Never  # Pod 的重啟策略volumes:- name: nfs-pvc  # 定義一個名為nfs-pvc的卷persistentVolumeClaim:claimName: test-nfs-pvc  # 引用之前定義的持久卷聲明的名稱

? 8.3.7?運行yaml

PVC 通過 StorageClass 自動申請到空間??

? 8.3.8?查看 NFS 服務器上是否生成對應的目錄,自動創建的 PV 會以 ${namespace}-${pvcName}-${pvName} 的目錄格式放到 NFS 服務器上?

? 8.3.9?進入 Pod 在掛載目錄 /mnt 下寫一個文件,然后查看 NFS 服務器上是否存在該文件

? 8.3.10?發現 NFS 服務器上存在,說明驗證成功

九、總結

? 9.1?動態創建PV的步驟

  • 準備好存儲設備和共享目錄
  • 如果是外置存儲卷插件,需要先創建serviceaccount賬戶(Pod使用訪問apiserver使用的賬戶)和RBAC授權(創建角色授予相關資源對象的操作權限,再將賬戶與角色綁定),使得serviceaccount賬戶具有對PV、PVC、StorageClass等資源的操作權限
  • 準備創建外置存儲插件Pod資源的配置文件(外置存儲插件在k8s集群中以pod形式運行),定義serviceaccount賬戶作為Pod的用戶,并設置相關的環境變量(比如存儲插件名稱等)
  • 創建StorageClass資源,provisioner要設置為存儲插件名稱

? ? 之后只需要創建PVC資源引用StorageClass就可以自動調用存儲卷插件動態創建PV資源

  • 準備創建PVC資源的配置文件,定義訪問模式、存儲空間大小、storageClassName設置為StorageClass資源名稱等來動態創建PV資源并綁定PV
  • 創建Pod資源掛載PVC存儲卷,定義卷類型為persistentVolumeClaim,并在容器配置中定義存儲卷掛載點路徑

? 9.2 靜態創建PV的步驟

  • 準備好存儲設備和共享目錄
  • 準備創建PV資源的配置文件,定義訪問模式(ReadWriteOnce、ReadOnlyMany、ReadWriteMany、ReadWriteMany)、存儲空間大小、回收策略(Retain、Recycle、Delete)、存儲設備類型、storageClassName等
  • 準備創建PVC資源的配置文件,定義訪問模式(必要條件,必須是PV支持的訪問模式)、存儲空間大小(默認就近選擇大于等于指定大小的PV)、storageClassName等來綁定PV
  • 創建Pod資源掛載PVC存儲卷,定義卷類型為persistentVolumeClaim,并在容器配置中定義存儲卷掛載點路徑?

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

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

相關文章

TensorRT 精度debug分析工具

tensorRT還提供了一套可用于engine生成過程中debug的工具,包括Polygraphy、ONNX GraphSurgeon和PyTorch-Quantization。這些小工具用處很大,值得花時間進一步研究。 Debug方法示例 polygraphy Polygraphy是TensorRT官方提供的一系列小工具合集&#x…

spring源碼解析-(1)關于Bean

什么是Bean? 是spring對所有注入到IoC容器中的類的統稱。 我們要注冊進入spirng的bean千奇百怪,所以spring必須需要使用一個統一的定義來標識bean,就有了接下來的BeandDefinition,通過名稱我們就可以知道,他是對bean…

美國演員工會SAG-AFTRA 要求人工智能在廣告中使用演員聲音需征得同意并付費

SAG-AFTRA 的新豁免允許在人工智能生成的廣告中使用演員的聲音,但需要同意、補償和安全措施 美國演員工會(SAG-AFTRA)推出了一項新的豁免,以保護會員免受未經授權的人工智能在廣告中使用其聲音的影響。動態人工智能音頻廣告豁免定…

C語言Kruskal算法求最小生成樹

Kruskal算法求出最小生成樹。 圖形 算法描述 先找最小權值邊為1的邊有(V1,V4),(V2,V9),保證不產生回路就可以成功選擇邊 除去上一次找的邊后,在找權值最小的邊為2的有&a…

制作AI問答機器人:從0到1的完整指南

在數字化轉型的浪潮中,企業正追求更高效、智能的客戶服務解決方案。AI問答機器人以其快速響應、全天候服務和持續學習的能力,成為了提升客戶滿意度和加速業務發展的關鍵工具。本文將深入探討如何制作一個企業級的AI問答機器人,并強調其功能體…

OpenAI發表研究論文 介紹了一種逆向工程AI模型工作原理的方法

ChatGPT 開發商 OpenAI 構建人工智能的方法本周遭到了前員工的抨擊,他們指責該公司利用可能有害的技術冒不必要的風險。今天,OpenAI 發布了一篇新的研究論文,目的顯然是為了表明它在通過提高模型的可解釋性來應對人工智能風險方面的認真態度。…

hot100 -- 二分查找

目錄 前言 🎂搜索插入位置 🌼搜索二維矩陣 🌼排序數組元素第一和最后一個位置 🌼旋轉排序數組 💪旋轉排序數組中的最小值 💪兩個正序數組的中位數 前言 二分算法學習_時間超限ac:0%-CSDN博客 &#…

2024年【起重機械指揮】考試及起重機械指揮新版試題

題庫來源:安全生產模擬考試一點通公眾號小程序 起重機械指揮考試考前必練!安全生產模擬考試一點通每個月更新起重機械指揮新版試題題目及答案!多做幾遍,其實通過起重機械指揮試題及解析很簡單。 1、【多選題】《中華人民共和國特…

【Androi】安卓發展歷程詳解

人不走空 🌈個人主頁:人不走空 💖系列專欄:算法專題 ?詩詞歌賦:斯是陋室,惟吾德馨 目錄 🌈個人主頁:人不走空 💖系列專欄:算法專題 ?詩詞歌…

git推送代碼到github拒絕推送的解決方案

這里描述一下本地推送的場景,首先我在碼云上建立了一個前端項目,進行了自己的個性化開發,后期在github上創建了一個一樣的項目倉庫存放代碼。使用webstorm進行代碼開發。在下面這個位置可以選擇推送的代碼位置。 選擇推送github倉庫之后&…

Python深度學習基于Tensorflow(16)基于Tensorflow的對話實例

文章目錄 基礎數據清洗數據生成詞匯表定義分詞器并制作數據集構建Transformer模型并訓練模型推理 Tensorflow 的核心就是注意力機制,在之前詳細的介紹過,具體可以看這個:Python深度學習基于Tensorflow(9)注意力機制_te…

在Java中為什么對a賦值為10,在進行a++時還是等于10呢

首先我們看這樣一組代碼 public class demo1 {public static void main(String[] args) {int a10;aa;System.out.println(a);} } 結果:10不是在第二步有a操作嗎?為什么還是10呢? a的執行步驟如下: 保存當前a的值(即10…

websocket鏈接攜帶參數

前端創建鏈接時官方提供的構造函數 var aWebSocket new WebSocket(url, [protocols]); url:要連接的URL;這應該是WebSocket服務器將響應的URL。 protocols:可選;一個協議字符串或者一個包含協議字符串的數組。這些字符串用于指定…

智能語音電銷機器人可以做哪些事情?ai語音機器人系統

智能語音電銷機器人軟件的出現,給很多企業都帶來了福利,尤其是電銷企業,不僅工作效率提升了,成本降低了,還能實現智能化管理客戶的出現,給很多企業都帶來了福利,尤其是電銷企業,不僅…

python初學者筆記(八)——數字階乘

#python初學者筆記(8)——數字階乘 階乘是基斯頓卡曼于 1808 年發明的運算符號,是數學術語,一個正整數的階乘(factorial)是所有小于及等于該數的正整數的積。 下面利用Python編寫數字階乘 ##1.方法一:利用函數的方法,求輸入值的階乘 #coding…

WebAPI 前端開發流程:深度解析與實踐探索

WebAPI 前端開發流程:深度解析與實踐探索 在前端開發的世界里,WebAPI扮演著至關重要的角色,它作為前端與后端溝通的橋梁,確保了數據的流暢傳輸與功能的完整實現。本文將詳細探討WebAPI前端開發流程,從四個方面、五個方…

什么情況下需要配戴助聽器

以下幾種情況需要考慮配戴助聽器: 1、聽力無波動3個月以上的感音神經性聽力障礙。如:先天性聽力障礙、老年性聽力障礙、噪聲性聽力障礙、突聾的穩定期等,均可選配合適的助聽器。 2、年齡方面。使用助聽器沒有嚴格的年齡限制,從出生數周的嬰…

深度學習Week16——數據增強

文章目錄 深度學習Week16——數據增強 一、前言 二、我的環境 三、前期工作 1、配置環境 2、導入數據 2.1 加載數據 2.2 配置數據集 2.3 數據可視化 四、數據增強 五、增強方式 1、將其嵌入model中 2、在Dataset數據集中進行數據增強 六、訓練模型 七、自定義增強函數 一、前言…

Geoserver源碼解讀一(環境搭建)

一、Github地址 https://github.com/geoserver/geoserver 1.1 克隆代碼 git clone https://github.com/geoserver/geoserver.git 1.2 選擇版本 版本選擇參考我的上一篇文章 Geoserver 以及 Geotools各版本和jdk版本對照表 此處我選擇的是兼容jdk8的最后一個版本 git che…

netty+springboot+vue聊天室(需要了解netty)

先看看這個使用websocket實現的聊天室,因為前端是使用websocket,和下面的demo的前端差不多就不解釋實現原理,所以建議還是看看(要是會websocket的大佬請忽略) springbootwebsocketvue聊天室 目錄 一、實現內容二、代碼實現1.后端2.前端源碼…