循序漸進PersistentVolumes與PersistentVolumeClaim

文章目錄

  • 靜態配置(Static Provisioning):
    • Persistent volume(PV)
      • Local 示例:
      • NFS 示例:
      • 檢查pv
      • PV 的常見狀態說明
      • Persistent volume claim(PVC)
        • 1. local PVC示例:
        • 2.NFS PVC示例:
        • 3. 檢查PVC:
    • 掛載靜態供應卷
      • 驗證靜態供應卷掛載:
        • 1. 查看 Deployment 和 Pod 狀態
        • 2. 進入容器內部驗證掛載目錄
  • 動態供應(Dynamic Provisioning)
    • StorageClasses:
      • 使用 Helm 安裝 NFS 動態存儲卷插件
        • 1. 添加存儲庫
        • 2. 安裝命令(請替換你的 NFS IP 和共享路徑):
        • 3. 檢查stogrageclass
        • 4 . storageclass參收說明:
    • 創建 PVC(動態)
    • 檢查PVC:
    • 動態掛載 PVC 到已部署 Pod
      • 添加 Volume
      • 添加 VolumeMount 到容器
      • 驗證掛載

靜態配置(Static Provisioning):

由集群管理員預先創建 PersistentVolume(PV),這些 PV 攜帶實際存儲的詳細信息,可供集群用戶使用。

Persistent volume(PV)

PersistentVolume(PV)是集群中的一種存儲資源,可由管理員預先配置,或通過 StorageClass 實現動態配置。
Kubernetes 原生支持多種 PersistentVolume(PV)類型,叫做 volume plugins。它們允許你指定不同的底層存儲方式,例如本地目錄、NFS、云存儲等。
實際開發/部署中最常見的內建類型:

類型適用場景說明
local本地快速測試或特殊需求需要設置 nodeAffinity
nfs簡單共享存儲,手動配置即可靜態配置,適合小規模共享
hostPath單節點開發環境使用不推薦用于生產
iscsi企業 SAN 接入配置復雜

Local 示例:

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: mnt-pv
spec:accessModes:- ReadWriteManycapacity:storage: 100MivolumeMode: Filesystemlocal:fsType: ext4path: /mntnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- k8sw01.lab.compersistentVolumeReclaimPolicy: Retain
EOF

檢查 persistent Volumes:

NFS 示例:

cat << EOF | kubectl -f -
apiVersion: v1
kind: PersistentVolume
metadata:name: static-nfs-pv
spec:accessModes:- ReadWriteManycapacity:storage: 100MivolumeMode: Filesystemnfs:server: 172.20.32.247path: /data/static-pvpersistentVolumeReclaimPolicy: Retain
EOF

檢查pv

kubectl get pv mnt-pv static-nfs-pv
NAME            CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
mnt-pv          100Mi      RWX            Retain           Available                          <unset>                          41m

kubectl get pv 輸出中的 STATUS 列顯示 PersistentVolume (PV) 當前的狀態。上面輸出顯示 Available ,是 PV 的一種狀態,表示它當前沒有被綁定(Bound)給任何 PersistentVolumeClaim (PVC)。

PV 的常見狀態說明

狀態說明
AvailablePV 目前未被任何 PVC 綁定,可以被新的 PVC 申請使用。
BoundPV 已經綁定到某個 PVC,正在被使用中。
ReleasedPV 原先被綁定的 PVC 已被刪除,但 PV 還未被回收或重新配置,可能還保留舊數據。
FailedPV 遇到錯誤或回收失敗,可能無法正常使用。

Persistent volume claim(PVC)

為已聲明的 PV 申請綁定:

1. local PVC示例:
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mnt-pvcnamespace: kubeuser
spec:accessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: FilesystemvolumeName: mnt-pv
EOF
2.NFS PVC示例:
cat << EOF | kubectl  apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: static-nfs-pvcnamespace: kubeuser
spec:accessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: FilesystemvolumeName: static-nfs-pv
EOF
3. 檢查PVC:
kubectl get pvc mnt-pvc static-nfs-pvc -n kubeuser
NAME             STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
mnt-pvc          Bound    mnt-pv          100Mi      RWX                           <unset>                 6m49s
static-nfs-pvc   Bound    static-nfs-pv   100Mi      RWX                           <unset>                 30s

掛載靜態供應卷

cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentnamespace: kubeuserlabels:app: nginx
spec:replicas: 1  # 啟動一個副本selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latest  # 使用官方 Nginx 鏡像ports:- containerPort: 80volumeMounts:- mountPath: /mnt/mnt-pvcname: mnt-pvc- mountPath: /mnt/static-nfs-pvcname: static-nfs-pvcvolumes:- name: mnt-pvcpersistentVolumeClaim:claimName: mnt-pvc- name: static-nfs-pvcpersistentVolumeClaim:claimName: static-nfs-pvc
EOF

驗證靜態供應卷掛載:

在成功部署 Nginx 應用并綁定靜態 NFS 卷后,我們可以通過以下步驟來驗證卷是否已經正確掛載到容器中。

1. 查看 Deployment 和 Pod 狀態

首先確認 nginx-deployment 已經成功運行,并且副本狀態正常:

kubectl get deploy nginx-deployment -n kubeuser -o wide

輸出結果類似如下,表示 Deployment 的 Pod 已就緒并運行中:

NAME               READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES         SELECTOR
nginx-deployment   1/1     1            1           4m4s   nginx        nginx:latest   app=nginx

接著查看 Pod 的具體名稱和狀態:

root@k8sm01:/home/kubeadmin/yaml/deployments# kubectl get pod -n kubeuser

輸出顯示:

NAME                               READY   STATUS    RESTARTS   AGE
nginx-deployment-f975675bc-ldgnk   1/1     Running   0          6m48s
2. 進入容器內部驗證掛載目錄

使用 kubectl exec 命令進入 Pod 的容器內部:

kubectl exec -it nginx-deployment-f975675bc-ldgnk -n kubeuser -- bash

進入容器后,可以查看主機名以確認所處環境:

hostname
nginx-deployment-f975675bc-ldgnk

接著檢查掛載目錄內容,例如掛載在 /mnt 下的子目錄:

ls -lh /mnt/
total 8.0K
drwxr-xr-x 2 root root 4.0K Apr 23  2024 mnt-pvc
drwxr-xr-x 2 root root 4.0K May 27 15:14 static-nfs-pvc

這說明 PVC 已被正確掛載進 Pod 的指定路徑中,Pod 可以直接讀寫對應的 NFS 共享目錄,實現持久化存儲。

動態供應(Dynamic Provisioning)

當沒有任何靜態 PersistentVolume 匹配某個 PersistentVolumeClaim 時,集群可能會嘗試為該 PVC 進行動態分配。
此過程基于 StorageClass 進行。要在 Kubernetes 集群中實現 動態存儲卷動態供給(Dynamic Provisioning),必須安裝一個 StorageClass 和一個 支持動態創建 Volume 的 Provisioner。

StorageClasses:

在 GCP、AWS、Azure 或其他云平臺上部署 Kubernetes 集群時,系統會預設創建一個默認的 StorageClass,該 StorageClass 使用標準類型的持久性磁盤。
運行 kubectl get storageclass 返回"No resources found"

kubectl get storageclass
No resources found

默認 Kubernetes 并不會自動安裝這些,所以需要自己配置。

使用 Helm 安裝 NFS 動態存儲卷插件

有關helm的安裝與使用,請參考這篇文章循序漸進掌握Helm

1. 添加存儲庫
helm repo add stable https://charts.helm.sh/stable
helm repo update
2. 安裝命令(請替換你的 NFS IP 和共享路徑):
helm install nfs-client nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \--namespace default \--set nfs.server=172.20.32.247 \--set nfs.path=/data/dynamic-pv \--set storageClass.defaultClass=true \--set storageClass.name=nfs-client
3. 檢查stogrageclass

運行 kubectl get storageclass:

 kubectl get storageclass

應該能看到:

NAME                   PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs-client (default)   cluster.local/nfs-client-nfs-subdir-external-provisioner   Delete          Immediate           true                   6m59s

storageclass yaml內容:

