Kubernetes 存儲入門

目錄

Volume 的概念

Volume 的類型

通過 emptyDir 共享數據

編寫 emptyDir 的 Deployment 文件

部署該 Deployment

查看部署結果

登錄 Pod 中的第一個容器

登錄 Pod 中的第二個容器查看?/mnt?下的文件

刪除此 Pod

使用 HostPath 掛載宿主機文件

編寫 Deployment 文件,實現 HostPath 掛載

創建此 Pod

查看創建結果

測試掛載情況

刪除

掛載 NFS 至容器

安裝 NFS

設置共享目錄(在 NFS 服務器上)

開啟 nfs(在 NFS 服務器上)

編寫 Deployment 文件,掛載 NFS

部署此 Pod

查看部署結果

登錄容器查看掛載結果

PesistentVolume(PV,持久卷)

?PV 回收策略

PV 訪問策略

PV 的配置方式

基于 NFS 的 PV

(1) 提前安裝好 nfs 服務

(2) 創建一個基于 NFS 的 PV

備注

PersistentVolumeClaim(PVC,持久卷聲明)

PVC 的創建

(1) 為?hostpath?類型的 PV 創建 PVC

(2) 為 NFS 類型的 PV 創建 PVC

?PVC 的使用

(1)創建pod,綁定hostpath的PV

(2)創建pod。綁定NFS的PV

Volume 的概念

對于大多數的項目而言,數據文件的存儲是非常常見的需求,比如存儲用戶上傳的頭像、文件以及數據庫的數據。在 Kubernetes 中,由于應用的部署具有高度的可擴展性和編排能力(不像傳統架構部署在固定的位置),因此把數據存放在容器中是非常不可取的,這樣也無法保障數據的安全。

我們應該把有狀態的應用變成無狀態的應用,意思是指把數據從應用中剝離出來,把產生的數據文件或者緩存的信息都放在云端,比如常用的 NFS(生產環境中不建議使用,因為存在單點故障,推薦使用分布式的存儲或者公有云的 NAS 服務 )、Ceph、GlusterFS、Minio 等。

在傳統的架構中,如果要使用這些存儲,需要提前在宿主機掛載,然后程序才能訪問,在實際使用時,經常碰到新加節點忘記掛載存儲導致的一系列問題。而 Kubernetes 在設計之初就考慮了這些問題,并抽象出 Volume 的概念用于解決數據存儲的問題。

在容器中的磁盤文件是短暫的,當容器崩潰時,Kubectl 會重新啟動容器,但是容器運行時產生的數據文件都會丟失,之后容器會以干凈的狀態啟動。另外,當一個 Pod 運行多個容器時,各個容器可能需要共享一些文件,諸如此類的需求都可以使用 Volume 解決。

Docker 也有卷的概念,但是在 Docker 中,卷只是磁盤上或另一個容器中的目錄,其生命周期不受管理。雖然 Docker 已經提供了卷驅動程序,但是功能非常有限,例如從 Docker1.7 版本開始,每個容器只允許一個卷驅動程序,并且無法將一些特殊的參數傳遞給后端存儲。

另一方面,Kubernetes 卷具有明確的生命周期,與使用他的 Pod 相同,因此在 Kubernetes 中的卷可以比 Pod 中運行的任何容器的生命周期都長,并且可以在容器重啟或者銷毀之后保留數據。Kubernetes 支持多種類型的卷,并且 Pod 可以同時使用任意數量的卷。

從本質上講,和虛擬機或者物理機一樣,卷被掛載后,在容器中也只是一個目錄,可能包含一些數據,Pod 中的容器也可以對其進行增刪改查操作,使用方式和裸機掛載幾乎沒有區別。要使用卷也非常簡單,和其他參數類似,Pod 只需要通過.spec.volumes 字段指定為 Pod 提供的卷,然后在容器中配置塊,使用.spec.containers.volumeMounts 字段指定卷的掛載目錄即可。

Volume 的類型

