一、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(回收)?
- Provisioning,即 PV 的創建,可以直接創建 PV(靜態方式),也可以使用 StorageClass 動態創建
- Binding,將 PV 分配給 PVC
- Using,Pod 通過 PVC 使用該 Volume,并可以通過準入控制StorageProtection(1.9及以前版本為PVCProtection) 阻止刪除正在使用的 PVC
- Releasing,Pod 釋放 Volume 并刪除 PVC
- 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
- 創建StorageClass。
- 創建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,并在容器配置中定義存儲卷掛載點路徑?