kubectl get storageclass  -o yaml
apiVersion: v1
items:
- allowVolumeExpansion: trueapiVersion: storage.k8s.io/v1kind: StorageClassmetadata:annotations:meta.helm.sh/release-name: nfs-clientmeta.helm.sh/release-namespace: defaultstorageclass.kubernetes.io/is-default-class: "true"creationTimestamp: "2025-05-28T14:48:18Z"labels:app: nfs-subdir-external-provisionerapp.kubernetes.io/managed-by: Helmchart: nfs-subdir-external-provisioner-4.0.18heritage: Helmrelease: nfs-clientname: nfs-clientresourceVersion: "1018780"uid: 5912911f-4993-4965-8e75-ba79fe2dca25parameters:archiveOnDelete: "true"provisioner: cluster.local/nfs-client-nfs-subdir-external-provisionerreclaimPolicy: DeletevolumeBindingMode: Immediate
4 . storageclass參收說明:
  • Provisioner(供給器):
    StorageClass 中包含一個 provisioner,用于指定創建 PV 時所使用的存儲插件(volume plugin)。

  • Reclaim Policy(回收策略):
    該策略決定當 PVC 被刪除后,PV 應該如何處理。可以設置為:
    Delete**:自動刪除相關存儲資源。
    Retain**:保留數據,需要手動清理。
    默認值為 Delete。

  • Volume Binding Mode(卷綁定模式):
    volumeBindingMode 字段用于控制卷綁定(volume binding)和動態供給(dynamic provisioning)發生的時機。
    Immediate(默認):立即分配卷。

  • Access Modes(訪問模式):
    PersistentVolume 支持以下訪問模式:
    ReadWriteOnce:卷可被單個節點以讀寫方式掛載。
    ReadOnlyMany:卷可被多個節點以只讀方式掛載。
    ReadWriteMany:卷可被多個節點以讀寫方式掛載

創建 PVC(動態)

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: dynamic-nfs-pvcnamespace: kubeuser
spec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 100MivolumeMode: Filesystem
EOF

檢查PVC:

可以看到剛剛創建的dynamic-nfs-pvc ,已經綁定storageclass:nfs-client,但status仍為pending狀態,如果綁定成功,PVC 狀態將變為 Bound,并關聯到系統自動創建的 PV。

 kubectl get pvc -n kubeuser
NAME              STATUS    VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Pending                                             nfs-client     <unset>                 3m6s
mnt-pvc           Bound     mnt-pv          100Mi      RWX                           <unset>                 23h
static-nfs-pvc    Bound     static-nfs-pv   100Mi      RWX                           <unset>                 23h

使用kubectl describe查看,將顯示此pvc的細節信息

 kubectl describe pvc dynamic-nfs-pvc -n kubeuser

輸出顯示仍然等待綁定

Events:Type    Reason                Age                  From                         Message----    ------                ----                 ----                         -------Normal  ExternalProvisioning  110s (x42 over 11m)  persistentvolume-controller  Waiting for a volume to be created either by the external provisioner 'cluster.local/nfs-client-nfs-subdir-external-provisioner' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.

動態掛載 PVC 到已部署 Pod

由于在靜態供應(Static Provisioning)中已經部署了示例deployment,我們將繼續使用這個deployment,并通過 kubectl patch 命令對已有 Deployment 添加動態 PVC:

 kubectl patch deployment nginx-deployment -n kubeuser -p '{"spec":{"template":{"spec":{"volumes":[{"name":"dynamic-nfs-pvc","persistentVolumeClaim":{"claimName":"dynamic-nfs-pvc"}}]}}}}'
deployment.apps/nginx-deployment patched

添加 Volume

 kubectl patch deployment nginx-deployment -n kubeuser -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","volumeMounts":[{"mountPath":"/mnt/dynamic-nfs-pvc","name":"dynamic-nfs-pvc"}]}]}}}}'

添加 VolumeMount 到容器

 kubectl get pvc -n kubeuser
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Bound    pvc-5179e3bb-831b-45f7-b0a0-96911e6b2b21   100Mi      RWX            nfs-client     <unset>                 22h
mnt-pvc           Bound    mnt-pv                                     100Mi      RWX                           <unset>                 45h
static-nfs-pvc    Bound    static-nfs-pv                              100Mi      RWX                           <unset>                 45h

驗證掛載

 get pvc dynamic-nfs-pvc -n kubeuser
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
dynamic-nfs-pvc   Bound    pvc-5179e3bb-831b-45f7-b0a0-96911e6b2b21   100Mi      RWX            nfs-client     <unset>                 23h

進入容器內部

 kubectl exec -it nginx-deployment-64699f648c-jlrl2 -n kubeuser -- bash

確認已經進入容器內部

hostname
nginx-deployment-64699f648c-jlrl2

輸出目錄中應包含:

 ls -lh /mnt
