一、Kubernetes中的存儲卷
1.1 為什么需要存儲卷?
容器部署過程中一般有以下三種數(shù)據(jù):
? 啟動時需要的初始數(shù)據(jù):例如配置文件 (init container)
? 啟動過程中產(chǎn)生的臨時數(shù)據(jù):該臨時數(shù)據(jù)需要多個容器間共享
? 啟動過程中產(chǎn)生的持久化數(shù)據(jù):例如MySQL的data目錄 (業(yè)務數(shù)據(jù)–很重要)
而容器中的文件在磁盤上是臨時存放的,這給容器中運行比較重要的應用程序帶來一些問題
問題1: 數(shù)據(jù)持久化問題,當容器升級或者崩潰時,kubelet會重建容器,容器內(nèi)文件會丟失。
問題2: 數(shù)據(jù)共享問題,一個Pod中運行多個容器并需要共享文件。
Kubernetes中的數(shù)據(jù)卷(Volume),也可以稱為存儲卷,能夠解決這兩個問題。
1.2 存儲卷概述
1.2.1 簡介
存儲卷是用于持久化存儲容器中數(shù)據(jù)的一種機制,可以提供容器內(nèi)持久化存儲的能力,使容器可以在不同的生命周期中保留數(shù)據(jù)。
數(shù)據(jù)卷與容器相互獨立,并且具有自己的生命周期。
當容器被銷毀或重啟時,數(shù)據(jù)卷的內(nèi)容仍然保持不變,從而確保了容器內(nèi)數(shù)據(jù)的持久性(解決了問題1)。
數(shù)據(jù)卷可以與一個或多個容器進行綁定,使它們可以共享數(shù)據(jù)(解決了問題2)。
1.2.2 volume字段
Kubernetes中的Volume提供了在容器中掛載外部存儲的能力
Pod需要設置卷來源(volume
)和掛載點(volumeMounts
)兩個信息后才可以使用相應的Volume。
kubectl explain pod.spec.volumes
常用字段名 | 描述 |
---|---|
name |
指定數(shù)據(jù)卷的名稱,用于標識該數(shù)據(jù)卷 |
<不同類型的數(shù)據(jù)卷> |
Kubernetes 支持不同類型的數(shù)據(jù)卷,如 NFS、GCE Persistent Disk、AWS EBS等,用于滿足特定的存儲需求 |
kubectl explain pod.spec.containers.volumeMounts
常用字段名 | 描述 |
---|---|
name |
指定要掛載的數(shù)據(jù)卷的名稱 |
mountPath |
指定掛載點的路徑,即將數(shù)據(jù)卷掛載到容器內(nèi)的哪個目錄 |
readOnly |
指定掛載點是否為只讀模式。如果設置為 true ,則容器只能讀取掛載的數(shù)據(jù),不能寫入 |
1.3 常用的存儲卷類型
1.3.1 emptyDir(臨時存儲卷)
簡介
emptyDir
卷可實現(xiàn)Pod中的容器之間共享目錄數(shù)據(jù),但沒有持久化數(shù)據(jù)的能力,存儲卷會隨著Pod生命周期結束而一起刪除。
emptyDir`的一些用途
- 緩存空間,例如基于磁盤的歸并排序。
- 為耗時較長的計算任務提供檢查點,以便任務能方便地從崩潰前狀態(tài)恢復執(zhí)行。
- 在 Web 服務器容器服務數(shù)據(jù)時,保存內(nèi)容管理器容器獲取的文件。
字段
kubectl explain pod.spec.volumes.emptyDir
emptyDir.medium
字段用于控制 emptyDir
卷的存儲位置,有兩個值:Memory
和Default
。
值 | 描述 |
---|---|
Memory |
表示將 emptyDir 卷存儲在主機的內(nèi)存中數(shù)據(jù)只存在于 Pod 的生命周期內(nèi),并且不會被持久化到磁盤上 |
Default |
表示將 emptyDir 卷存儲在主機的磁盤中數(shù)據(jù)會在 Pod 重新啟動時保留,但不會在節(jié)點之間持久化 |
emptyDir.sizeLimit
字段用于來限制卷的容量大小,但是不會自動調(diào)整底層存儲的大小。
因此,如果設置的大小限制超過節(jié)點上的可用磁盤空間,可能會導致 Pod 失敗啟動或運行時出現(xiàn)錯誤。
emptyDir 配置示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir:
sizeLimit: 500Mi
1.3.2 hostPath(節(jié)點存儲卷)
hostPath
卷將node節(jié)點上的目錄/文件掛載到Pod容器的指定目錄上。
有持久化數(shù)據(jù)的能力,但只能在單個node節(jié)點上持久化數(shù)據(jù),不能實現(xiàn)跨node節(jié)點的Pod共享數(shù)據(jù)
hostPath卷配置示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# 宿主機上目錄位置
path: /data
# 此字段為可選
type: Directory
支持的 type
值如下:
取值 | 行為 |
---|---|
空字符串(默認)用于向后兼容,這意味著在安裝 hostPath 卷之前不會執(zhí)行任何檢查。 | |
DirectoryOrCreate |
如果在給定路徑上什么都不存在,那么將根據(jù)需要創(chuàng)建空目錄,權限設置為 0755,具有與 kubelet 相同的組和屬主信息。 |
Directory |
在給定路徑上必須存在的目錄。 |
FileOrCreate |
如果在給定路徑上什么都不存在,那么將在那里根據(jù)需要創(chuàng)建空文件,權限設置為 0644,具有與 kubelet 相同的組和所有權。 |
File |
在給定路徑上必須存在的文件。 |
Socket |
在給定路徑上必須存在的 UNIX 套接字。 |
CharDevice |
在給定路徑上必須存在的字符設備。 |
BlockDevice |
在給定路徑上必須存在的塊設備。 |
補充:FileOrCreate模式
FileOrCreate
模式不會負責創(chuàng)建文件的父目錄。
如果欲掛載的文件的父目錄不存在,Pod 啟動會失敗。
為了確保這種模式能夠工作,可以嘗試把文件和它對應的目錄分開掛載,如 FileOrCreate
配置所示。
apiVersion: v1
kind: Pod
metadata:
name: test-webserver
spec:
containers:
- name: test-webserver
image: registry.k8s.io/test-webserver:latest
volumeMounts:
- mountPath: /var/local/aaa
name: mydir
- mountPath: /var/local/aaa/1.txt
name: myfile
volumes:
- name: mydir
hostPath:
# 確保文件所在目錄成功創(chuàng)建。
path: /var/local/aaa
type: DirectoryOrCreate
- name: myfile
hostPath:
path: /var/local/aaa/1.txt
type: FileOrCreate
1.3.3 nfs
nfs
卷使用nfs服務將存儲卷掛載到Pod容器的指定目錄上。
有持久化數(shù)據(jù)的能力,且也能實現(xiàn)跨node節(jié)點的Pod共享數(shù)據(jù)。
nfs卷的配置示例
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /my-nfs-data
name: test-volume
volumes:
- name: test-volume
nfs:
server: my-nfs-server.example.com
path: /my-nfs-volume
readOnly: true
注意:不能在 Pod spec 中指定 NFS 掛載可選項。
可以選擇設置服務端的掛載可選項,或者使用 /etc/nfsmount.conf。
此外,還可以通過允許設置掛載可選項的持久卷掛載 NFS 卷。
1.3.4 cephfs
cephfs
卷允許將現(xiàn)存的 CephFS 卷掛載到 Pod 中。
cephfs
卷可以被預先填充數(shù)據(jù),且這些數(shù)據(jù)可以在 Pod 之間共享,同一 cephfs
卷可同時被多個掛載。
apiVersion: v1
kind: Pod
metadata:
name: cephfs
spec:
containers:
- name: cephfs-rw
image: kubernetes/pause
volumeMounts:
- mountPath: "/mnt/cephfs"
name: cephfs
volumes:
- name: cephfs
cephfs:
monitors:
- 10.16.154.78:6789
- 10.16.154.82:6789
- 10.16.154.83:6789
# by default the path is /, but you can override and mount a specific path of the filesystem by using the path attribute
# path: /some/path/in/side/cephfs
user: admin
secretFile: "/etc/ceph/admin.secret"
readOnly: true
二、持久數(shù)據(jù)卷——PV和PVC
2.1 概念
持久卷(PersistentVolume,PV):K8S在指定的存儲設備空間中邏輯劃分創(chuàng)建出來的可持久化的存儲資源對象。
持久卷聲明(PersistentVolumeClaim,PVC):對PV存儲資源對象的請求和綁定,也是Pod能夠掛載使用的一種存儲卷類型。
2.2 PV的生命周期和狀態(tài)
生命周期
#PV和PVC之間的相互作用遵循這個生命周期
Provisioning(配置)---> Binding(綁定)---> Using(使用)---> Releasing(釋放) ---> Recycling(回收)
生命周期 | 描述 |
---|---|
Provisioning | PV 的創(chuàng)建,可以直接創(chuàng)建 PV(靜態(tài)方式),也可以使用StorageClass 動態(tài)創(chuàng)建 |
Binding | 將 PV 分配給 PVC |
Using | Pod 通過 PVC 使用該 Volume,并可以通過準入控制StorageProtection(1.9及以前版本為PVCProtection) 阻止刪除正在使用的 PVC |
Releasing | Pod 釋放 Volume 并刪除 PVC |
Reclaiming | 回收 PV,可以保留 PV 以便下次使用,也可以直接從云存儲中刪除 |
狀態(tài)
PV的狀態(tài) | 描述 |
---|---|
Available(可用) | 表示為可用狀態(tài),PV已經(jīng)被創(chuàng)建出來了,但是還未被PVC綁定 |
Bound(已綁定) | 表示PV已經(jīng)被PVC綁定了,PV與PVC是一對一的綁定關系 |
Released(已釋放) | 表示PVC被刪除了,但是PV還沒被回收 |
Failed(失?。?/td> | 表示PV被自動回收失敗 |
2.3 訪問模式 (Access Modes) 和回收策略 (Reclaim Policy)
訪問模式
存儲卷在掛載到宿主機系統(tǒng)上時,可以設置不同的訪問模式 (Access Modes)。
支持的訪問模式 | 描述 |
---|---|
ReadWriteOnce (RWO) | 讀寫權限,并且只能被單個Node掛載 |
ReadOnlyMany (ROX) | 只讀權限,允許被多個Node掛載 |
ReadWriteMany(RWX) | 讀寫權限,允許被多個Node掛載 |
回收策略
通過PV定義中的persistentVolumeReclaimPolicy字段
進行設置。
回收策略 | 描述 |
---|---|
Retain(保留) | 保留數(shù)據(jù),需要手工處理 |
Recycle(回收) | 簡單清除文件的操作(例如運行rm -rf /thevolume/*命令),只有 NFS 和 HostPath 兩種類型的 PV支持 Recycle 策略 |
Delete(刪除) | 與PV相連的后端存儲完成Volume的刪除操作,AWSElasticBlockStore、 GCEPersistentDis、 AzureDisk和Cinder類型的PV支持 Delete策略 |
三、靜態(tài)創(chuàng)建PV
3.1 創(chuàng)建思路
1)準備好存儲設備和共享目錄;
2)準備yaml配置文件創(chuàng)建PV資源,設置 存儲類型、訪問模式(RWO RWX ROX RWOP)、 空間大小、回收策略(Retain Delete Recycle) 、storageClassName
等;
3)準備yaml配置文件創(chuàng)建PVC資源,設置 訪問模式(必要條件,必須是PV能支持的訪問模式)、空間大小(默認就近選擇大于等于指定大小的PV) 、storageClassName
等來綁定PV;
4)創(chuàng)建Pod資源掛載PVC存儲卷,設置存儲卷類型為 persistentVolumeClaim
,并在容器配置中定義存儲卷掛載點目錄。
3.2 創(chuàng)建實例:NFS使用PV和PVC
Step1 配置nfs存儲
#創(chuàng)建共享目錄
mkdir /opt/test
cd /opt/test
mkdir v{1,2,3,4,5}
#定義多個共享目錄和對應的訪問權限
vim /etc/exports
/opt/test/v1 192.168.2.0/24(rw,no_root_squash)
/opt/test/v2 192.168.2.0/24(rw,no_root_squash)
/opt/test/v3 192.168.2.0/24(rw,no_root_squash)
/opt/test/v4 192.168.2.0/24(rw,no_root_squash)
/opt/test/v5 192.168.2.0/24(rw,no_root_squash)
#重新加載共享目錄,應用修改
exportfs -arv
showmount -e
Step2 定義PV
#這里定義5個PV,并且定義掛載的路徑以及訪問模式,還有PV劃分的大小。
vim pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
name: pv001
spec:
nfs:
path: /opt/test/v1
server: master01
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv002
labels:
name: pv002
spec:
nfs:
path: /opt/test/v2
server: master01
accessModes: ["ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv003
labels:
name: pv003
spec:
nfs:
path: /opt/test/v3
server: master01
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv004
labels:
name: pv004
spec:
nfs:
path: /opt/test/v4
server: master01
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv005
labels:
name: pv005
spec:
nfs:
path: /opt/test/v5
server: master01
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
kubectl apply -f pv-demo.yaml -n my-ns
kubectl get pv -n my-ns
Step3 定義PVC
這里定義了pvc的訪問模式為多路讀寫,該訪問模式必須在前面pv定義的訪問模式之中。
定義PVC申請的大小為2Gi,此時PVC會自動去匹配多路讀寫且大小為2Gi的PV,匹配成功獲取PVC的狀態(tài)即為Bound
。
vim pod-vol-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
namespace: my-ns
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
name: pod-vol-pvc
namespace: my-ns
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html
volumes:
- name: html
persistentVolumeClaim:
claimName: mypvc
kubectl apply -f pod-vol-pvc.yaml
kubectl get pv
kubectl get pvc
Step4 訪問測試
在存儲服務器上創(chuàng)建index.html,并寫入數(shù)據(jù),通過訪問Pod進行查看,可以獲取到相應的頁面。
#創(chuàng)建測試頁面
cd /opt/test/v3/
echo "welcome to use pv3" > index.html
kubectl get pods -o wide -n my-ns
#訪問測試
firefox http://10.244.2.82
四、動態(tài)創(chuàng)建PV
4.1 創(chuàng)建思路
1)準備好存儲設備和共享目錄;
2)如果是外置存儲卷插件,需要先創(chuàng)建serviceaccount賬戶(Pod使用的賬戶)和做RBAC授權(創(chuàng)建角色授予相關資源對象的操作權限,再將賬戶與角色進行綁定),使sa賬戶具有對PV PVC StorageClass等資源的操作權限;
3)準備yaml配置文件創(chuàng)建外置存儲卷插件的Pod,設置sa賬戶作為Pod的用戶,并設置相關的環(huán)境變量(比如存儲卷插件名稱);
4)創(chuàng)建StorageClass(簡稱SC)資源,provisioner自動設置為存儲卷插件名稱 ;
以上操作是一勞永逸的,之后只需要創(chuàng)建PVC資源時引用StorageClass就可以自動調(diào)用存儲卷插件動態(tài)創(chuàng)建PV資源了
5)準備yaml配置文件創(chuàng)建PVC資源,設置 訪問模式、空間大小 storageClassName指定SC資源名稱等來動態(tài)創(chuàng)建PV資源并綁定PV;文章來源:http://www.zghlxwxcb.cn/news/detail-752853.html
6)創(chuàng)建Pod資源掛載PVC存儲卷,設置存儲卷類型為 persistentVolumeClaim ,并在容器配置中定義存儲卷掛載點目錄。文章來源地址http://www.zghlxwxcb.cn/news/detail-752853.html
4.2 StorageClass的概念
官方文檔:存儲類 | Kubernetes
簡介
存儲類(Storage Class) 是 Kubernetes 中用于定義持久卷(Persistent Volume)的類型和行為的對象。
它定義了動態(tài)分配的存儲和卷的屬性,并指定如何創(chuàng)建和管理這些存儲資源。
關于默認的StorageClass
當一個 PVC 沒有指定 storageClassName
時,會使用默認的 StorageClass。
集群中只能有一個默認的 StorageClass。
如果不小心設置了多個默認的 StorageClass, 當 PVC 動態(tài)配置時,將使用最新設置的默認 StorageClass。
關于字段
每個 StorageClass 都包含 provisioner
、parameters
和 reclaimPolicy
字段, 這些字段會在 StorageClass 需要動態(tài)制備 PersistentVolume 時會使用到。
功能
1)提供動態(tài)卷配置:存儲類可以與動態(tài)卷配置程序(比如 CSI 驅動程序)集成,以便在創(chuàng)建 PVC(Persistent Volume Claim)時自動創(chuàng)建相應的 PV(Persistent Volume)。
2)指定卷的參數(shù): 存儲類可以定義卷的各種參數(shù)和配置選項,如訪問模式、卷大小、復制策略等。
3)支持動態(tài)卷生命周期管理: 存儲類可以定義如何動態(tài)創(chuàng)建、擴容和銷毀卷,以及何時回收 PV 等。
4.3 Provisioner的概念
Provisioner(存儲分配器): 卷插件,用于指定 Volume 插件的類型,包括內(nèi)置插件(如 kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。
詳見:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
Kubernetes 本身支持的動態(tài) PV 創(chuàng)建不包括 NFS,所以需要使用外部存儲卷插件分配PV。
4.4 實例:NFS 的動態(tài) PV 創(chuàng)建
搭建 StorageClass + nfs-client-provisioner ,實現(xiàn) NFS 的動態(tài) PV 創(chuàng)建
Step1 在master01節(jié)點上安裝nfs,并配置nfs服務
#創(chuàng)建共享目錄
mkdir /opt/test2
chmod 777 /opt/test2/
#添加權限
vim /etc/exports
/opt/test2 192.168.2.0/24(rw,no_root_squash,sync)
#重啟NFS服務
systemctl restart nfs
exportfs -var
showmount -e
Step2 創(chuàng)建 Service Account
Service Account 用來管理 NFS Provisioner
在 k8s 集群中運行的權限,設置nfs-client
對 PV
、PVC
、StorageClass
等的規(guī)則。
#編寫配置清單文件
vim nfs-client-rbac.yaml
#創(chuàng)建 Service Account 賬戶,用來管理 NFS Provisioner 在 k8s 集群中運行的權限
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
#創(chuàng)建集群角色
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: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-clusterrole
apiGroup: rbac.authorization.k8s.io
##配置清單文件詳解##
用于創(chuàng)建一個 Service Account 賬戶和相關的 Role、RoleBinding,用于管理 NFS Provisioner 在 Kubernetes 集群中的權限。
首先,創(chuàng)建了一個 Service Account 賬戶,命名為 "nfs-client-provisioner"
然后,創(chuàng)建了一個 Cluster Role,命名為 "nfs-client-provisioner-clusterrole"。
該角色定義了一組權限規(guī)則,包括對持久卷(persistentvolume)的獲取、列表、監(jiān)視、創(chuàng)建和刪除操作,對持久卷聲明(persistentvolumeclaim)的獲取、列表、監(jiān)視和更新操作,對存儲類(storageclass)的獲取、列表和監(jiān)視操作,對事件(events)和端點(endpoints)的獲取、列表、監(jiān)視、創(chuàng)建、更新等操作。
最后,創(chuàng)建了一個 Cluster Role Binding,將上述角色與之前創(chuàng)建的 Service Account 進行綁定,并將其綁定到默認命名空間(namespace)中。
kubectl apply -f nfs-client-rbac.yaml
#Service Account "nfs-client-provisioner" 具備了管理 NFS Provisioner 所需的權限。
Step3 使用 Deployment 創(chuàng)建 NFS Provisioner
NFS Provisioner(即 nfs-client),有兩個功能
1)在 NFS 共享目錄下創(chuàng)建掛載點(volume),另一個則是將 PV 與 NFS 的掛載點建立關聯(lián)。
編寫資源配置清單文件
#編寫配置清單文件
vim nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner #指定Service Account賬戶
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-storage #配置provisioner的Name,確保該名稱與StorageClass資源中的provisioner名稱保持一致
- name: NFS_SERVER
value: master01 #配置綁定的nfs服務器
- name: NFS_PATH
value: /opt/test2/ #配置綁定的nfs服務器目錄
volumes: #申明nfs數(shù)據(jù)卷
- name: nfs-client-root
nfs:
server: master01
path: /opt/test2/
創(chuàng)建
kubectl apply -f nfs-client-provisioner.yaml
kubectl get po
補充:報錯解決方法
#由于 1.20 版本啟用了 selfLink,所以 k8s 1.20+ 版本通過 nfs provisioner 動態(tài)生成pv會報錯,解決方法如下:
vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
containers:
- command:
- kube-apiserver
- --feature-gates=RemoveSelfLink=false #添加這一行
- --advertise-address=192.168.2.100
.....
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
Step4 創(chuàng)建 StorageClass
負責建立 PVC 并調(diào)用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯(lián)。
#編寫配置清單文件
vim nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client-storageclass
provisioner: nfs-storage #這里的名稱要和provisioner配置文件中的環(huán)境變量PROVISIONER_NAME保持一致
parameters:
archiveOnDelete: "false" #false表示在刪除PVC時不會對數(shù)據(jù)目錄進行打包存檔,即刪除數(shù)據(jù);為ture時就會自動對數(shù)據(jù)目錄進行打包存檔,存檔文件以archived開頭
#聲明式創(chuàng)建
kubectl apply -f nfs-client-storageclass.yaml
kubectl get storageclass
Step5 創(chuàng)建 PVC ,進行Pod 測試
創(chuàng)建PVC
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:
- ReadWriteMany
storageClassName: nfs-client-storageclass #關聯(lián)StorageClass對象
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: test-storageclass-pod
spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- "/bin/sh"
- "-c"
args:
- "sleep 3600"
volumeMounts:
- name: nfs-pvc
mountPath: /mnt
restartPolicy: Never
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-nfs-pvc #與PVC名稱保持一致
kubectl apply -f test-pvc-pod.yaml
kubectl get pvc
查看 NFS 服務器上是否生成對應的目錄
自動創(chuàng)建的 PV 會以 ${namespace}-${pvcName}-${pvName}
的目錄格式放到 NFS 服務器上。
ls /opt/test2
Pod測試
測試思路: 進入 Pod 在掛載目錄 /mnt 下寫一個文件,然后查看 NFS 服務器上是否存在該文件。
#進入Pod,創(chuàng)建測試文件
kubectl exec -it test-storageclass-pod sh
/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt
#進入到目錄
cd /opt/test2/default-test-nfs-pvc-pvc-7a63142b-a4b4-4f07-966c-828ca60bbdcb
五、小結
5.1 PV、PVC的概念和狀態(tài)
概念
PV: K8S在指定的存儲設備空間中邏輯劃分創(chuàng)建出來的可持久化的存儲資源對象。
PVC: 對PV存儲資源對象的請求和綁定,也是Pod能夠掛載使用的一種存儲卷類型。
創(chuàng)建方式簡介
手動根據(jù)PV資源的yaml配置文件創(chuàng)建靜態(tài)PV。
根據(jù)PVC的配置通過StorageClass(簡稱SC)資源調(diào)用存儲卷插件創(chuàng)建動態(tài)PV。
PV的4種狀態(tài)
PV的狀態(tài) | 描述 |
---|---|
Available(可用) | 表示為可用狀態(tài),PV已經(jīng)被創(chuàng)建出來了,但是還未被PVC綁定 |
Bound(已綁定) | 表示PV已經(jīng)被PVC綁定了,PV與PVC是一對一的綁定關系 |
Released(已釋放) | 表示PVC被刪除了,但是PV還沒被回收 |
Failed(失敗) | 表示PV被自動回收失敗 |
5.2 靜態(tài)和動態(tài)創(chuàng)建PV的思路
創(chuàng)建使用靜態(tài)PV
1)準備好存儲設備和共享目錄;
2)準備yaml配置文件創(chuàng)建PV資源,設置 存儲類型、訪問模式(RWO RWX ROX RWOP)、 空間大小、回收策略(Retain Delete Recycle) 、storageClassName
等;
3)準備yaml配置文件創(chuàng)建PVC資源,設置 訪問模式(必要條件,必須是PV能支持的訪問模式)、空間大小(默認就近選擇大于等于指定大小的PV) 、storageClassName
等來綁定PV;
4)創(chuàng)建Pod資源掛載PVC存儲卷,設置存儲卷類型為 persistentVolumeClaim
,并在容器配置中定義存儲卷掛載點目錄。
創(chuàng)建使用動態(tài)PV
1)準備好存儲設備和共享目錄;
2)如果是外置存儲卷插件,需要先創(chuàng)建serviceaccount賬戶(Pod使用的賬戶)和做RBAC授權(創(chuàng)建角色授予相關資源對象的操作權限,再將賬戶與角色進行綁定),使sa賬戶具有對PV PVC StorageClass等資源的操作權限;
3)準備yaml配置文件創(chuàng)建外置存儲卷插件的Pod,設置sa賬戶作為Pod的用戶,并設置相關的環(huán)境變量(比如存儲卷插件名稱);
4)創(chuàng)建StorageClass(簡稱SC)資源,provisioner自動設置為存儲卷插件名稱 ;
以上操作是一勞永逸的,之后只需要創(chuàng)建PVC資源時引用StorageClass就可以自動調(diào)用存儲卷插件動態(tài)創(chuàng)建PV資源了
5)準備yaml配置文件創(chuàng)建PVC資源,設置 訪問模式、空間大小 storageClassName指定SC資源名稱等來動態(tài)創(chuàng)建PV資源并綁定PV;
6)創(chuàng)建Pod資源掛載PVC存儲卷,設置存儲卷類型為 persistentVolumeClaim ,并在容器配置中定義存儲卷掛載點目錄。
通過陳述式管理資源配置的方式 修改或添加資源對象的配置
kubectl patch <資源類型> <資源名稱> -p '{"第一層字段": {"第二層字段": {....}}}'
kubectl patch deployment deploy-test -p '{"spec": {"replicas": 0}}'
kubectl patch deployment deploy-test -p '{"spec": {"template": {"spec": {"containers": [{"name": "myapp", "image": "soscscs/myapp:v1"}]}}}}'
創(chuàng)建使用動態(tài)PV
1)準備好存儲設備和共享目錄;
2)如果是外置存儲卷插件,需要先創(chuàng)建serviceaccount賬戶(Pod使用的賬戶)和做RBAC授權(創(chuàng)建角色授予相關資源對象的操作權限,再將賬戶與角色進行綁定),使sa賬戶具有對PV PVC StorageClass等資源的操作權限;
3)準備yaml配置文件創(chuàng)建外置存儲卷插件的Pod,設置sa賬戶作為Pod的用戶,并設置相關的環(huán)境變量(比如存儲卷插件名稱);
4)創(chuàng)建StorageClass(簡稱SC)資源,provisioner自動設置為存儲卷插件名稱 ;
以上操作是一勞永逸的,之后只需要創(chuàng)建PVC資源時引用StorageClass就可以自動調(diào)用存儲卷插件動態(tài)創(chuàng)建PV資源了
5)準備yaml配置文件創(chuàng)建PVC資源,設置 訪問模式、空間大小 storageClassName指定SC資源名稱等來動態(tài)創(chuàng)建PV資源并綁定PV;
6)創(chuàng)建Pod資源掛載PVC存儲卷,設置存儲卷類型為 persistentVolumeClaim ,并在容器配置中定義存儲卷掛載點目錄。
通過陳述式管理資源配置的方式 修改或添加資源對象的配置
kubectl patch <資源類型> <資源名稱> -p '{"第一層字段": {"第二層字段": {....}}}'
kubectl patch deployment deploy-test -p '{"spec": {"replicas": 0}}'
kubectl patch deployment deploy-test -p '{"spec": {"template": {"spec": {"containers": [{"name": "myapp", "image": "soscscs/myapp:v1"}]}}}}'
到了這里,關于【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!