国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC

這篇具有很好參考價值的文章主要介紹了【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、Kubernetes中的存儲卷

1.1 為什么需要存儲卷?

容器部署過程中一般有以下三種數(shù)據(jù):

? 啟動時需要的初始數(shù)據(jù):例如配置文件 (init container)

? 啟動過程中產(chǎn)生的臨時數(shù)據(jù):該臨時數(shù)據(jù)需要多個容器間共享

? 啟動過程中產(chǎn)生的持久化數(shù)據(jù):例如MySQL的data目錄 (業(yè)務數(shù)據(jù)–很重要)

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

而容器中的文件在磁盤上是臨時存放的,這給容器中運行比較重要的應用程序帶來一些問題

問題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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

emptyDir.medium 字段用于控制 emptyDir 卷的存儲位置,有兩個值:MemoryDefault。

描述
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 概念

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

持久卷(PersistentVolume,PV):K8S在指定的存儲設備空間中邏輯劃分創(chuàng)建出來的可持久化的存儲資源對象。

持久卷聲明(PersistentVolumeClaim,PVC):對PV存儲資源對象的請求和綁定,也是Pod能夠掛載使用的一種存儲卷類型。

2.2 PV的生命周期和狀態(tài)

生命周期

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

#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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

kubectl get pvc

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

#訪問測試
firefox http://10.244.2.82

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