total 12K
drwxrwxrwx 2 root root 4.0K May 28 15:21 dynamic-nfs-pvc
drwxr-xr-x 2 root root 4.0K Apr 23  2024 mnt-pvc
drwxr-xr-x 2 root root 4.0K May 27 15:14 static-nfs-pvc

說明所有三種 PVC(local、static NFS、dynamic NFS)已成功掛載,Pod 可讀寫使用。

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

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

相關文章

【連接器專題】SD卡座規格書審查需要審哪些方面?

在審查SD卡座規格書時,我們需要考慮哪些方面? 首先在拿到一份SD卡座的詳細規格書時,一般供應商給到的規格書中包括了一些基礎信息、產品圖紙信息、技術參數信息,同時有些供應商會給出產品可靠性測試報告。因此我們會從這幾個要素去看規格書。 基礎信息 基礎信息一般會給變更…

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事項

投稿 IEEE Transactions on Knowledge and Data Engineering 注意事項 要IEEE overleaf 模板私信,我直接給我自己論文,便于編輯 已經投稿完成了,有一些小坑 準備工作 注冊IEEE賬戶:若沒有IEEE賬戶,需前往IEEE官網注冊。注冊成功后,可用于登錄投稿系統。現在新的系統,…

JS入門——三種輸入方式

JS入門——三種輸入方式 一、方式一&#xff1a;直接在警告框彈出(window可以省略) <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script><!-- 方式一直接在警告框彈…

WordPress免費網站模板下載

大背景圖免費wordpress建站模板 這個wordpress模板設計以簡約和專業為主題&#xff0c;旨在為用戶提供清晰、直觀的瀏覽體驗。以下是對其風格、布局和設計理念的詳細介紹&#xff1a; 風格 簡約現代&#xff1a;整體設計采用簡約風格&#xff0c;使用了大量的白色和灰色調&am…

AUTOSAR CP全新系統化培訓上線!從底層到應用,三步階梯,五大學習維度構建完整知識體系

AUTOSAR組織 AUTOSAR官方全新推出「AUTOSAR CP全棧賦能計劃」&#xff0c;從架構全景到模塊細節&#xff0c;自底向上、由淺入深&#xff0c;覆蓋MCAL至SWC全層級&#xff0c;融合通信、診斷、安全等六大核心Feature&#xff0c;帶您穿透復雜理論&#xff0c;直擊AUTOSAR開發本…

Java網絡編程與Socket安全權限詳解

Socket安全權限控制 Java通過java.net.SocketPermission類實現對網絡套接字訪問的細粒度控制。該權限管理機制通常在Java策略文件中配置,其標準授權語法格式如下: grant {permission java.net.SocketPermission"target", "actions"; };目標主機與端口規…

基于本地化大模型的智能編程助手全棧實踐:從模型部署到IDE深度集成學習心得

近年來&#xff0c;隨著ChatGPT、Copilot等AI編程工具的爆發式增長&#xff0c;開發者生產力獲得了前所未有的提升。然而&#xff0c;云服務的延遲、隱私顧慮及API調用成本促使我探索一種更自主可控的方案&#xff1a;基于開源大模型構建本地化智能編程助手。本文將分享我構建本…

視頻監控匯聚平臺EasyCVR安防小知識:如何通過視頻融合平臺解決信息孤島問題?

一、項目背景與需求分析? 隨著數字化技術發展與網絡帶寬升級&#xff0c;視頻技術應用場景不斷拓展&#xff0c;視頻監控、記錄儀等多樣化產品構建起龐大體系。但這些獨立系統彼此割裂&#xff0c;形成信息孤島。 在系統集成項目中&#xff0c;視頻系統深度融合已成必然趨勢…

如何在 Windows 和 Mac 上擦拭和清潔希捷外置硬盤

希捷外置硬盤廣泛用于存儲目的&#xff0c;但有時您可能出于多種目的需要擦除或清潔希捷外置硬盤&#xff0c;例如轉售、重復使用、捐贈等。為了釋放硬盤上的存儲空間或確保沒有人可以從硬盤中恢復您的信息&#xff0c;擦除硬盤是必要的步驟。無論您使用的是 Windows 還是 Mac&…

SAP saml2 元數據 HTTP 錯誤