在傳統架構中,企業內可能有自己的存儲平臺,比如 NFS、Ceph、GlusterFS、Minio 等。如果所在的環境在公有云,也可以使用公有云提供的 NAS、對象存儲等。在 Kubernetes 中,Volume 也支持配置這些存儲,用于掛載到 Pod 中實現數據的持久化。Kubernetes Volume 支持的卷的類型有很多。

以下為常見的卷:

  • CephFS
  • GlusterFS
  • iSCSI
  • Cinder
  • NFS
  • RBD
  • HostPath

當然也支持一些 Kubernetes 獨有的類型:

  • ConfigMap:用于存儲配置文件
  • Secret:用于存儲敏感數據
  • EmptyDir:用于一個 Pod 內多個容器的數據共享
  • PersistentVolumeClaim:對 PersistentVolume 的申請

通過 emptyDir 共享數據

emptyDir 是一個特殊的 Volume 類型,與上述 Volume 不同的是,如果刪除 Pod,EmptyDir 卷中的數據也將被刪除,所以一般 emptyDir 用于 Pod 中不同容器共享數據,比如一個 Pod 存在兩個容器 A 和容器 B,容器 A 需要使用容器 B 產生的數據,此時可以采用 emptyDir 共享數據,類似的使用如 Filebeat 收集容器內程序產生的日志。

使用 emptyDir 卷時,直接指定 emptyDir 為 {} 即可

編寫 emptyDir 的 Deployment 文件

[root@k8s-master ~]# cat <<EOF>nginx-empty.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginx01volumeMounts:- mountPath: /optname: share-volume- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginx02command:- sh- -c- sleep 3600volumeMounts:- mountPath: /mntname: share-volumevolumes:- name: share-volumeemptyDir: {}# medium: Memory 