四、動態(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;

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、parametersreclaimPolicy 字段, 這些字段會在 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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

Step2 創(chuàng)建 Service Account

Service Account 用來管理 NFS Provisioner 在 k8s 集群中運行的權限,設置nfs-clientPVPVC、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 所需的權限。

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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 

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

補充:報錯解決方法
#由于 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
.....

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

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 

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

查看 NFS 服務器上是否生成對應的目錄

自動創(chuàng)建的 PV 會以 ${namespace}-${pvcName}-${pvName} 的目錄格式放到 NFS 服務器上。

ls /opt/test2

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

Pod測試

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

#進入Pod,創(chuàng)建測試文件
kubectl exec -it test-storageclass-pod sh

/ # cd /mnt/
/mnt # echo 'this is test file' > test.txt

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

#進入到目錄
cd /opt/test2/default-test-nfs-pvc-pvc-7a63142b-a4b4-4f07-966c-828ca60bbdcb

【云原生-Kubernetes篇】K8s的存儲卷/數(shù)據(jù)卷+PV與PVC,Kurbernetes入門到精通,云原生,kubernetes,容器,運維,服務器,云計算,你吃余嗎

五、小結

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • k8s ------存儲卷(PV、PVC)

    k8s ------存儲卷(PV、PVC)

    目錄 一:為什么需要存儲卷? 二:emptyDir存儲卷? ?三:hostPath存儲卷? 四:nfs共享存儲卷? ?五:PVC 和 PV 1、PVC 和 PV介紹 2、PV和PVC之間的相互作用遵循的生命周期 3、PV 的4 種狀態(tài) 4、一個PV從創(chuàng)建到銷毀的具體流程 六:靜態(tài)創(chuàng)建pv和pvc資源由pod運用過程 ?1、配置nfs存儲 ?

    2024年02月13日
    瀏覽(19)
  • k8s 存儲卷和pvc,pv

    k8s 存儲卷和pvc,pv

    存儲卷---數(shù)據(jù)卷 容器內(nèi)的目錄和宿主機的目錄進行掛載。 容器在系統(tǒng)上的生命周期是短暫的,deletek8s用控制器創(chuàng)建的pod,delete相當于重啟,容器的狀態(tài)也會回復到初始狀態(tài)。 一旦回到初始狀態(tài),所有的后天編輯的文件的都會消失。 容器容器和節(jié)點之間創(chuàng)建一個可以持久化保

    2024年01月16日
    瀏覽(23)
  • k8s pv pvc的介紹|動態(tài)存儲|靜態(tài)存儲

    k8s pv pvc的介紹|動態(tài)存儲|靜態(tài)存儲

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

    2024年02月06日
    瀏覽(21)
  • K8s---存儲卷(動態(tài)pv和pvc)

    K8s---存儲卷(動態(tài)pv和pvc)

    當我要發(fā)布pvc可以生成pv,還可以共享服務器上直接生成掛載目錄。pvc直接綁定pv。 1、卷插件:k8s本生支持的動態(tài)pv創(chuàng)建不包括nfs,需要聲明和安裝一個外部插件 Provisioner: 存儲分配器。動態(tài)創(chuàng)建pv,然后根據(jù)pvc的請求自動綁定和使用。 2、StorageClass:來定義pv的屬性,存儲類型

    2024年01月21日
    瀏覽(17)
  • k8s中的PV和PVC存儲介紹

    目錄 一.PV介紹 1.含義 2.關鍵配置參數(shù) 二.PVC介紹 1.含義 2.關鍵參數(shù)配置 三.PV和PVC的生命周期問題 1.PV的生命周期會有4個階段 2.用戶申請空間PV的周期流程 3.PV和PVC的使用/釋放/回收 四.案例演示 1.NFS配置 2.新建PV 3.新建PVC 4.新建Pod測試 5.模擬刪除Pod后后端目錄內(nèi)數(shù)據(jù)不會受影響

    2024年03月15日
    瀏覽(20)
  • K8S持久化存儲--- PVC和PV的存儲

    PersistentVolume ( PV )是群集中的一塊存儲,由管理員配置或使用存儲類動態(tài)配置。 它是集群中的資源,就像 pod 是 k8s 集群資源一樣。 PV是容量插件,如 Volumes ,其生命周期獨立于使用 PV 的任何單個 pod 。 PersistentVolumeClaim ( PVC )是一個持久化存儲卷,我們在創(chuàng)建 pod 時可以

    2023年04月10日
    瀏覽(19)
  • Kubernetes基礎(二十二)-K8S的PV/PVC/StorageClass詳解

    Kubernetes基礎(二十二)-K8S的PV/PVC/StorageClass詳解

    先來個 一句話總結 :PV、PVC是K8S用來做存儲管理的資源對象,它們讓存儲資源的使用變得 可控 ,從而保障系統(tǒng)的穩(wěn)定性、可靠性。StorageClass則是為了減少人工的工作量而去 自動化創(chuàng)建 PV的組件。所有Pod使用存儲只有一個原則: 先規(guī)劃 ?→? 后申請 ?→? 再使用 。 1.1 PV概念

    2024年02月20日
    瀏覽(28)
  • k8s篇-應用持久化存儲(PV和PVC)

    一般來說,容器一旦被刪除后,容器運行時內(nèi)部產(chǎn)生的所有文件數(shù)據(jù)也會被清理掉,因此,Docker提供了 Volume 這種方式來將數(shù)據(jù)持久化存儲。 可以說,Volume 是Pod與外部存儲設備進行數(shù)據(jù)傳遞的通道,也是Pod內(nèi)部容器間、Pod與Pod間、Pod與外部環(huán)境進行數(shù)據(jù)共享的方式。 實際上

    2023年04月08日
    瀏覽(14)
  • K8S臨時存儲-本地存儲-PV和PVC的使用-動態(tài)存儲(StorageClass)

    容器中的文件在磁盤上是臨時存放的,當容器崩潰或停止時容器上面的數(shù)據(jù)未保存, 因此在容器生命周期內(nèi)創(chuàng)建或修改的所有文件都將丟失。 在崩潰期間,kubelet 會以干凈的狀態(tài)重新啟動容器。 當多個容器在一個 Pod 中運行并且需要共享文件時,會出現(xiàn)另一個問題,跨所有容

    2024年04月16日
    瀏覽(22)
  • k8s pv與pvc

    k8s pv與pvc

    1.前言 PV 是 Kubernetes 集群中的一種資源對象,它代表著一塊物理存儲設備,例如磁盤、網(wǎng)絡存儲或云存儲等。PV 可以被多個 Pod 共享,并且可以獨立于 Pod 存在。PV 可以配置不同的訪問模式 (Access Modes),例如 ReadWriteOnce 、 ReadOnlyMany 或 ReadWriteMany ,以確定 PV 可以被多少個 Pod 同

    2024年01月21日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包