使?事務 SAML2 或 SAML2_IDP 在 ABAP 系統中配置 SAML 2.0 時&#xff0c; Web 頁?返回 403 已禁?、 404 未找到 或 500 服務器內部錯誤。 在事務 SAML2 中下載元數據時&#xff0c; ?頁返回 403 已禁?、 404 未找到或 500 服務器內部錯誤。 在事務 SAML2_IDP 中下載…

powershell 中 invoke-expression 報錯解決

打開powershell就出現這個報錯&#xff1a; 網上搜了也沒有很好的解決辦法&#xff0c;抱著一點點期待&#xff0c;問了豆包 根據豆包的指示&#xff0c;在終端執行以下 幾個命令&#xff0c;報錯解決了&#xff08;開心萬歲&#xff09; # 移除多余的引號和空路徑 $pathArra…

簡單說一說Modern ABAP這個概念

Modern ABAP 是 SAP近些年來提出的一個概念&#xff0c;指的是在傳統 ABAP (Advanced Business Application Programming) 的基礎上&#xff0c;結合新技術和現代化編程理念進行改進和優化&#xff0c;旨在使 ABAP 更適應云計算、數據驅動業務以及開發效率提升的需求。 這一概…

kafka 常用知識點

文章目錄 前言kafka 常用知識點1. kafka 概念2. 消息共享和廣播3. 分區和副本數量奇偶數 前言 如果您覺得有用的話&#xff0c;記得給博主點個贊&#xff0c;評論&#xff0c;收藏一鍵三連啊&#xff0c;寫作不易啊^ _ ^。 ??而且聽說點贊的人每天的運氣都不會太差&#xff0…

5G RedCap是什么-與標準5G的區別及支持路由器推薦

技術背景與重要性 從智能穿戴到工業傳感器&#xff0c;物聯網設備種類繁多&#xff0c;但并非所有設備都需要標準5G的全部功能。為滿足這些中端應用的需求&#xff0c;3GPP在Release 17中引入了5G RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;也稱為5G NR-L…

C++構造函數與初始化全面指南:從基礎到高級實踐

C構造函數與初始化全面指南&#xff1a;從基礎到高級實踐 1. 構造函數基礎概念 構造函數是C中一種特殊的成員函數&#xff0c;它在創建類對象時自動調用&#xff0c;用于初始化對象的數據成員。構造函數的核心特點包括&#xff1a; 與類同名無返回類型&#xff08;連void都沒…

大模型長對話中上下文無法承載全部歷史,如何壓縮或提取重點

在人工智能技術迅猛發展的今天,大模型已經滲透到我們生活的方方面面,尤其是自然語言處理領域,簡直是掀起了一場革命。從智能客服到個人助手,從在線教育到心理咨詢,大模型驅動的對話系統正在以一種前所未有的方式改變我們與機器的互動模式。特別是那些能夠進行多輪對話、甚…

ubuntu20.04安裝教程(圖文詳解)

Ubuntu 24.04 LTS&#xff0c;代號 Noble Numbat&#xff0c;于 2024 年 4 月 25 日發布&#xff0c;現在可以從 Ubuntu 官方網站及其鏡像下載。此版本將在 2029 年 4 月之前接收為期五年的官方安全和維護更新。 關于 Ubuntu 24.04 LTS 的一些關鍵點&#xff1a; 發布日期&am…

數據結構之隊列:原理與應用

一、基本原理 隊列是一種特殊的線性表隊列是一個有序表(可以用數組或鏈表實現)遵循“先來先服務”的原則&#xff0c;它只允許在表的前端&#xff08;隊頭&#xff09;進行刪除操作&#xff0c;在表的后端&#xff08;隊尾&#xff09;進行插入操作 (一) 核心操作 入隊&…

Ubuntu 安裝 Miniconda 及配置國內鏡像源完整指南

目錄 Miniconda 安裝Conda 鏡像源配置Pip 鏡像源配置驗證配置基本使用常見問題 1. Miniconda 安裝 1.1 下載安裝腳本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh1.2 執行安裝 bash Miniconda3-latest-Linux-x86_64.sh按回車查看許可協議…

PYTHON通過VOSK實現離線聽寫支持WINDOWSLinux_X86架構

在當今人工智能快速發展的時代&#xff0c;語音識別技術已經成為人機交互的重要方式之一。本文將介紹如何使用Python結合Vosk和PyAudio庫實現一個離線語音識別系統&#xff0c;無需依賴網絡連接即可完成語音轉文字的功能。 技術棧概述 1. Vosk語音識別引擎 Vosk是一個開源的…