Kubernetes中的存儲卷配置管理方式
一、Volume 概述
在 Kubernetes 中,Volume 是一種可被 Pod 中的一個或多個容器訪問的共享目錄。Volume 與 Pod 的生命周期解耦,這意味著即使 Pod 被刪除,Volume 中的數(shù)據(jù)也不會丟失。Volume 可以用于持久化數(shù)據(jù)存儲、共享數(shù)據(jù)等場景。
二、Volume 的生命周期
Volume 的生命周期可以獨立于 Pod 的生命周期,這取決于 Volume 的類型:
- 非持久化 Volume(如 emptyDir):當(dāng) Pod 被刪除時,emptyDir 類型的 Volume 也會被刪除,其中的數(shù)據(jù)也會丟失。但是,如果 Pod 被重啟(容器在同一個 Pod 內(nèi)重新啟動),emptyDir 中的數(shù)據(jù)會保留。
- 持久化 Volume(如 PersistentVolumeClaim,PVC):即使 Pod 被刪除,如果使用了 PVC 并且關(guān)聯(lián)了 PV,那么 PV 不會被自動刪除(除非設(shè)置了相應(yīng)的回收策略)。因此,即使 Pod 被刪除,關(guān)聯(lián)的 PV 中的數(shù)據(jù)仍然存在,可以在新的 Pod 中通過 PVC 重新訪問這些數(shù)據(jù)。
Volume 的生命周期不會受到容器重啟的影響,這使得 Volume 成為持久化數(shù)據(jù)存儲的理想選擇。
三、支持的卷類型
Kubernetes 支持多種類型的 Volume,每種類型適用于不同的場景:
- emptyDir:在 Pod 被分配到節(jié)點時創(chuàng)建,只要 Pod 在該節(jié)點上運行,卷就存在。當(dāng) Pod 被從節(jié)點上刪除時,emptyDir 中的數(shù)據(jù)也會被永久刪除。
- hostPath:將宿主機上的文件或目錄掛載到 Pod 中。適用于需要訪問宿主機文件系統(tǒng)的場景。
- NFS:允許將現(xiàn)有的 NFS 服務(wù)器上的目錄掛載到 Kubernetes 中的 Pod 中。適用于需要在多個 Pod 之間共享數(shù)據(jù)的場景。
- PersistentVolumeClaim (PVC):用戶對持久存儲的請求,可以動態(tài)或靜態(tài)地綁定到 PersistentVolume (PV) 上。
四、每種卷類型的使用場景和示例
4.1 emptyDir 卷
使用場景:
- 臨時存儲,例如緩存或會話數(shù)據(jù)。
- 多個容器需要共享數(shù)據(jù)時。
示例:
創(chuàng)建一個使用 emptyDir 的 Pod:
apiVersion: v1 # 指定 Kubernetes API 的版本
kind: Pod # 定義資源類型為 Pod
metadata: # Pod 的元數(shù)據(jù)部分
name: test-pod # 為這個 Pod 指定一個名稱
spec: # Pod 的具體規(guī)格和配置
containers: # 定義 Pod 中的容器列表
- name: test-container # 為容器指定一個名稱
image: busybox # 指定容器使用的鏡像為 busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"] # 指定容器啟動后執(zhí)行的命令
volumeMounts: # 定義容器需要掛載的卷
- name: data-volume # 引用在 volumes 中定義的卷名稱
mountPath: /data # 指定容器內(nèi)部的掛載路徑
volumes: # 定義 Pod 可以使用的卷列表
- name: data-volume # 為卷指定一個名稱
emptyDir: {} # 使用 emptyDir 類型的卷,它將在 Pod 所在的節(jié)點上創(chuàng)建一個臨時目錄操作步驟:
保存上述 YAML 到 test-pod.yaml 文件。
應(yīng)用 YAML 文件創(chuàng)建 Pod:
kubectl apply -f test-pod.yaml
查看 Pod 的日志,驗證 emptyDir 是否工作:
kubectl logs test-pod
預(yù)期輸出:
Hello

4.2 hostPath 卷
使用場景:
需要訪問宿主機上的文件或目錄,例如日志文件、配置文件等。
示例:
創(chuàng)建一個使用 hostPath 的 Pod:
apiVersion: v1 # 指定 Kubernetes API 的版本
kind: Pod # 定義資源類型為 Pod
metadata: # Pod 的元數(shù)據(jù)
name: test-pod-hostpath # 為 Pod 指定一個名稱
spec: # Pod 的具體配置
containers: # 定義 Pod 中的容器列表
- name: test-container # 為容器指定一個名稱
image: busybox # 指定容器使用的鏡像
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"] # 指定容器啟動后執(zhí)行的命令
volumeMounts: # 定義容器需要掛載的卷
- name: data-volume # 引用在 volumes 中定義的卷名稱
mountPath: /data # 指定容器內(nèi)部的掛載入路徑
volumes: # 定義 Pod 級別的卷
- name: data-volume # 為卷指定一個名稱
hostPath: # 指定卷的類型為 hostPath
path: /data # 指定宿主機上的路徑,容器會將此路徑掛載到 mountPath 指定的位置
type: DirectoryOrCreate # 如果指定的路徑不存在,則創(chuàng)建目錄操作步驟:
保存上述 YAML 到 test-pod-hostpath.yaml 文件。
應(yīng)用 YAML 文件創(chuàng)建 Pod:
kubectl apply -f test-pod-hostpath.yaml
驗證宿主機上的 /data 目錄,查看是否創(chuàng)建了 hello 文件:
kubectl exec -it test-pod-hostpath -- /bin/sh cat /data/hello
預(yù)期輸出:
Hello