備注:

  • volumeMounts 與 volumes 說明
    • volumeMounts:
      • mountPath: /mnt
      • name: share-volume?(# 容器定義部分的卷掛載名稱,此處名稱引用了?volumes?對應的名稱 )
    • volumes:
      • name: share-volume?(# 共享存儲卷的名稱 )

此案例會將?nginx01?中?/opt?中的數據,共享給?nginx02?中的?/mnt?目錄

此部署文件創建一個?Deployment,采用?spec.volume?字段配置了一個名字為?share - volume、類型為?emptyDir?的?volume,同時里面包含兩個容器?nginx01?和?nginx02,并將該?volume?掛載到了?/opt?和?/mnt?目錄下,此時?/opt?和?/mnt?目錄的數據就實現了共享。

默認情況下,emptyDir?支持節點上的任何介質,可使 SSD、磁盤或是網絡存儲,具體取決于自身環境。可以將?emptyDir.medium?字段設置為?Memory,讓?Kubernetes?使用?tmpfs(內存支持的文件系統 ),雖然?tmpfs?非常快,但是在節點重啟時,數據同樣會被清除,并且設置的大小會被記入?Container?的內存限制中。

部署該 Deployment

[root@k8s-master ~]# kubectl create -f nginx-empty.yaml

查看部署結果

[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-6ffffd7c7b-jrw7f   2/2     Running   0          10s

登錄 Pod 中的第一個容器

[root@k8s-master ~]# kubectl exec -ti nginx-6ffffd7c7b-jrw7f -c nginx01 -- sh

備注:

在該容器中的?/opt?下創建一個文件,并到第二個容器中查看,是否是共享的目錄

登錄 Pod 中的第二個容器查看?/mnt?下的文件

[root@k8s-master ~]# kubectl exec -ti nginx-6ffffd7c7b-jrw7f -c nginx02 -- sh

注意
登錄仿處后,此處可以使用?date?命令查看容器中的時間,會發現時間是不對的。是因為時區的問題,容器內使用的不是亞洲 / 上海市區。導致時間不對。

刪除此 Pod

[root@k8s-master ~]# kubectl delete -f nginx-empty.yaml

使用 HostPath 掛載宿主機文件

HostPath?卷可以將節點上的文件或目錄掛載到 Pod 上,用于實現 Pod 和宿主機之間的數據共享,常用的示例有掛載宿主機的時區至 Pod,或者將 Pod 的日志文件掛載到宿主機等。

編寫 Deployment 文件,實現 HostPath 掛載

以下為使用?HostPath?卷的示例,實現將主機的?/etc/localtime?文件掛載到 Pod 的?/etc/localtime

[root@k8s-master ~]# cat <<EOF>nginx-hostPath.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /etc/localtimename: timezone-timevolumes:- name: timezone-timehostPath:path: /etc/localtimetype: File
EOF

備注:
關于時區的設置是通過配置?/etc/localtime?文件設置系統的時區,/etc/localtime?用于配置系統時區(此文件是一個鏈接文件,鏈接自?/usr/share/zoneinfo/Asia/Shanghai?)。

創建此 Pod

[root@k8s-master ~]# kubectl create -f nginx-hostPath.yaml

查看創建結果

[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5c9b77966c-jrw7f   1/1     Running   0          47m

測試掛載情況

[root@k8s-master ~]# kubectl exec -ti nginx-5c9b77966c-jrw7f -c nginx -- sh
# date

在配置 HostPath 時,有一個 type 參數,用于表達不同的掛載類型,HostPath 卷常用的類型有:

  • type 為空字符串:默認選項,在掛載 HostPath 卷之前不會有任何檢查
  • DirectoryOrCreate:如果給定的 path 不存在任何東西,那么將根據需要創建一個權限為 0755 的空目錄,和 kublet 具有相同的組和權限
  • Directory:目錄必須存在于給定的路徑下
  • FileOrCreate:如果給定的路徑不存在任何內容,則會根據需要創建一個空文件,權限設置為 0644,和 kublet 具有相同的組和所有權
  • File:文件,必須存在于給定的路徑中
  • Socket:UNIX 套接字,必須存在于給定的路徑中
  • CharDevice:字符設備,必須存在于給定的路徑中
  • BlockDevice:塊設備,必須存在于給定的路徑中

刪除

[root@k8s-master ~]# kubectl delete -f nginx-hostPath.yaml

掛載 NFS 至容器

安裝 NFS

[root@k8s-master ~]# yum -y install nfs-utils

在所有的 Kubernetes 節點都要安裝

設置共享目錄(在 NFS 服務器上)

[root@k8s-master ~]# mkdir /opt/wwwroot
[root@k8s-master ~]# echo "This is my test file">/opt/wwwroot/index.html
[root@k8s-master ~]# vim /etc/exports
/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)

開啟 nfs(在 NFS 服務器上)

[root@k8s-master ~]# systemctl start nfs
[root@k8s-master ~]# systemctl start rpcbind

編寫 Deployment 文件,掛載 NFS

[root@k8s-master ~]# cat <<EOF>nginx-nfsVolume.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginxname: nginxnamespace: default
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: nfs-volumevolumes:- name: nfs-volumenfs:server: 192.168.10.101path: /opt/wwwroot
EOF

部署此 Pod

[root@k8s-master ~]# kubectl create -f nginx-nfsVolume.yaml

查看部署結果

[root@k8s-master ~]# kubectl get pod
NAME                     READY   STATUS    RESTARTS   AGE
nginx-fbd47c4c-izscp     1/1     Running   0          8m15s

登錄容器查看掛載結果

[root@k8s-master ~]# kubectl exec -ti nginx-fbd47c4c-izscp -c nginx -- bash

PesistentVolume(PV,持久卷)

雖然 volume 已經可以接入大部分存儲后端,但是實際使用時還有諸多的問題,比如:

  • 當某個數據卷不再被掛載使用時,里面的數據如何處理?
  • 如果想要實現只讀掛載,如何處理?
  • 如果想要只能有一個 Pod 掛載,如何處理?

如上所述,對于很多復雜的需求,volume 可能難以實現,并且無法對存儲的生命周期進行管理。另一個很大的問題是,在企業內使用 Kubernetes 的不僅僅是 Kubernetes 管理員,可能還有開發人員、測試人員以及科學業務的技術人員,對于 Kubernetes 的 volume 或者相關存儲平臺的配置步驟并不了解,所以無法自行完成存儲的配置。

為此,kubernetes 引入了兩個新的 API 資源:PersistentVolume(持久卷,簡稱 PV )和 PersistentVolumeClaim(持久卷聲明,簡稱 PVC )。

PV 是 kubernetes 管理員設置的存儲,PVC 是對 PV 的請求,標識需要什么類型的 PV。他們同樣是集群中的一類資源,但其生命周期則比較獨立。管理員可以單獨對 PV 進行增刪查改,不受 Pod 的影響,生命周期可能比掛載它的其他資源還要長。如果一個 kubernetes 集群的使用者并非只有 kubernetes 管理員,那么可以通過提前創建 PV,用以解決對存儲概念不是很了解的技術人員對存儲的需求。和單獨配置 volume 類似,PV 可以使用 NFS、CFS、CEPH 等常見的存儲后端,并且可以提供更為高級的配置,比如訪問模式、空間大小以及回收策略等。目前 PV 的提供方式有兩種:靜態或動態。靜態 PV 由管理員提前創建,動態 PV 無需提前創建。

?PV 回收策略

當用戶使用完卷時,可以從 API 中刪除 PVC 對象,從而允許回收資源。回收策略會告訴 PV 如何處理該卷。目前回收策略可以設置為 Retain、Recycle 和 Delete。靜態 PV 默認的為 Retain,動態 PV 默認 為 Delete。

  • Retain(保留):該策略允許手動回收資源,當刪除 PVC 時,PV 仍然存在,PV 中的數據也存在,volume 被視為已釋放,管理員可以手動回收卷。

  • Recycle(回收):如果 volume 插件支持,Recycle 策略會對卷執行?rm -rf?清理 PV,卷中的數據已經沒了,但卷還在,使其可用于下一個新的 PVC。但是本策略將會被棄用,目前只有 NFS 和 HostPath 支持該策略。

  • Delete(刪除):如果 volume 插件支持,刪除 PVC 時會同時刪除 PV,PV 中的數據自然也沒了。動態卷默認設為 Delete,目前支持 Delete 的存儲后端包括 AWS EBS、GCE PD、Azure Disk、OpenStack Cinder 等。

PV 訪問策略

在實際使用 PV 時,可能針對不同的應用會有不同的訪問策略,比如某類 Pod 可以讀寫,某類 Pod 只能讀,或者需限制是否可以被多個不同的 Pod 同時讀寫等,此時可以使用 PV 的訪問策略進行簡單控制,目前支持的訪問策略如下:

  • ReadWriteOnce:單路可讀寫,可以被單節點以讀寫模式掛載,命令行中可以被縮寫為 RWO。
  • ReadOnlyMany:多路只讀,可以被多節點以只讀模式掛載,命令行中可以被縮寫為 ROX。
  • ReadWriteMany:多路可讀寫,可以被多個節點以讀寫模式掛載,命令行中可以被縮寫為 RWX。
  • ReadWriteOncePod:單節點只讀(1.22+ ),只能被一個 Pod 以讀寫的模式掛載,命令行中可以被縮寫為 RWOP。

雖然 PV 在創建時可以指定不同的訪問策略,但是也需后端的存儲支持才行。比如一般情況下,大部分存儲是不支持 ReadWriteMany 的。

在企業內,可能有很多不同類型的存儲,比如 NFS、Ceph、GlusterFS 等,針對不同類型的后端存儲具有不同的配置方式,這也是對集群管理員的一種挑戰,因為集群管理員需要對每種存儲都要有所了解。

PV 的配置方式

[root@k8s-master ~]# cat <<EOF>hostpath-pv.yaml
kind: PersistentVolume
apiVersion: v1
metadata:name: mypv-hostpathlabels:type: local
spec:storageClassName: pv-hostpathcapacity:storage: 10GiaccessModes:- ReadWriteOncehostPath:path: "/mnt/data"
EOF

備注:

  • hostPath:宿主機的路徑,使用?hostPath?類型需要固定 Pod 所在的節點,防止 Pod 漂移造成數據丟失。
  • storageClassName?是一個用于標識?StorageClass?對象名稱的標簽。當你創建或配置?PersistentVolumeClaim(PVC )時,可以指定?storageClassName?來告訴?Kubernetes?你希望使用哪個?StorageClass?來配置存儲。
[root@k8s-master ~]# kubectl create -f hostpath-pv.yaml
[root@k8s-master ~]# kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mypv-hostpath   10Gi       RWO            Retain           Available           pv-hostpath             5s

基于 NFS 的 PV

(1) 提前安裝好 nfs 服務

可以使用上一個案例中安裝好的 NFS。
或重新安裝一臺,步驟如下:
提前安裝好 nfs 服務,192.168.10.101?是 nfs 服務器,也可以是任意一臺提供了 NFS 服務的主機。
客戶端需要在所有的 Kubernetes 節點安裝

# 客戶端安裝 nfs-utils
yum -y install nfs-utils# 創建共享目錄
mkdir /opt/wwwroot
# 寫入測試文件
echo "This is my test file">/opt/wwwroot/index.html
# 編輯 exports 文件配置共享規則
vim /etc/exports
/opt/wwwroot 192.168.10.0/24(rw,sync,no_root_squash)
systemctl start nfs
systemctl start rpcbind

(2) 創建一個基于 NFS 的 PV

PV 目前沒有 NameSpace 隔離,不需要指定命名空間,在任意命名空間下創建的 PV 均可以在其他 NameSpace 使用 。

[root@k8s-master ~]# cat <<EOF>nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: mypv-nfs
spec:capacity:storage: 5GivolumeMode: FilesystemaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: pv-nfsmountOptions:- hard- nfsvers=4.1nfs:path: /opt/wwwroot/server: 192.168.10.101
EOF

備注

  • capacity:容量配置
  • volumeMode:卷的模式,目前支持?Filesystem(文件系統)和?Block(塊),其中?Block?類型需要后端存儲支持,默認為文件系統。
  • accessModes:該 PV 的訪問模式
  • storageClassName:PV 的類,一個特定類型的 PV 只能綁定到特定類別的 PVC。
  • persistentVolumeReclaimPolicy:回收策略
  • mountOption:非必要,新版本中已經棄用
  • nfs:NFS 服務配置,包括以下兩個選項
    • path:NFS 上的共享目錄
    • server:NFS 的 IP 地址

創建 PV

[root@k8s-master ~]# kubectl create -f nfs-pv.yaml

查看PV創建結果

[root@k8s-master ~]# kubectl get pv
NAME          CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM        STORAGECLASS   REASON   AGE
mypv-hostpath   10Gi       RWO            Retain           Available   pv-hostpath   pv-hostpath             76s
mypv-nfs        5Gi        RWO            Recycle          Available   pv-nfs        pv-nfs                  4s

PersistentVolumeClaim(PVC,持久卷聲明)

當 kubernetes 管理員提前創建好了 PV,我們又應該如何使用它呢?

這里介紹 kubernetes 的另一個概念?PersistentVolumeClaim(簡稱 PVC )。PVC 是其他技術人員(如開發、測試)在 kubernetes 上對存儲的申請方式,可標明程序需要的后端存儲類型、空間大小、訪問模式等,類似 Pod 的 QoS(Pod 消耗節點資源,PVC 消耗 PV 資源;Pod 可請求特定級別的 CPU / 內存資源,PVC 可請求特定大小和訪問模式的 PV,比如申請 5G 大小、僅被一個 Pod 只讀訪問的存儲 )。

實際使用中,用戶通過 PVC 獲取存儲支持,可能需不同性質 PV(如 SSD 硬盤提升性能 )解決需求。集群管理員需依據存儲后端提供各類 PV,不僅區分大小和訪問模式,還能讓用戶無需了解卷的具體實現和存儲類型,解耦存儲細節,降低使用復雜度。

PVC 和 PV 綁定需滿足前提:accessModesstorageClassNamevolumeMode?需相同,且 PVC 的?storage?需小于等于 PV 的?storage?配置。

PVC 的創建

(1) 為?hostpath?類型的 PV 創建 PVC
?

[root@k8s-master ~]# vim pvc-hostpath.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mypvc-hostpath
spec:storageClassName: pv-hostpathaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi

注意:

storageClassName:存儲類名稱需要和對應的 PV 中的名稱一致,PV 和 PVC 進行綁定并非是名字相同,而是?StorageClassName?相同且其他參數一致才可以進行綁定。

[root@k8s-master ~]# kubectl create -f pvc-hostpath.yaml
[root@k8s-master ~]# kubectl get pvc
NAME            STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc-hostpath   Bound    mypv-hostpath   10Gi       RWO            pv-hostpath    4s

(2) 為 NFS 類型的 PV 創建 PVC

[root@k8s-master ~]# cat pvc-nfs.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: mypvc-nfs
spec:storageClassName: pv-nfsaccessModes:- ReadWriteOnceresources:requests:storage: 3Gi

注意:

storageClassName:存儲類名稱需要和對應的 PV 中的名稱一致

[root@k8s-master ~]# kubectl create -f pvc-nfs.yaml
[root@k8s-master ~]# kubectl get pvc
NAME            STATUS   VOLUME          CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mypvc-hostpath   Bound    mypv-hostpath   10Gi       RWO            pv-hostpath    3m21s
mypvc-nfs        Bound    mypv-nfs        5Gi        RWO            pv-nfs         5s

?PVC 的使用

已創建 PV 并通過 PVC 綁定,若讓程序使用存儲,需將 PVC 掛載到 Pod。和之前掛載方式類似,通過?volumes?字段配置,使用 PVC 掛載時,只需寫 PVC 名字,無需關心存儲細節。即使非 Kubernetes 管理員、不懂存儲的人員,也能簡單配置使用。比如將之前創建的?hostPath?類型 PVC 掛載到 Pod,只需配置一個?PersistentVolumeClaim?類型的?volumesclaimName?配置為 PVC 名稱即可。

(1)創建pod,綁定hostpath的PV

[root@k8s-master ~]# cat <<EOF>pvc-pv-pod-hostpath.yaml
kind: Pod
apiVersion: v1
metadata:name: hostpath-pv-pod
spec:volumes:- name: task-pv-storagepersistentVolumeClaim:claimName: mypvc-hostpathcontainers:- name: task-pv-containerimage: nginx:1.7.9ports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storage
EOF

備注:

claimName: mypvc-hostpath?是基于?hostpath?創建的 PVC 的名字

[root@k8s-master ~]# kubectl create -f pvc-pv-pod-hostpath.yaml
[root@k8s-master ~]# kubectl get pod -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
hostpath-pv-pod   1/1     Running   0          111s   10.244.85.204   k8s-node01   <none>           <none>
# 進入 Node 節點的 PV 對應宿主路徑
[root@k8s-node01 ~]# cd /mnt/data/
# 創建測試文件
[root@k8s-node01 data]# touch aaa.txt
# 進入 Pod 內部
[root@k8s-master ~]# kubectl exec -it hostpath-pv-pod -- bash
# 查看 PVC 掛載到 Pod 內的路徑內容
root@hostpath-pv-pod:/# ls /usr/share/nginx/html/
aaa.txt

(2)創建pod。綁定NFS的PV

[root@k8s-master ~]# cat <<EOF>pvc-pv-pod-nfs.yaml
kind: Pod
apiVersion: v1
metadata:name: pvc-nfs
spec:volumes:- name: pvc-nfs01persistentVolumeClaim:claimName: mypvc-nfscontainers:- name: task-pv-containerimage: nginx:1.7.9ports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: pvc-nfs01
EOF

備注:

claimName: mypvc-nfs?是基于 NFS 創建的 PVC 的名字

[root@k8s-master ~]# kubectl create -f pvc-pv-pod-nfs.yaml
[root@k8s-master ~]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
pvc-nfs   1/1     Running   0          4s
kubectl exec -it pvc-nfs -- bash
ls /usr/share/nginx/html/

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

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

相關文章

深入理解Redission釋放鎖過程

lock.unlock();調用unlock方法&#xff0c;往下追Override public void unlock() {try {// 1. 執行異步解鎖操作并同步等待結果// - 獲取當前線程ID作為鎖持有者標識// - unlockAsync()觸發Lua腳本執行實際解鎖// - get()方法阻塞直到異步操作完成get(unlockAsync(Thread.curre…

四、計算機組成原理——第4章:指令系統

目錄 4.1指令系統 4.1.1指令集體系結構 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定長操作碼指令格式 4.1.4擴展操作碼指令格式 4.1.5指令的操作類型 1.數據傳送 2.算術和邏輯運算 3.移位操作 4.轉移操作 …

RAG面試內容整理-檢索器與生成器的解耦架構

在RAG系統中,檢索器(Retriever)與生成器(Generator)的解耦架構是實現靈活高效的關鍵設計。所謂解耦,即將檢索相關文檔和生成答案兩個步驟分開,由不同的模塊或模型負責。這種架構帶來的直接好處是模塊獨立優化:我們可以針對檢索任務微調或更換檢索模型,而不必影響生成模…

【2026畢業論文鴻蒙系統畢設選題】最新穎的基于HarmonyOS鴻蒙畢業設計選題匯總易過的精品畢設項目分享(建議收藏)?

文章目錄前言最新畢設選題&#xff08;建議收藏起來&#xff09;最新穎的鴻蒙畢業設計選題匯總100套易過的精品畢設項目分享畢設作品推薦&#x1f447;&#x1f447;&#x1f447;文未可免費咨詢畢設相關問題&#xff0c;點贊留言可送系統源碼&#x1f447;&#x1f447;&#…

超全!Linux 面試 100 題精選解析:網絡篇|16 個 Linux 網絡排查與配置必考題詳解

網絡&#xff0c;是 Linux 系統的神經系統。 一臺服務器再強大&#xff0c;沒有網絡連接也如孤島。尤其在實際運維與面試場景中&#xff0c;“網絡相關的問題”是高頻重災區&#xff0c;比如&#xff1a; IP 配置錯亂&#xff0c;連不上公網DNS 無響應&#xff0c;域名解析失敗…

在 CentOS 上安裝 FFmpeg

在 CentOS 上安裝 FFmpeg 可以通過以下兩種推薦方法實現&#xff08;以 CentOS 7/8 為例&#xff09;&#xff1a; 方法一&#xff1a;通過 RPM Fusion 倉庫安裝&#xff08;推薦&#xff09; # 1. 安裝 EPEL 倉庫 sudo yum install epel-release# 2. 啟用 RPM Fusion 倉庫 # C…

數據結構——圖(一、圖的定義)

一、圖的定義1、什么是圖&#xff1f;圖G(V,E) 如圖&#xff0c;無向圖G頂點集V{,,...,}&#xff0c;用|V|表示圖G的頂點個數如&#xff1a;V{A,B,C,D} ,|V|4邊集E{(u,v)|uV, vV}&#xff0c; 用|E|表示圖G的邊的條數如&#xff1a;E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推導式與生成器表達式

Python 列表推導式與生成器表達式在 Python 中&#xff0c;列表推導式&#xff08;List Comprehension&#xff09;和生成器表達式&#xff08;Generator Expression&#xff09;是處理序列數據的高效工具。它們不僅能簡化代碼&#xff0c;還能提升數據處理的效率。本文將詳細介…

XCF32PVOG48C Xilinx Platform Flash PROM

XCF32PVOG48C 是 Xilinx 公司推出的一款高容量、低功耗的 Platform Flash PROM&#xff08;平臺閃存配置芯片&#xff09;&#xff0c;專為 Xilinx FPGA 和 CPLD 系列產品提供非易失性配置存儲支持。憑借其 32 Mbit 的大容量與出色的系統兼容性&#xff0c;該芯片成為中高端 FP…

重復文件清理工具,附免費鏈接

鏈接:https://pan.baidu.com/s/1s_Zx1eHp5Y-XnbbGldIgvw?pwdkjex 提取碼:kjex 復制這段內容后打開百度網盤手機App&#xff0c;操作更方便哦

【Spring Boot 快速入門】二、請求與響應

目錄請求響應請求Postman 工具簡單參數請求實體參數請求數組集合參數日期參數JSON 參數路徑參數響應請求響應 請求 Postman 工具 Postman 是一款功能強大的網頁調試與發送網頁 HTTP 請求的 Chrome 插件 作用&#xff1a;常用于進行接口測試 簡單參數請求 原始方式 在原始的…

高并發系統技術架構

&#xff08;點個贊&#xff0c;算法會給你推薦更多類似干貨 ~&#xff09; 口訣&#xff1a; CDN 扛靜態&#xff0c;WAF 防惡意&#xff1b;驗證碼攔機器&#xff1b; Nginx 先限流&#xff0c;Sentinel 再熔斷&#xff1b; Redis 扣庫存&#xff0c;MQ 異步寫&#xff1b; 對…

python任意模塊間采用全局字典來實現借用其他類對象的方法函數來完成任務或數據通信的功能

我們在編寫pthon代碼時&#xff0c;模塊間的數據通信主要采用以下幾種方法&#xff1a;1、采用全局變量。所有模塊都通過引用全局變量&#xff0c;通過本模塊對此全局變量數據的修改值&#xff0c;其他模塊也能訪問并得到此全局變量的當前值&#xff0c;由于全局變量的不可控性…

linux 部署 flink 1.15.1 并提交作業

下載 1.15.1 https://flink.apache.org/downloads.html#apache-flink-1151 部署模式分類 會話模式應用模式單作業模式 1、會話模式 先啟動一個集群&#xff0c;保持一個會話&#xff0c;然后通過客戶端提交作業&#xff0c;所有作業都在一個會話執行&#xff1b; 會話模式適合規…

Redis數據量過大的隱患:查詢會變慢嗎?如何避免?

一、Redis數據過多引發的五大隱患&#xff08;附系統交互圖&#xff09; #mermaid-svg-X83bpHUu830QXKUt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-X83bpHUu830QXKUt .error-icon{fill:#552222;}#mermaid-svg-…

網絡與信息安全有哪些崗位:(3)安全運維工程師

安全運維工程師是企業安全防線的 “日常守護者”&#xff0c;既要確保安全設備與系統的穩定運行&#xff0c;又要實時監控潛在威脅&#xff0c;快速響應并處置安全事件&#xff0c;是連接安全技術與業務運營的關鍵角色。其核心價值在于通過常態化運維&#xff0c;將安全風險控制…

魚皮項目簡易版 RPC 框架開發(三)

本文為筆者閱讀魚皮的項目 《簡易版 RPC 框架開發》的筆記&#xff0c;如果有時間可以直接去看原文&#xff0c; 1. 簡易版 RPC 框架開發 前面的內容可以筆者的前面兩個篇筆記 魚皮項目簡易版 RPC 框架開發&#xff08;一&#xff09; 魚皮項目簡易版 RPC 框架開發&#xff08;…

嵌入式Linux:注冊線程清理處理函數

在 Linux 多線程編程中&#xff0c;線程終止時可以執行特定的清理操作&#xff0c;通過注冊線程清理函數&#xff08;thread cleanup handler&#xff09;來實現。這類似于使用 atexit() 注冊進程終止處理函數。線程清理函數用于在線程退出時執行一些資源釋放或清理工作&#x…

【Git】Linux-ubuntu 22.04 初步認識 -> 安裝 -> 基礎操作

文章目錄Git 初識Git 安裝Linux-centosLinux-ubuntuWindowsGit 基本操作配置 Git認識工作區、暫存區、版本庫添加文件 -- 場景一查看 .git 文件添加文件 -- 場景二修改文件版本回退撤銷修改情況一&#xff1a;對于工作區的代碼&#xff0c;還沒有 add情況二&#xff1a;已經 ad…

輕量級音樂元數據編輯器Metadata Remote

簡介 什么是 Metadata Remote (mdrm) &#xff1f; Metadata Remote 是一個基于 Web 的音頻元數據編輯工具&#xff0c;旨在簡化在無頭服務器&#xff08;即沒有圖形用戶界面的服務器&#xff09;上編輯音頻文件的元數據。用戶只需使用 Docker 和瀏覽器&#xff0c;無需復雜的…