4.3 NFS 卷
使用場景:
- 需要在多個 Pod 之間共享數(shù)據(jù)。
- 數(shù)據(jù)需要持久化存儲。
示例:
假設(shè)您已經(jīng)有一個 NFS 服務(wù)器,其路徑為 /nfsdata。
創(chuàng)建一個使用 NFS 的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-nfs
spec:
containers:
- name: test-container
image: busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
nfs:
server: <NFS_SERVER_IP> # NFS 服務(wù)器 IP 地址
path: /nfsdata # NFS 服務(wù)器路徑操作步驟:
- 替換
<NFS_SERVER_IP>為實際的 NFS 服務(wù)器 IP 地址。 - 保存上述 YAML 到
test-pod-nfs.yaml文件。 - 應(yīng)用 YAML 文件創(chuàng)建 Pod:
kubectl apply -f test-pod-nfs.yaml
驗證 NFS 服務(wù)器上的 /nfsdata 目錄,查看是否創(chuàng)建了 hello 文件:
kubectl exec -it test-pod-nfs -- /bin/sh cat /data/hello
預(yù)期輸出:
Hello

4.4 PersistentVolumeClaim (PVC)
使用場景:
- 需要持久化存儲數(shù)據(jù)。
- 數(shù)據(jù)需要在多個 Pod 之間共享。
示例:
首先,創(chuàng)建一個 PersistentVolume (PV):
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-nfs
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
nfs:
path: /nfsdata
server: <NFS_SERVER_IP>操作步驟:
- 替換
<NFS_SERVER_IP>為實際的 NFS 服務(wù)器 IP 地址。 - 保存上述 YAML 到
pv-nfs.yaml文件。 - 應(yīng)用 YAML 文件創(chuàng)建 PV:
kubectl apply -f pv-nfs.yaml
接下來,創(chuàng)建一個 PersistentVolumeClaim (PVC):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
storageClassName: nfs
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi操作步驟:
- 保存上述 YAML 到
pvc-nfs.yaml文件。 - 應(yīng)用 YAML 文件創(chuàng)建 PVC:
kubectl apply -f vc-nfs.yaml
最后,創(chuàng)建一個使用 PVC 的 Pod:
apiVersion: v1
kind: Pod
metadata:
name: test-pod-pvc
spec:
containers:
- name: test-container
image: busybox
command: ["sh", "-c", "echo Hello > /data/hello && cat /data/hello && sleep 3600"]
volumeMounts:
- name: data-volume
mountPath: /data
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-nfs操作步驟:
- 保存上述 YAML 到
test-pod-pvc.yaml文件。 - 應(yīng)用 YAML 文件創(chuàng)建 Pod:
kubectl apply -f test-pod-pvc.yaml
- 驗證 NFS 服務(wù)器上的
/nfsdata目錄,查看是否創(chuàng)建了hello文件:
kubectl exec -it test-pod-pvc -- /bin/sh cat /data/hello
預(yù)期輸出:
Hello
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
刪除k8s環(huán)境過期鏡像&docker磁盤清理方式
文章介紹了如何清理Kubernetes環(huán)境中的過期鏡像和Docker磁盤空間,包括使用`docker system prune`命令和編寫腳本進行鏡像刪除2025-12-12
K8S內(nèi)部pod之間相互調(diào)用案例以及詳解
這篇文章主要給大家介紹了關(guān)于K8S內(nèi)部pod之間相互調(diào)用案例的相關(guān)資料,Pod是Kubernetes中最小的可部署單元,它是一個或多個容器的集合,它們共享網(wǎng)絡(luò)和存儲資源,并在同一節(jié)點上運行,需要的朋友可以參考下2023-08-08
K8S之StatefulSet有狀態(tài)服務(wù)詳解
本文主要介紹了K8S之StatefulSet有狀態(tài)服務(wù)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
K8s準(zhǔn)入控制Admission?Controller深入介紹
本篇我們將聚焦于?kube-apiserver?請求處理過程中一個很重要的部分?--?準(zhǔn)入控制器(Admission?Controller)深入講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04

